1. 程式人生 > >Nginx做前端Proxy時TIME_WAIT過多的問題

Nginx做前端Proxy時TIME_WAIT過多的問題

今天線上遇到了TIME_WAIT過多的報警。檢視TIME_WAIT埠發現,大部分是來自我們的管理後臺Web請求,其他服務基本正常。而這部分請求正好是經過Nginx代理的。所以猜想Nginx的代理導致了這一現象。經過Google得知Nginx作為Proxy確實存在此問題。轉載下文,分析得很好我就不再羅嗦了,感謝作者。

原文地址:http://www.cnblogs.com/QLeelulu/p/3601499.html

我們的DSP系統目前基本非凌晨時段的QPS都在10W以上,我們使用Golang來處理這些HTTP請求,Web伺服器的前端用Nginx來做負載均衡,通過Nginx的proxy_pass來與Golang互動。

由於nginx代理使用了短連結的方式和後端互動的原因,使得系統TIME_WAIT的tcp連線很多:

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 250263
CLOSE_WAIT 57
FIN_WAIT2 3
ESTABLISHED 2463
SYN_RECV 8

ss 比 netstat 要快,所以也可以用下面的命令來檢視:

shell> ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}
'

這會佔用系統過多的埠,還浪費了系統資源,所以我們必須想辦法減少TIME_WAIT。

TIME_WAIT導致佔用過多埠的一個影響是會佔用我們需要使用到的埠,例如我們有個服務監聽的埠為8012,重啟的時候經常會提示埠被佔用。
通過檢視/proc/sys/net/ipv4/ip_local_port_range可以知道設定的Linux核心自動分配埠的埠範圍:

shell> cat /proc/sys/net/ipv4/ip_local_port_range
1025 65535

對於這個設定系統就會從1025~65535這個範圍內隨機分配埠來用於連線,而我們服務的8012埠剛好在這個範圍之內,所以如果8012剛好被系統分配出去使用了,則啟動我們服務的時候,就會提示埠被佔用。

所以我們需要設定/proc/sys/net/ipv4/ip_local_reserved_ports來告訴系統給我們預留哪些埠,不可以用於自動分配。

shell> vim /etc/sysctl.conf
net.ipv4.ip_local_reserved_ports = 8012,11211-11220

shell> sysctl -p

關於預留埠的更具體資訊可以參考:

上面我們解決了端口占用問題,但是我們還是需要解決TIME_WAIT過多的問題。
Nginx 1.1以上版本的upstream已經支援keep-alive的,所以我們可以開啟Nginx proxy的keep-alive來減少tcp連線:

複製程式碼
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 "";
        ...
    }
}
複製程式碼

開了keep-alive之後,TIME_WAIT明顯減少:

複製程式碼
shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 12612
CLOSE_WAIT 11
FIN_WAIT1 4
FIN_WAIT2 1
ESTABLISHED 7667
SYN_RECV 3
複製程式碼

另外不少文章提到可以修改系統的/etc/sysctl.conf配置來減少TIME_WAIT的tcp連線:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

不過開啟tcp_tw_recycle可能會帶來一些不穩定的網路問題,請參考:


相關推薦

Nginx前端ProxyTIME_WAIT過多的問題

今天線上遇到了TIME_WAIT過多的報警。檢視TIME_WAIT埠發現,大部分是來自我們的管理後臺Web請求,其他服務基本正常。而這部分請求正好是經過Nginx代理的。所以猜想Nginx的代理導致了這一現象。經過Google得知Nginx作為Proxy確實存在此問題。轉載

Nginx負載均衡session共享問題詳解

壓縮 多臺 nts 獲得 hash 常見 hub img font 用nginx做負載均衡時,同一個IP訪問同一個頁面會被分配到不同的服務器上,如果session不同步的話,就會出現很多問題,比如說最常見的登錄狀態。 再者Nginx連接Memcached集群時,Nignx的

nginx靜態代理css載入不出問題解決

有次專案中用到了前後端分離,nginx做了前端的靜態代理。當配置nginx後,訪問頁面時出現了以下的bug css檔案實際上已經被加載出來了,但是頁面卻沒有顯示效果。報錯是這樣的: Resource interpreted as Stylesheet but transfer

Nginx前端,Apache後端的配置例項

Nginx做前端,Apache做後端的配置例項,供大家學習參考。 Nginx做前端處理靜態檔案,Apache做後端伺服器。 一、基礎知識 1.1、反向代理過程 Nginx前端,Apache後端過程其實很簡單,首先使用者訪問的是80埠的nginx,然後nginx將靜態內容留給自己,其餘的轉發給非80

nginx反向代理,配置其讓tomcat的日誌獲取客戶端ip

在nginx的配置檔案nginx.conf中配置,加上proxy_set_header X-real-IP $remote_addr。 server { listen 80; server_nam

(轉)nginx轉發,帶'_'的header內容丟失

做了 scores 就是 use version 完成 所在 解決 sco 原本在測試環境測試通過的APP,今天準備切到線上環境做最後測試,結果發現了錯誤。查看日誌發現是APP端發送的http請求中的header內容丟失了。那麽代碼沒有改動,怎麽平白無故會丟失頭信息? 於是

Nginx+Tomcat負載均衡一臺伺服器宕機實現自動切換

思路:有兩種方式。 第一種:設定一臺伺服器為備機,只有當訪問的伺服器異常時才會訪問它; 第二種:設定伺服器轉發請求超時時間。 一、設定備機: 在安裝目錄下(例E:\nginx-1.14.0\conf)開啟nginx.conf修改 upstream netitcast.com {

最近網頁前端專案遇到的一些問題以及解決方案

這幾天和同學一起接了老師佈置的兩個網頁專案,雖然只做前端靜態頁面,但是真正實踐的時候我發現有些東西還是要用一用,出點錯才能記得解決方案。 第一個:設定寬屏效果 當我們需要頂部的banner橫向充滿整個螢幕以顯示寬屏效果時 我們會把這個banner的width

nginxTIME_WAIT過多或者CLOSE_WAIT過多的狀態

1 起因 線上伺服器nginx日誌執行一段時間後,會報如下錯誤: 1024 worker_connections are not enough 一般做法是修改worker_connections。 但實際上:該服務是用於時間比較短的連線裡,並且一

前端開發自己樁資料(假資料)

Deprecated: 已使用第三方mock-server,此DIY的方式就不用了,算作是一次學習吧。 某些功能開發時(以及後續維護時)嚴重依賴api返回的資料。不但要求資料呈現某特定狀態,特別是當前開發功能要修改資料時,費勁巴拉弄好的資料,點一下按鈕,就耗光了。還得

jquery使用CORS跨域請求(前後端分離通過nginx部署前端),cookie丟失問題

1. 我遇到的問題專案通過前後端分離模式開發,部署時:前端獨立部署在nginx上,登入成功後會往使用者地址上寫入cookie資訊,前端呼叫後臺地址時通過在nginx中配置location,後臺介面系統中有攔截器會攔截判斷前端頁面是否攜帶cookie資訊過來:此時發現出現coo

nginx轉發,帶'_'的header內容丟失

今天在線上切換系統時,發現後端微服務報錯,說xx header的數值為空,也就是沒有傳。檢視browser資訊,發現前端頁面系統發出時是帶了這個header (user_id)的。也是就header user_id達到後端微服務時沒有了。那麼程式碼沒有改動,怎麼平白無故會丟失

nginx負載均衡 tomcat獲得客戶端真實ip

需要 項目 參考 real nginx代理 x-real-ip 發現 百度 通過 因項目需要做tomcat2臺機器的負載均衡,配置好負載環境後,發現tomcat的日誌一律是我前置nginx代理服務器的ip 通過百度教材發現需要修改nginx的配置文件,修改代理頭信息,傳遞

前端靜態頁面可以用到的一些屬性

自身 設置 頁面 邊框陰影 邊框 borde color 外邊距 圓角 border-radius 邊框圓角 像素和百分比 box-shadow 邊框陰影 b

web前端進行

結束 css 原因 沒有 前端 感覺 告訴 這就是我 body 學習前端已經兩周了,上了7天的視頻課,三天的HTML和css,視頻課記筆記還好,後面的其實有點跟不上的,每天都要預習第二天要講的課,不然到後來聲明都不懂。 HTMl的學習: 文本例子: <html>

windows平臺下利用Nginx負載均衡

htm oot 部署 top proxy rec cnblogs access cast 1.下載nginx(http://nginx.org/en/download.html)安裝包,解壓,並使用cmd命令轉到nginx.exe所在的目錄 2.執行cmd命令start n

Linux 下 tomcat基於nginx負載均衡

tomcat 負載 測試目的:在一臺裝有nginx服務器上訪問nginx這臺的ip地址,刷新一次就會顯示後端三臺不同的tomcat服務器的測試頁。測試環境:三臺centos 6.8 一臺 centos 7.3軟件版本: nginx 1.12.1

Nginx JavaWeb負載均衡

alt ram php 應用 編譯 ice end 不同 roo 隨著用戶量的增大,單臺服務器已經滿足不了用戶的需求。 準備工作:安裝 gcc、pcre-devel、zlib、OpenSSL 一下是在線 離線請戳這裏 gcc 安裝安裝 nginx 需要先將官網下載的源碼

服務器使用nginx代理,通過HttpServletRequest獲取請求用戶真實IP地址

-1 servle int _for nbsp real ati servlet ddr 首先,在nginx配置中添加如下配置 server { listen 80; server_name www.wenki.info; #要訪問的域

Keepalived+Nginx實現前端負載均衡的高可用

keepalived+nginx實現前端負載均衡的高可用一、實驗前準備時間同步、關閉iptables+selinux、各主機能相互解析在192.168.0.101和192.168.0.102上安裝Keepalived和Nginx,通過Nginx負載均衡至192.168.0.103及192.168.0.104上