NGINX配置Tips
反向代理(upstream servers)激活keepalive
默认情况下,NGINX会为 每个新进入请求 向upstream(backend)服务器发起一次新连接。这个特性时安全的,但是也是非常低效的,因为每建立一次连接NGINX和后端服务器之间必须交换三次数据包,而且断开连接也需要三到四个数据包。
对于高流量情况下,为每个请求打开一个新连接会很快耗尽系统资源,甚至导致无法打开连接。原因是:对于每个连接,原地址、源端口、目标地址和目标端口 四元组 必须唯一。对于从NGINX到上游服务器连接,其中三个元素时固定的,只有 源端口 作为变量。当连接关闭时,Linux套接字会处于 TIME-WAIT 状态 两分钟 ,这在搞流量情况下增加了耗尽可用源端口池的可能性。如果发生这种情况,NGINX就无法打开到上游服务器的新连接。
解决方法时启用NGINX和upstream server之间 keepalive : 请求完成后,连接不关闭,而是保持打开状态以用于其他请求。这既降低了源端口耗尽的可能性,又提高了性能。
在每个
upstream{}块中包含keepalive指令,以设置每个工作进程缓存中保存的与upstream server的空闲keepalive连接数keepalive指令不会限制NGINX工作进程可以打开的与upstream server的连接总数,所以,keepalive不需要设置得非常大建议将参数设置为
upstream{}块中列出服务器数量的 两倍 ,这足以让NGINX与所有服务器保持keepalive连接,有足够小,以便upstream sever也可以处理新的传入连接注意 在
upstream{}块中指定负载均衡算法时(使用hash/ip_hash/last_conn/least_time/random指令),则这些负载均衡算法指令 必须 出现在keepalive指令上方。这是NGINX配置中指令顺序无关紧要的一般规则中罕见例外之一。在将请求转发到 upstream server 组的
location{}块中,将以下指令与proxy_pass指令一起包含
proxy_http_version 1.1;
proxy_set_header "Connection" "";
我在配置 NGINX反向代理https 使用了这个配置( 详见 Nginx配置文件的include ):
/etc/nginx/include/proxy/proxy_set.conf proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Connection "";
注意,这里一定要设置 HTTP/1.1 ,因为当默认使用 HTTP/1.0 连接upstream server时,会将 Connection: close header添加到转发服务器请求中,这就会导致 upstream{} 块中的 keepalive 指令不生效,每个连接都会在请求完成时关闭:
proxy_http_version指令告诉NGINX使用HTTP/1.1proxy_set_header从Connectionheader中删除close值