nginx基础
配置文件
server 虚拟主机, 根据 {listen, server_name}
的IP-port
或者domain-port
对来进行唯一性标识, 可以单项相同, 会匹配另一项转发
location + root, index指定主页等
配置静态页面结束
反向代理: server端请求转发
server {
listen 8001;
server_name any_name;
location / {
<!--truncate--> proxy_pass http://localhost:8088/;
}
}
这样的配置文件将8001的nginx请求转发到 http://localhost:8088/
处
这样简单的反代丢失了用户真实IP的信息(全变成nginx了)
使用proxy_set_header
追加header得到真实IP
server {
listen 8001;
server_name any_name;
location / {
proxy_set_header Host $http_host; # nginx主机IP加端口, $host nginx 主机IP
proxy_set_header X-Real-IP $remote_addr; # Client IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8088/;
}
}
非HTTP代理
- fastcgi_pass, scgi_pass (多用于PHP)
- uwsgi_pass (多用于python)
- memcached_pass 转发到memcached server
location可以使用正则等, 例如
location \.(css|js|png|jpg|gif|ico)
(这是一个静态文件示例)
可以模糊匹配
location ^~ /fonts/ # 所有请求路径以/fonts/开头的
动静分离的nginx反代示例
{
listen 8002;
server_name something.tomcat;
# 动态资源部分, 转发到tomcat服务器
location / {
proxy_set_header Host $http_host; # nginx主机IP加端口, $host nginx 主机IP
proxy_set_header X-Real-IP $remote_addr; # Client IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8088/;
}
# 静态资源部分, nginx提供比tomcat更好的性能
location \.(css|js|png|jpg|gif|ico){
root /home/www/static;
}
location = /html/ie.html {
root /home/www/static;
}
location = ^~ /fonts/ {
root /home/www/static;
}
}
缓冲与缓存
缓冲:异步网络, response从server交给nginx后就释放链接, 放在nginx的buffer里面, 使得连接的持续时间取决于nginx和server的网速而与复杂的client情况无关
nginx默认启用缓冲
缓存:响应缓存, response缓存在磁盘, 接受request先看缓存有没有, 减少发送给server请求数量
启用缓存:
http {
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
server {
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}
不单独拷贝静态资源的缓存策略
proxy_cache_path /data/nginx/cache keys_zone=static:100m
server {
# ...
location \.(css|js|png|jpg|gif|ico){
proxy_cache static;
# 配置缓存失效时间, 默认不失效
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8000;
}
}
一般动态内容缓存不放nginx, 放redis之类
负载均衡
upstream app {
server localhost:8000;
server localhost:8088;
}
server {
# ...
}
server {
# ...
}
upstream定义一个负载均衡的服务组
默认是轮询(round-robin)机制
upstream app {
least_conn; # 最小连接机制, 将下一个请求发给活动连接最少的server
server localhost:8000;
server localhost:8088;
}
upstream app {
ip_hash; # 保证了同一个ip的请求总是转发到相同 服务器
server localhost:8000;
server localhost:8088;
}
也可以加权重
upstream app {
server performance.server weight=3;
server app1.server; # 默认权重1
server app2.server;
}
健康检查
upstream app {
server example.com max_fails=3 fail_timeout=30s;
# 30s内失败超过三次, 将服务器标记为不可用30s
}
自定义hash
upstream app {
hash $request_uri consistent;
server localhost:8000;
server localhost:8088;
}
consistent 启用 ketama 一致哈希算法, 在添加或删除服务器时, 只会重新映射部分key, 最大成都减少缓存失效
https nginx完成https握手可以降低后端握手压力
server {
listen 443 ssl;
server_name name;
ssl_certificate /home/ssl/server.crt;
ssl_certificare /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5
# 如果有密码
ssl_password_file /home/ssl/cert.pass;
}
优化: ssl握手有不小开销,保持活动连接和重用ssl会话参数可以见底
nginx的session存在工作进程共享并有ssl_session_cache
配置的ssl缓存之中, 1M = 4000 Session, 默认5m超时, 可以使用ssl_session_timeout
增加
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
反代TCP也行, 例如mysql等
# http
http {
server {
# ...
}
}
# tcp
stream {
server {
# ...
}
}
stream {
upstream {
# ...
server any_server;
keepalive 8; # 连接池空闲连接的数量
}
}
转发和重定向:
转发是server端行为, 可以localhost; 重定向是client端行为, 需要给另一个服务器的ip/domain
nginx的 return
rewrite
重定向
将老域名的请求重定向到新域名
server {
listen 80;
listen 443 ssl;
server_name www.old.com old.com;
return 301 $scheme://www.new.com$request_uri;
}
rewrite用于正则替换请求URI的地址
例如用于视频等请求, 先替换, 再重定向
其他指令:
gzip 减少大小, 加大tcp开销
sendfile 消除文件传输的缓冲区开销, 直接写入
location /download {
sendfile on;
tcp_nopush on;
}
error_page指定错误页面
推荐写法:
-
重复的指令继承父级(提取公共项)
-
不要将所有请求代理到后端, 缓存/静态目录
-
使用
try_file
而不是if -f
-
保持重写规则简单干净
-
不要将root配置为
/
-
慎用chmod 777, 用
namei -om path
显示路径上的所有权限找问题