一 、故障原因:
服務器突然出現大量time_wait(因為大量連接資源被佔用後不釋放的話,會導致網站正常訪問不能響應)。如何應對?
我這邊先檢查了監控和服務器當前的狀態(time_wait連接確實異常):
1、監控
![服務器出現大量TIME_WAIT解決方案](http://p2.ttnews.xyz/loading.gif)
2、登錄服務器檢查
![服務器出現大量TIME_WAIT解決方案](http://p2.ttnews.xyz/loading.gif)
二、排查思路:
1、猜測是否因為程序打開大量文件句柄,沒有關閉導致。(問了研發同事,排查過後沒有這種情況)
2、調大當前文件句柄
3、調優sysctl.conf文件
4、檢查nginx連接情況
三、解決方法:
1、操作系統文件句柄之前已經調整過。
echo "ulimit -SHn 66536" >>/etc/rc.local
2、調優/etc/sysctl.conf
<code>net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse=1 #讓TIME_WAIT狀態可以重用,這樣即使TIME_WAIT佔滿了所有端口,也不會拒絕新的請求造成障礙 默認是0
net.ipv4.tcp_tw_recycle=1 #讓TIME_WAIT儘快回收 默認0
net.ipv4.tcp_fin_timeout=30
sysctl -p/<code>
3、調整nginx 配置文件(最優方法)
<code>upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}/<code>
總結:
由於nginx 在反向代理http協議的時候,默認採用的http1.0.
HTTP1.0的特點:不支持長連接(http keep-alive).CLOSE通知後端服務器主動關閉連接。會導致任何一個客戶端的請求都在後端服務器上產生了一個TIME-WAIT狀態連接
HTTP1.1的特點:支持長連接。
關鍵配置參數:keep-alive 16; proxy_http_vesion 1.1; proxy_set_header Connection "";
閱讀更多 Linux運維技術之路 的文章