背景
昨天晚上整理了下幾個TCP內核的參數.
學習到了一點內核參數的影響.
但是因爲時間比較晚了沒有繼續鑽研與nginx的關係
今天想着繼續研究一下TCP的部分參數與nginx的關係
每個系統都不一樣. 結果可能跟內核版本和內核參數強相關.
我這裏用的是基於ARM的銀河麒麟
還有基於x86的OpenEuler
內核版本都比較高
測試機器信息
1. 域名站點
aarch64
銀河麒麟V10SP3
8c 64g
內核: 4.19.90-52.15.v2207.ky10.aarch64
2. 微服務方向代理節點
x86_64
OpenEuler 2203 LTS
16c 96g
內核: 5.10.0-60.18.0.50.oe2203.x86_64
測試點
1. keepalive對域名和應用服務器的影響.
2. 內核參數 ip_local_port_range 對nginx的response code 的影響
Nginx的keepalive的設置
Nginx最常用的是兩種模式:
1. Nginx作爲web服務器進行使用
是一個純粹的Server服務.只需要關注他與客戶端的連接就可以了.
2. Nginx作爲反向代理的實現
此時Nginx不僅是一個Server服務, 對於upstream的服務器還是
一個client.
基於如上兩個配置:
Nginx的keepalive 的設置也分爲兩個地方
一個是http時的keepalive設置
另外一個是 upstream 上面的keepalive的設置
Nginx的測試
http的keepalive的設置效果
Nginx的http配置節下面可以使用如下命令進行設置
keepalive_timeout 0;
單位是秒鐘, 設置爲0 表示禁用長連接.
進行測試:
注意每次測試都至少間隔 1min 保證上一次測試的 time_wait 都進行了釋放.
先禁用爲0
打開 界面:https://10.110.136.50/
查看TCP鏈接的情況:
[[email protected] nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:57491 TIME_WAIT - timewait (57.65/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:57492 TIME_WAIT - timewait (57.45/0/0)
# 發現只有兩個 time_wait的連接
打開登錄界面: https://10.110.136.50/login.html
# 至少會有 20個time_wait的連接.
# 如果是刷新 產生20個time_wait的連接, 如果是全新打開, 產生73個time_wait的連接.
# 數量太多就不在一一展示了.
Nginx的測試
修改爲: keepalive_timeout 10;
然後再次進行測試
注意需要重啓nginx 不要使用 -s reload的模式.
發現打開登錄:https://10.110.136.50/ 還有 https://10.110.136.50/login.html
都是兩個 established 的連接.
但是很快就變成了FIN_WAIT 然後TCP連接很快就消失了.
而且明顯感覺 10秒鐘最後就已經全部沒有了.
[[email protected] nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:59809 ESTABLISHED 2532685/nginx: work off (0.00/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:59810 ESTABLISHED 2532685/nginx: work off (0.00/0/0)
[[email protected] nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v 637 |grep -v 8848 |grep -v 1521 |grep -v tcp6 |grep -v :22 |grep 10.110.81.124
tcp 0 0 10.110.136.50:443 10.110.81.124:59809 FIN_WAIT2 - timewait (39.81/0/0)
tcp 0 0 10.110.136.50:443 10.110.81.124:59810 FIN_WAIT2 - timewait (39.59/0/0)
Upstream 的 keepalive 的測試
Upstream 不設置 keepalive的測試
域名層的nginx 會沒次刷新多一個 TIME_WAIT的連接.
[[email protected] nginx]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep -v 127.0.0.1 |grep 10.110.139.230
tcp 0 0 10.110.139.181:65176 10.110.139.230:5200 TIME_WAIT - timewait (58.09/0/0)
tcp 0 0 10.110.139.181:64752 10.110.139.230:5200 TIME_WAIT - timewait (55.55/0/0)
tcp 0 0 10.110.139.181:23646 10.110.139.230:5200 TIME_WAIT - timewait (42.51/0/0)
tcp 0 0 10.110.139.181:64984 10.110.139.230:5200 TIME_WAIT - timewait (56.86/0/0)
tcp 0 0 10.110.139.181:65142 10.110.139.230:5200 TIME_WAIT - timewait (57.37/0/0)
tcp 0 0 10.110.139.181:65374 10.110.139.230:5200 ESTABLISHED 2340/nginx: worker off (0.00/0/0)
第二層方向代理會產生更多的TIME_WAIT的連接
一次登錄和退出會生產非常多的time_wait的信息:
打開登錄界面 10個time_wait
登錄成功: 17個time_wait
退出登錄: 13個time_wait
[[email protected] ~]# netstat -anop |grep tcp |grep -v LISTEN |grep -v :637 |grep -v :884 |grep -v :1521 |grep -v tcp6 |grep -v :22 |grep 10.110.139.181
tcp 0 0 10.110.139.230:5200 10.110.139.181:28270 TIME_WAIT - timewait (43.00/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28502 TIME_WAIT - timewait (44.91/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26174 TIME_WAIT - timewait (57.03/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28506 TIME_WAIT - timewait (44.93/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28452 TIME_WAIT - timewait (44.71/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28478 TIME_WAIT - timewait (44.91/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26158 TIME_WAIT - timewait (57.02/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28440 TIME_WAIT - timewait (44.70/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28268 TIME_WAIT - timewait (42.99/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:51306 TIME_WAIT - timewait (36.06/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28514 TIME_WAIT - timewait (44.99/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28564 TIME_WAIT - timewait (45.20/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26148 TIME_WAIT - timewait (56.93/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:28466 TIME_WAIT - timewait (44.74/0/0)
tcp 0 0 10.110.139.230:5200 10.110.139.181:26186 TIME_WAIT - timewait (57.06/0/0)
Upstream 的 keepalive 的測試
在upstream裏面增加設置
keepalive 32;
並且在 location 裏面設置
proxy_http_version 1.1;
然後重啓nginx
需要注意的是:
在當前服務器只會看到一個 tcp 對中間層nginx的連接
但是中間nginx的連接
會產生 20個time-wait 的連接.
TCP內核的驗證
![image]()
TCP內核驗證出現502錯誤的過程
sysctl -w "net.ipv4.ip_local_port_range=6000 6001"
然後登錄nginx 所在的服務器
使用兩個客戶端打開 或者是打開具體個功能
F12會立即發現有很多的502 badgates 的提示信息.
也就驗證出 如果time_wait+eslabished 的連接數大於 ip_local_port_range
的範圍的話 有極大的概率出現 502的問題.
注意這個修改完之後 需要立即改回來 不然會出現嚴重的問題.