我有幾台伺服器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;
}
}
是我配置的問題嗎? 不懂網路, 胡搞瞎搞, 希望大神有知道的指點一下. 謝謝
看到官博君,轉了這個問題,就來幫你看看,也不知道你自己有沒有已經解決了
先說說你這個配置,不知道從哪裡看來的,配了一堆關於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是長連線?謝謝!