前言
最近公司項(xiàng)目在壓測(cè),接到一個(gè)需求要求將NG的并發(fā)狀態(tài)做一個(gè)監(jiān)控集成到管理端后臺(tái),百度了一下,才發(fā)現(xiàn)NG自身帶有狀態(tài)監(jiān)測(cè)插件。
在Nginx的插件模塊中有一個(gè)模塊stub_status可以監(jiān)控Nginx的一些狀態(tài)信息,默認(rèn)安裝可能沒(méi)有這個(gè)模塊,手動(dòng)編譯的時(shí)候加一下即可。
插件安裝
檢查是否已安裝
鍵入命令:nginx -V 2>&1 | grep -o with-http_stub_status_module
[root@prod-l27-43-26 logs]#
[root@prod-l27-43-26 logs]# nginx -V 2>&1 | grep -o with-http_stub_status_module
with-http_stub_status_module
[root@prod-l27-43-26 logs]#
如果有返回結(jié)果則證明已安裝了此插件,如果沒(méi)有,則需要重新編譯去安裝,編譯命令如下:
./configure –with-http_stub_status_module
修正NG配置
在添加此模板之后,我們需要配置相關(guān)的狀態(tài)訪問(wèn)路由
location /ngstate {
stub_status on;
access_log off;
#allow 127.0.0.1;
#deny all;
#auth_basic "NginxStatus";
#auth_basic_user_file conf/nginxstaus;
}
修改之后,重啟NG即可訪問(wèn)對(duì)應(yīng)的路由即可:

參數(shù)說(shuō)明:
active connections – 活躍的連接數(shù)量
server accepts handled requests — 總共處理了1075個(gè)連接 , 成功創(chuàng)建1064次握手, 總共處理了6253個(gè)請(qǐng)求
每個(gè)連接有三種狀態(tài)waiting、reading、writing
reading —讀取客戶端的Header信息數(shù).這個(gè)操作只是讀取頭部信息,讀取完后馬上進(jìn)入writing狀態(tài),因此時(shí)間很短。
writing — 響應(yīng)數(shù)據(jù)到客戶端的Header信息數(shù).這個(gè)操作不僅讀取頭部,還要等待服務(wù)響應(yīng),因此時(shí)間比較長(zhǎng)。
waiting — 開(kāi)啟keep-alive后等候下一次請(qǐng)求指令的駐留連接.
正常情況下waiting數(shù)量是比較多的,并不能說(shuō)明性能差。反而如果reading+writing數(shù)量比較多說(shuō)明服務(wù)并發(fā)有問(wèn)題。


當(dāng)用戶請(qǐng)求連接Nginx服務(wù)器時(shí),accepts計(jì)數(shù)器會(huì)加一。且當(dāng)服務(wù)器處理該連接請(qǐng)求時(shí),handled計(jì)數(shù)器同樣會(huì)加一。一般而言,兩者的值是相等的,除非達(dá)到了某些資源極限(如worker_connection的限制)。
用戶連接請(qǐng)求被處理,就會(huì)進(jìn)入 active 狀態(tài)。如果該連接沒(méi)有其他 request,則進(jìn)入 waiting 的子狀態(tài);如果有 request,nginx 會(huì)讀取 request 的 header,計(jì)數(shù)器 request 加一,進(jìn)入 reading 的子狀態(tài)。 reading 狀態(tài)持續(xù)時(shí)間非常短,header 被讀取后就會(huì)進(jìn)入 writing 狀態(tài)。事實(shí)上,直到服務(wù)器將響應(yīng)結(jié)果返回給用戶之前,該連接會(huì)一直保持 writing 狀態(tài)。所以說(shuō),writing 狀態(tài)一般會(huì)被長(zhǎng)時(shí)間占用。
其他命令
其實(shí)我們還可以使用命令獲取
- 查看Nginx并發(fā)進(jìn)程數(shù):ps -ef | grep nginx | wc -l
- 查看Web服務(wù)器TCP連接狀態(tài):netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
[root@prod-l27-43-26 nginx]# ps -ef | grep nginx | wc -l
18
[root@prod-l27-43-26 nginx]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 31
TIME_WAIT 21
[root@prod-l27-43-26 nginx]#
整合
最好我們可以通過(guò)API將狀態(tài)監(jiān)控整合到我們的管理臺(tái)來(lái)

好了,這樣一個(gè)簡(jiǎn)單的NG監(jiān)控就完成了。