关于keepalive
有时我们需要用到nginx的 反向代理 (比如:跨域),此时需要“长连接”!其注意事项有两点:
- 从client到nginx的连接是长连接
- 从nginx到server的连接时长连接
默认情况下,nginx已经开启了对client的keepalive支持,但一些场景下,仍然需要我们手动调整参数重写一下:
http{
keepalive_timeout 超时值 响应header;
keepalive_request 数量值;
}
代码中:
- 超时值——keepalive客户端连接在服务器端保持开启的超时值(默认75s),值为0时,将禁用keepalive连接;
- 响应header——(可选)在响应的header域中设置一个值
Keep-Alive:timeout=time
; - 数量值——设置一个keepalive连接上可以服务的请求的最大数量(当达到值时,连接被关闭(默认值100))
保持和server的长连接
默认nginx访问后端都是短连接(也就是“典型的HTTP1.0”),为了让nginx和后端server之间保持长连接,可以如下配置:
http{
upstream BACKEND{
server 192.168.0.1:8080 weight=1 max_false=2 fail_timeout=30s;
server 192.168.0.2:8080 weight=1 max_false=2 fail_timeout=30s;
keepalive 300;
}
server{
listen 8080 default_server;
server_name:"";
location /{
proxy_pass http://BACKEND
proxy_set_header Host $Host;
proxy_set_header x-forwarded-for $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
add_header Cache-Control no-store;
add_header Pragma no-cache;
proxy_http_version 1.1; //很重要!
proxy_set_header Connection "";
}
}
}
代码中:
- (第17行)proxy_http_version 1.1; 最好写上,因为http长连接的支持是从1.1版本后才有的;
- upstream中的keepalive——此时不表示超时,也不是前面说的单次请求最大连接数(keepalive_request),而是设置upstream服务器的空闲keepalive连接的最大数量。
nginx官方上说:当这个数量被突破时,最近使用次数最少的链接将被关闭(译)
nginx配置HTTPS
server{
listen 80 default_server;
listen 443 ssl;
server_name cjxnsb.cn;
root /mxc/UCgzs;
index 1.html 2.html 3.html;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /usr/local/nginx/conf/server.pem;
ssl_certificate_key /usr/local/nginx/conf/server.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;
ssl_prefer_server_ciphers on;
...
}
第13行:ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;
是nginx的优化之一:删去效率低下的kEDH加密算法!
Nginx负载均衡
当一个域名指向多台web服务器,添加一台nginx负载均衡服务器,将客户端请求“平均”发送给每台web服务器,避免单台服务器因负载过高而其余服务器空闲而出现的损失
新建配置文件:
vi /etc/nginx/conf.d/test.conf
添加内容:
upstream test{ #有多个文件,此处配置多个(test——自定义名)
ip_hash;
server 192.168.0.1:80 weight=100;
server 192.168.0.2:80 weight=50;
}
server{
listen 80;
server_name cjxnsb.cn;
location /{
proxy_pass http://test;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- upstream:负载均衡配置项
- ip_hash:将同一客户端的所有请求发送给同一服务器(如不发送给同一服务器,有可能出现客户端刚登陆网站,点击其他子页面又提示登陆)
- server:web服务器地址
- proxy_pass:引用upstream定义的名称(如上面代码中的“test”)
upstream配置多个,则下面location /
前面要添加对应数量的location ~ 配置名
内部写法和location / 里异曲同工
然后,重载nginx配置:
nginx -t #一般都要先写这个——验证nginx配置更新
nginx -s reload #重载