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.1
proxy_set_header
从Connection
header中删除close
值