如何監控 Nginx?
什么是 Nginx?
Nginx ("engine-x")是一個 HTTP 和反向代理服務器,同時也是一個郵件代理服務器和通用的 TCP 代理服務器。作為一個免費開源的服務器,Nginx 具有高性能、穩定和較低的資源占用的特點。它擁有豐富的特征集,同時配置也很簡單。
Nginx 是少數幾個可以解決 C10K 問題的服務器之一。不同于傳統服務器,它使用可擴展的時間驅動(異步)架構替代線程來處理請求。尤為重要的是,該架構占用負載下的內存小,且可預測。即便不需要同時處理數千的網絡請求,你仍然能從Nginx 的高性能和低內存占用中受益。從最小的VPS到大型集群服務器,Nginx 都能適用。
Nginx 還有一個商業版 Nginx Plus ,功能更加豐富。
監控 Nginx 的參數
Nginx 提供哪些監控參數
下表是 Nginx 提供的監控參數及其簡單釋義。
參數名稱 | 參數描述 |
---|---|
Active connections | 當前活躍的用戶連接(包含Waiting狀態) |
accepts | 接收到的用戶連接總數 |
handled | Nginx處理的用戶連接總數 |
requests | 用戶請求總數 |
Reading | 當前連接中Nginx讀取請求首部的個數 |
Writing | 當前連接中Nginx寫返回給用戶的個數 |
Waiting | 當前沒有請求的活躍用戶連接數 |
通過下面的圖,可以清晰的看到參數的具體意義和作用。
當用戶請求連接Nginx服務器時,accepts計數器會加一。且當服務器處理該連接請求時,handled計數器同樣會加一。一般而言,兩者的值是相等的,除非達到了某些資源極限(如worker_connection的限制)。
用戶連接請求被處理,就會進入 active 狀態。如果該連接沒有其他 request,則進入 waiting 的子狀態;如果有 request,nginx 會讀取 request 的 header,計數器 request 加一,進入 reading 的子狀態。 reading 狀態持續時間非常短,header 被讀取后就會進入 writing 狀態。事實上,直到服務器將響應結果返回給用戶之前,該連接會一直保持 writing 狀態。所以說,writing 狀態一般會被長時間占用。
Nginx提供哪些監控參數
下表是Nginx Plus提供的主要監控參數、說明以及和Nginx的差異。
參數名稱 | 參數描述 | 與Nginx差異 |
---|---|---|
Active | 當前活躍的用戶連接(不包含 Idel 狀態) | 等同 Active connections |
Accepted | 接收到的用戶連接總數 | 等同 accepts |
Dropped | Nginx 丟棄的用戶連接總數 | accepts - handled |
Idle | 當前沒有請求的活躍用戶連接數 | 等同 Waiting |
Total | 用戶請求總數 | 等同 requests |
Current(Requests) | 當前有請求的活躍用戶連接數(等同 Active) | Reading + Writing |
Current(Connections) | 當前在線用戶數(Active + Idle) | Reading + Writing + Waiting |
主要參數和開源的Nginx相比較,區別不大。主要就是換了名字,以及通過加減法的參數整合。同樣,通過下面的圖也能看清這些參數的作用。
具體運作和Nginx并無不同,故不贅述。當然,作為商業版,它提供的參數還有很多,可以在 這里 看。
怎么利用這些參數
開源的 Nginx 提供的原始參數中,實時性的會比較有用,如 Active connections、Reading、Writing 以及 Waiting。這些數據能夠反映當前 Nginx 的負載情況,方便在服務器出現問題時及時發現問題。而另一些數據由于不是狀態量,Nginx 無法計算當前的量值而改做其統計數,如 accepts、handled 和 requests。
對于維護網站人員,accepts、handled 和 requests 的統計值用處是不大的,值得參考的是短時間內這三者數值的增量。這個短時間可以是一秒,如 accepts per second、handled per second 和 requests per second。一個簡單的做法就是每秒都去讀取這些參數,返回一個和上一秒的差值就行。當然,handled per second 替換成 dropped per second=accepts per second-handled per second 就更完美了。
通過這七個參數,就可以從連接到請求全方位的監控起 Nginx 的運行狀態。為了方便檢測,對每次獲取的參數保留下來,然后按時間展現出來。下圖展示了 Nginx 在運行時的參考數據。
如何獲取Nginx 性能監控參數
開源的 Nginx 會提供一個子網頁顯示前文提到的監控參數。該網頁默認時不開啟的,需要開放 ngx http stub status module 來解鎖。默認該模塊是開放的,通過以下命令,可以快速確定該模塊是否已被開放。
nginx -V 2>&1 | grep -o with-http_stub_status_module
如過返回 with-http stub status module ,則說明該模塊已被開放,而什么都不返回的話就是沒有被開放。需要通過原碼構建 Nginx 加上配置參數 --with-httpstub status module :
./configure \ … \ --with-http_stub_status_module make sudo make install
以上步驟搞定后,還有需要一個配置 URL 來開啟 Nginx 狀態頁。打開你的網站對應 Nginx 的配置文件,添加以下修改:
server{ listen your-website-port; location /basic_status { stub_status; } }
如果 Nginx 版本低于1.7.5,則需要語法指令添加參數(任意參數):
server{ listen your-website-port; location /basic_status { stub_status on; } }
修改完成后,需要重新載入 Nginx,鍵入命令 nginx -s reload ,然后就能在狀態頁(127.0.0.1:your-website-port/basic_status)看見你的監控參數了。大概是這個樣子:
Active connections: 1 server accepts handled requests 38 38 38 Reading: 0 Writing: 1 Waiting: 0
Nginx Plus 和 Nginx 在前面的設置差不多。配置狀態頁時,需要在配置文件中加上 server 模塊:
server { listen your-website-port; location /status { status; } location = /status.html { } }
重載一下Nginx,你會在狀態頁(127.0.0.1:your-website-port/status.html)看到大概這個樣子:
順便安利一下,裝一個Ci,就能看到前面關于 Nginx 基于時間的運行狀態的圖了。免費注冊免費使用,還能設置報警策略。具體,戳這里。
Cloud Insight 集監控、管理、計算、協作、可視化于一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。 本文系國內 ITOM 行業領軍企業OneAPM 工程師原創。想閱讀更多技術文章,請訪問OneAPM 官方技術博客 。