Ich habe mehrere Server A, B, C, D, E ... Unter ihnen kann A auf das externe Netzwerk zugreifen, die anderen können jedoch nicht über A auf das externe Netzwerk zugreifen. Der Hauptzweck besteht darin Greifen Sie wahrscheinlich hunderte Male pro Sekunde auf die Schnittstelle des Partners zu, z. B. http://api.xxx.com/get/user.
In den letzten Tagen habe ich versucht herauszufinden, ob ich eine lange Verbindung zwischen A und dem Partnerserver (angenommen Z) aufrechterhalten kann. Nach der Änderung und dem Test zeigt der von Z zurückgegebene Header bereits, dass http/1.1 Die Verbindung bleibt bestehen, aber die Wartezeit des Sockets ist immer noch sehr hoch. Außerdem steigt der $connection-Parameter von Nginx ständig an
Das Folgende ist die Proxy-Pass-Konfiguration auf A:
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;
}
}
Ist es ein Problem mit meiner Konfiguration? Ich verstehe das Internet nicht und ich hoffe, jemand hat etwas Wissen und kann mir einen Rat geben
看到官博君,转了这个问题,就来帮你看看,也不知道你自己有没有已经解决了
首先说说你这个配置,不知道从哪儿看来的,配了一堆关于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里面的这个
keepalive
参数我们知道,HTTP 1.1规范中,并没有像HTTP/2中的请求标示符,一条keepalive的TCP连接,一次只能发送一个http请求,直到该请求返回,才能发第二个,这也是为什么高性能webserver(如Tengine)为什么会有合并js等静态文件为一个的原因(省时,省连接啊)
我这里为什么用10这个数字呢,假设一次请求外网主机并返回需要100ms,1s中单条TCP能完成10个请求,要想完成你的100次每秒的需求,所以需要是个长连接,大致的算法就是这样,实际情况下,你可以配置这个数目比算出来的值适当的大一些,稳定性可能会更好一点儿
有问题,留言
请问:如果此时backend服务器是动态的,如何利用upstream的keepalive来保证nginx和backend是长连接?谢谢!