问题描述
我有几台服务器 A,B,C,D,E ...其中A可以访问外网,其他不可以, 我用http_proxy方式, 通过A访问外网. 主要是访问合作方的接口,如http://api.xxx.com/get/user, 每秒大概有几百次.
这几天在看能否让A和合作方服务器(假设为Z)保持长连接, 经过修改测试, Z返回的header里面已经是 http/1.1 connection为keep-alive了, 但是socket的 Time-wait还是非常高, 另外A的日志里面, nginx 的 $connection 参数也总是在递增, 这是为什么呢?
下面是 A上的 proxy-pass 配置:
server{ resolver 10.10.2.118; listen 1080; error_log /var/log/nginx/proxy.error.log error; access_log /var/log/nginx/proxy.access.log proxy_access; location / { proxy_pass http://$host$request_uri; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection 'keep-alive'; proxy_http_version 1.1; proxy_ignore_client_abort on; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; allow 10.0.0.0/8; deny all; }}
是我配置的问题吗? 不懂网络, 胡搞瞎搞, 希望大神有知道的指点一下. 谢谢
问题解答
回答1:看到官博君,转了这个问题,就来帮你看看,也不知道你自己有没有已经解决了
首先说说你这个配置,不知道从哪儿看来的,配了一堆关于proxy的参数,就拿你这个proxy_pass来说吧,$host$request_uri就是指向你原来的地址,例如访问你的A机器(假设为10.0.0.100)的10.0.0.100/api/user,其中$host就是10.0.0.100,$request_uri就是/api/user,所以这里奇葩的事情发生了,访问A然后又代理到A,是不是已经崩溃了,有点儿困,我就不继续解释这种情况下到底会发生什么了,直接说下简单地解决办法----------------就决定是你了,upstream----------------这里设你需要访问的外网ip为123.123.123.123,
upstream backend { server 123.123.123.123; keepalive 10;}location / { proxy_pass http://$backend; proxy_http_version 1.1; proxy_ignore_client_abort on; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; allow 10.0.0.0/8; deny all;}
还有就是有些参数你不知道是啥意思,就不要加进去,不一定适合你的业务场景的这里着重解释一下upstream里面的这个keepalive参数我们知道,HTTP 1.1规范中,并没有像HTTP/2中的请求标示符,一条keepalive的TCP连接,一次只能发送一个http请求,直到该请求返回,才能发第二个,这也是为什么高性能webserver(如Tengine)为什么会有合并js等静态文件为一个的原因(省时,省连接啊)我这里为什么用10这个数字呢,假设一次请求外网主机并返回需要100ms,1s中单条TCP能完成10个请求,要想完成你的100次每秒的需求,所以需要是个长连接,大致的算法就是这样,实际情况下,你可以配置这个数目比算出来的值适当的大一些,稳定性可能会更好一点儿
有问题,留言
回答2:请问:如果此时backend服务器是动态的,如何利用upstream的keepalive来保证nginx和backend是长连接?谢谢!