搜尋

首頁  >  問答  >  主體

Nginx反向代理長連線問題

我有幾台伺服器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;
  }
}

是我配置的問題嗎? 不懂網路, 胡搞瞎搞, 希望大神有知道的指點一下. 謝謝

PHP中文网PHP中文网2791 天前803

全部回覆(2)我來回復

  • 高洛峰

    高洛峰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次每秒的需求,所以需要是個長連接,大致的演算法就是這樣,實際情況下,你可以配置這個數目比算出來的值適當的大一些,穩定性可能會更好一點兒

    有問題,留言

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:26:38

    請問:如果此時backend伺服器是動態的,如何利用upstream的keepalive來保證nginx和backend是長連線?謝謝!

    回覆
    0
  • 取消回覆