问题背景
当在nginx的location中增加以下配置
proxy_set_header X-Real-IP $remote_addr
proxy_set_header X-Inter-Real-IP $remote_addr
通过curl请求上游接口发现hearder头中Connection: [close]
因在不同的模块中(server,location)都配置了proxy_set_header,所以在 server 模块中设置的 header 被覆盖,导致 Nginx 与上游服务器的长连接变为了短连接,在高并发场景下上游服务出现大量 time_wait,tcp链接数疯长,资源得不到释放,导致上游服务器端口被耗尽。
正确的保长连接的配置http {
upstream backend {
server my-server:8080;
keepalive 128; # 每个工作进程的缓存上游服务器的最大空闲保持连接数
}
server {
listen 80;
server_name my.gateway.com;
proxy_http_version 1.1; # 设置http版本为1.1
proxy_set_header Connection ""; # 设置Connection为长连接,清理来自客户端的Connection**
location / {
proxy_pass http://backend;
}
}
}
加粗样式核心在于 proxy_http_vers