什么是 Nginx?
Nginx("engine-x")是一個 HTTP 和反向代理服務(wù)器绣檬,同時也是一個郵件代理服務(wù)器和通用的 TCP 代理服務(wù)器足陨。作為一個免費(fèi)開源的服務(wù)器,Nginx 具有高性能、穩(wěn)定和較低的資源占用的特點(diǎn)全景。它擁有豐富的特征集综芥,同時配置也很簡單。
Nginx 是少數(shù)幾個可以解決 C10K 問題的服務(wù)器之一飒房。不同于傳統(tǒng)服務(wù)器,它使用可擴(kuò)展的時間驅(qū)動(異步)架構(gòu)替代線程來處理請求媚值。尤為重要的是狠毯,該架構(gòu)占用負(fù)載下的內(nèi)存小,且可預(yù)測褥芒。即便不需要同時處理數(shù)千的網(wǎng)絡(luò)請求嚼松,你仍然能從Nginx 的高性能和低內(nèi)存占用中受益。從最小的VPS到大型集群服務(wù)器锰扶,Nginx 都能適用献酗。
Nginx 還有一個商業(yè)版 Nginx Plus,功能更加豐富坷牛。
監(jiān)控 Nginx 的參數(shù)
Nginx 提供哪些監(jiān)控參數(shù)
下表是 Nginx 提供的監(jiān)控參數(shù)及其簡單釋義罕偎。
<table>
<thead>
<tr>
<th>參數(shù)名稱</th>
<th>參數(shù)描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>Active connections </td>
<td>當(dāng)前活躍的用戶連接(包含Waiting狀態(tài)) </td>
</tr>
<tr>
<td>accepts </td>
<td>接收到的用戶連接總數(shù) </td>
</tr>
<tr>
<td>handled </td>
<td>Nginx處理的用戶連接總數(shù) </td>
</tr>
<tr>
<td>requests </td>
<td>用戶請求總數(shù) </td>
</tr>
<tr>
<td>Reading </td>
<td>當(dāng)前連接中Nginx讀取請求首部的個數(shù) </td>
</tr>
<tr>
<td>Writing </td>
<td>當(dāng)前連接中Nginx寫返回給用戶的個數(shù) </td>
</tr>
<tr>
<td>Waiting </td>
<td>當(dāng)前沒有請求的活躍用戶連接數(shù) </td>
</tr>
</tbody>
</table>
通過下面的圖,可以清晰的看到參數(shù)的具體意義和作用京闰。
當(dāng)用戶請求連接Nginx服務(wù)器時颜及,accepts計數(shù)器會加一。且當(dāng)服務(wù)器處理該連接請求時蹂楣,handled計數(shù)器同樣會加一俏站。一般而言,兩者的值是相等的痊土,除非達(dá)到了某些資源極限(如worker_connection的限制)肄扎。
用戶連接請求被處理,就會進(jìn)入 active 狀態(tài)施戴。如果該連接沒有其他 request反浓,則進(jìn)入 waiting 的子狀態(tài);如果有 request赞哗,nginx 會讀取 request 的 header雷则,計數(shù)器 request 加一,進(jìn)入 reading 的子狀態(tài)肪笋。 reading 狀態(tài)持續(xù)時間非常短月劈,header 被讀取后就會進(jìn)入 writing 狀態(tài)度迂。事實(shí)上,直到服務(wù)器將響應(yīng)結(jié)果返回給用戶之前猜揪,該連接會一直保持 writing 狀態(tài)惭墓。所以說,writing 狀態(tài)一般會被長時間占用而姐。
Nginx提供哪些監(jiān)控參數(shù)
下表是Nginx Plus提供的主要監(jiān)控參數(shù)腊凶、說明以及和Nginx的差異。
<table>
<thead>
<tr>
<th>參數(shù)名稱</th>
<th>參數(shù)描述</th>
<th>與Nginx差異</th>
</tr>
</thead>
<tbody>
<tr>
<td>Active </td>
<td>當(dāng)前活躍的用戶連接(不包含 Idel 狀態(tài)) </td>
<td>等同 Active connections </td>
</tr>
<tr>
<td>Accepted </td>
<td>接收到的用戶連接總數(shù) </td>
<td>等同 accepts </td>
</tr>
<tr>
<td>Dropped </td>
<td>Nginx 丟棄的用戶連接總數(shù) </td>
<td>accepts - handled </td>
</tr>
<tr>
<td>Idle </td>
<td>當(dāng)前沒有請求的活躍用戶連接數(shù) </td>
<td>等同 Waiting </td>
</tr>
<tr>
<td>Total </td>
<td>用戶請求總數(shù) </td>
<td>等同 requests </td>
</tr>
<tr>
<td>Current(Requests) </td>
<td>當(dāng)前有請求的活躍用戶連接數(shù)(等同 Active)</td>
<td>Reading + Writing </td>
</tr>
<tr>
<td>Current(Connections) </td>
<td>當(dāng)前在線用戶數(shù)(Active + Idle) </td>
<td>Reading + Writing + Waiting </td>
</tr>
</tbody>
</table>
主要參數(shù)和開源的Nginx相比較拴念,區(qū)別不大钧萍。主要就是換了名字,以及通過加減法的參數(shù)整合政鼠。同樣风瘦,通過下面的圖也能看清這些參數(shù)的作用。
具體運(yùn)作和Nginx并無不同公般,故不贅述万搔。當(dāng)然,作為商業(yè)版官帘,它提供的參數(shù)還有很多瞬雹,可以在這里看。
怎么利用這些參數(shù)
開源的 Nginx 提供的原始參數(shù)中刽虹,實(shí)時性的會比較有用挖炬,如 Active connections、Reading状婶、Writing 以及 Waiting。這些數(shù)據(jù)能夠反映當(dāng)前 Nginx 的負(fù)載情況馅巷,方便在服務(wù)器出現(xiàn)問題時及時發(fā)現(xiàn)問題膛虫。而另一些數(shù)據(jù)由于不是狀態(tài)量,Nginx 無法計算當(dāng)前的量值而改做其統(tǒng)計數(shù)钓猬,如 accepts稍刀、handled 和 requests。
對于維護(hù)網(wǎng)站人員敞曹,accepts账月、handled 和 requests 的統(tǒng)計值用處是不大的,值得參考的是短時間內(nèi)這三者數(shù)值的增量澳迫。這個短時間可以是一秒局齿,如 accepts_per_second、handled_per_second 和 requests_per_second橄登。一個簡單的做法就是每秒都去讀取這些參數(shù)抓歼,返回一個和上一秒的差值就行讥此。當(dāng)然,handled_per_second 替換成 dropped_per_second=accepts_per_second-handled_per_second 就更完美了谣妻。
通過這七個參數(shù)萄喳,就可以從連接到請求全方位的監(jiān)控起 Nginx 的運(yùn)行狀態(tài)。為了方便檢測蹋半,對每次獲取的參數(shù)保留下來他巨,然后按時間展現(xiàn)出來。下圖展示了 Nginx 在運(yùn)行時的參考數(shù)據(jù)减江。
如何獲取 Nginx 性能監(jiān)控參數(shù)
開源的 Nginx 會提供一個子網(wǎng)頁顯示前文提到的監(jiān)控參數(shù)染突。該網(wǎng)頁默認(rèn)時不開啟的,需要開放 ngx_http_stub_status_module 來解鎖您市。默認(rèn)該模塊是開放的觉痛,通過以下命令,可以快速確定該模塊是否已被開放茵休。
nginx -V 2>&1 | grep -o with-http_stub_status_module
如過返回 with-http_stub_status_module薪棒,則說明該模塊已被開放,而什么都不返回的話就是沒有被開放榕莺。需要通過原碼構(gòu)建 Nginx 加上配置參數(shù) --with-http_stub_status_module:
./configure \
… \
--with-http_stub_status_module
make
sudo make install
以上步驟搞定后俐芯,還有需要一個配置 URL 來開啟 Nginx 狀態(tài)頁。打開你的網(wǎng)站對應(yīng) Nginx 的配置文件钉鸯,添加以下修改:
server{
listen your-website-port;
location /basic_status {
stub_status;
}
}
如果 Nginx 版本低于1.7.5吧史,則需要語法指令添加參數(shù)(任意參數(shù)):
server{
listen your-website-port;
location /basic_status {
stub_status on;
}
}
修改完成后,需要重新載入 Nginx唠雕,鍵入命令 nginx -s reload贸营,然后就能在狀態(tài)頁(127.0.0.1:your-website-port/basic_status)看見你的監(jiān)控參數(shù)了。大概是這個樣子:
Active connections: 1
server accepts handled requests
38 38 38
Reading: 0 Writing: 1 Waiting: 0
Nginx Plus 和 Nginx 在前面的設(shè)置差不多岩睁。配置狀態(tài)頁時钞脂,需要在配置文件中加上 server 模塊:
server {
listen your-website-port;
location /status {
status;
}
location = /status.html {
}
}
重載一下Nginx,你會在狀態(tài)頁(127.0.0.1:your-website-port/status.html)看到大概這個樣子:
順便安利一下捕儒,裝一個 Ci冰啃,就能看到前面關(guān)于 Nginx 基于時間的運(yùn)行狀態(tài)的圖了。免費(fèi)注冊免費(fèi)使用刘莹,還能設(shè)置報警策略阎毅。具體,戳這里点弯。
Cloud Insight 集監(jiān)控扇调、管理、計算抢肛、協(xié)作肃拜、可視化于一身痴腌,幫助所有 IT 公司,減少在系統(tǒng)監(jiān)控上的人力和時間成本投入燃领,讓運(yùn)維工作更加高效士聪、簡單。
本文系國內(nèi) ITOM 行業(yè)領(lǐng)軍企業(yè) OneAPM 工程師原創(chuàng)猛蔽。想閱讀更多技術(shù)文章剥悟,請訪問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客