Nginx反向代理長連線問題
PHP中文网
PHP中文网 2017-05-16 17:24:38
0
2
775

我有幾台伺服器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中文网

认证0级讲师

全部回覆(2)
小葫芦

看到官博君,轉了這個問題,就來幫你看看,也不知道你自己有沒有已經解決了

先說說你這個配置,不知道從哪裡看來的,配了一堆關於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次每秒的需求,所以需要是個長連接,大致的演算法就是這樣,實際情況下,你可以配置這個數目比算出來的值適當的大一些,穩定性可能會更好一點兒

有問題,留言

phpcn_u1582

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板