Heim  >  Fragen und Antworten  >  Hauptteil

Problem mit der langen Nginx-Reverse-Proxy-Verbindung

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
PHP中文网PHP中文网2713 Tage vor746

Antworte allen(2)Ich werde antworten

  • 高洛峰

    高洛峰2017-05-16 17:26:38

    看到官博君,转了这个问题,就来帮你看看,也不知道你自己有没有已经解决了

    首先说说你这个配置,不知道从哪儿看来的,配了一堆关于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次每秒的需求,所以需要是个长连接,大致的算法就是这样,实际情况下,你可以配置这个数目比算出来的值适当的大一些,稳定性可能会更好一点儿

    有问题,留言

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:26:38

    请问:如果此时backend服务器是动态的,如何利用upstream的keepalive来保证nginx和backend是长连接?谢谢!

    Antwort
    0
  • StornierenAntwort