文章目錄
- 一、簡介
- 二、監控的主要指標
- 1、基本活躍指標
- 2、每秒請求數–QPS
- 3、服務器錯誤率
- 三、指標收集
- 1、Nginx stub 模塊監控
- (1)模塊安裝
- (2)Nginx 狀態查看
- (3)Stub Status 引數說明
- 2、Nginx Reqstat 模塊監控
- (1)模塊安裝
- (1)Reqstat監控配置
- (2)Nginx 狀態查看
- 四、補充(擴展):
- 1、日志分析
- 2、常用分析命令
- (1)相關概念
- (2)具體命令
- 3、公司監控nginx需要的指標
- (1)請求時長
- (2)nginx是否存活
- (3)請求回傳錯誤
- (4)流量
- (5)服務損耗
一、簡介
web 服務器 nginx 以其高性能與抗并發能力越來越多的被用戶使用,Nginx 提供了 ngx_http_stub_status_module、ngx_http_reqstat_module模塊,這兩個模塊提供了基本的監控功能,
- 行程監控
- 埠監控
注意: 這兩個是必須要加在zabbix監控,加觸發器有問題及時告警,
二、監控的主要指標
即主要監控物件:
1、基本活躍指標
| 名稱 | 描述 | 指標型別 |
|---|---|---|
| Accepts (接受) | NGINX 所接受的客戶端連接數 | 資源: 功能 |
| Handled (已處理) | 成功的客戶端連接數 | 資源: 功能 |
| Dropped (已丟棄,計算得出) | 丟棄的連接數(接受 - 已處理) | 作業:錯誤* |
| Requests (請求數) | 客戶端請求數 | 作業:吞吐量 |
2、每秒請求數–QPS
通過持續的 QPS 監控,可以立刻發現是否被惡意攻擊或對服務的可用性進行評估,雖然當問題發生時,通過 QPS 不能定位到確切問題的位置,但是他卻可以在第一時間提醒你環境可能出問題了,
3、服務器錯誤率
通過監控固定時間間隔內的錯誤代碼(4XX代碼表示客戶端錯誤,5XX代碼表示服務器端錯誤),可以了解到客戶端收到的結果是否是正確的錯誤率突然的飆升很可能是你的網站漏洞發出的信號,
如果你希望通過 access log 分析錯誤率,那么你需要配置 nginx 的日志模塊,讓 nginx 將回應碼寫入訪問日志,
三、指標收集
1、Nginx stub 模塊監控
(1)模塊安裝
確保Linux上已安裝配置好Nginx,一定要有--with-http_stub_status_module這個模塊,可以在Nginx的sbin目錄下輸入./nginx -V進行查看,如果沒有可以在編譯時加上此模塊,
./configure –with-http_stub_status_module
默認情況下,status是關閉的,我們需要開啟,并指定uri來訪問資料,通過配置,在nginx組態檔中的server塊中增加
server {
listen 80;
server_name localhost;
location /nginx-status {
stub_status on;
access_log on;
}
}
(2)Nginx 狀態查看
配置完成后在瀏覽器中輸入http://10.0.105.207/nginx-status 查看
(或者用 curl localhost/nginx-status),顯示資訊如下:
Active connections: 2
server accepts handled requests
26 26 48
Reading: 0 Writing: 1 Waiting: 1
- Active connections:與后端建立的服務連接數
- server accepts handled requests:Nginx總共處理了26個連接,成功創建了26次握手,總共處理了48個請求
- Reading:nginx讀取到客戶端的Header資訊數
- Writing:nginx回傳到客戶端的Header資訊數
- Waiting:開啟Keep-alive的情況下,這個值等于 Active -(Reading + Writing),表示nginx已經處理完成,正在等候下次一次請求的連接數,
(3)Stub Status 引數說明
正常情況下waiting數量是比較多的,并不能說明性能差,如果reading+writing數量比較多說明服務并發有問題,

2、Nginx Reqstat 模塊監控
可以監控Nginx的性能、主要監控、連接數、請求數、各種回應碼范圍的請求數、輸入輸出流量、rt、upstream訪問等,現在通過ngx_req_status_module能夠統計Nginx中請求的狀態資訊,需要安裝第三方模塊,
./configure --add-module=/usr/local/ngx_req_status-master
(1)模塊安裝
1.下載ngx_req_status_module 模塊, 這是第三方模塊需要添加
[root@nginx-server ~]# wget https://github.com/zls0424/ngx_req_status/archive/master.zip -O ngx_req_status.zip
[root@nginx-server ~]# unzip ngx_req_status.zip
[root@nginx-server ~]# cp -r ngx_req_status-master/ /usr/local/ #與解壓的nginx在同一級目錄下
[root@nginx-server ~]# cd /usr/local/nginx-1.16.0/
[root@nginx-server nginx-1.16.0]# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel
[root@nginx-server nginx-1.16.0]# yum -y install patch.x86_64
[root@nginx-server nginx-1.16.0]# patch -p1 < ../ngx_req_status-master/write_filter-1.7.11.patch
[root@localhost nginx-1.16.0]# ./configure 添加上原來的引數 --add-module=/usr/local/ngx_req_status-master
2.由于原先已有nginx,所以不能執行make install
否則會覆寫掉以前的組態檔及內容
[root@localhost nginx-1.16.0]# make
3.更換二進制檔案
[root@localhost nginx-1.16.0]# mv /usr/sbin/nginx /usr/sbin/nginx_bak
[root@localhost nginx-1.16.0]# cp objs/nginx /usr/sbin/
[root@localhost nginx-1.16.0]# systemctl restart nginx
[root@localhost nginx-1.16.0]# nginx -V
如果發現編譯的組態檔有變化就成功了!
(1)Reqstat監控配置
[root@localhost ~]# vim /etc/nginx/nginx.conf
req_status_zone server_name $server_name 256k;(開啟的req監控)
req_status_zone server_addr $server_addr 256k;
req_status_zone server_url $server_name$uri 256k;
req_status server_name server_addr server_url;
server {
server_name localhost;
location /req-status {
req_status_show on;
}
}
指令介紹
req_status_zone
語法: req_status_zone name string size
默認值: None
配置塊: http
定義請求狀態ZONE,請求按照string分組來排列,例如:
req_status_zone server_url $server_name$uri 256k;
域名+uri將會形成一條資料,可以看到所有url的帶寬,流量,訪問數
req_status
語法: req_status zone1[ zone2]
默認值: None
配置塊: http, server, location
在location中啟用請求狀態,你可以指定更多zones,
req_status_show
語法: req_status_show on
默認值: None
配置塊: location
在當前位置啟用請求狀態處理程式
(2)Nginx 狀態查看
192.168.187.164/req-status
zone_name key max_active max_bw traffic requests active bandwidth
server_addr 192.168.187.164 2 432 17K 18 1 0
server_name 192.168.187.164 2 432 17K 18 1 0
server_url 192.168.187.164/ 1 0 0 8 0 0
請求狀態資訊包括以下欄位:
- zone_name - 利用req_status_zone定義的分組標準,例如,按照服務器名稱對請求進行分組后;
- key - 請求按分組標準分組后的分組標識(即組名),例如按服務器名稱分組時,組名可能是localhost;
- max_active - 該組的最大并發連接數;
- max_bw - 該組的最大帶寬;
- traffic - 該組的總流量;
- requests - 該組的總請求數;
- active - 該組當前的并發連接數;
- bandwidth - 該組當前帶寬,
四、補充(擴展):
1、日志分析
nginx 的 access log 中可以記錄很多有價值的資訊,通過分析 access log,可以收集到很多指標,制作nginx的日志切割,每天凌晨切割并壓縮,
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';
列印的日志實體
39.105.66.117 - mp [11/Sep/2019:19:03:01 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.040 0.040
39.105.66.117 - mp [11/Sep/2019:19:03:08 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.008 0.008
引數詳情
- $remote_addr: 客戶端的ip地址
- $remote_user: 用于記錄遠程客戶端的用戶名稱
- $time_local: 用于記錄訪問時間和時區
- $request: 用于記錄請求的url以及請求方法
- $status: 回應狀態碼
- $body_bytes_sent: 給客戶端發送的檔案主體內容位元組數
- $http_referer: 可以記錄用戶是從哪個鏈接訪問過來的
- $http_user_agent: 用戶所使用的瀏覽器資訊
- $http_x_forwarded_for: 可以記錄客戶端IP,通過代理服務器來記錄客戶端的ip地址
- $ request_time: 指的是從接受用戶請求的第一個位元組到發送完回應資料的時間,即$request_time包括接收客戶端請求資料的時間、后端程式回應的時間、發送回應資料給客戶端的時間
- $upstream_response_time: 用于接收來自上游服務器的回應的時間
2、常用分析命令
(1)相關概念
-
PV:PV(訪問量): 即Page View, 即頁面瀏覽量或點擊量,用戶每次重繪即被計算一次,
-
UV:UV(獨立訪客):即Unique Visitor,訪問您網站的一臺電腦客戶端為一個訪客,00:00-24:00內相同的客戶端只被計算一次,
(2)具體命令
1、根據訪問IP統計UV
awk '{print $1}' paycenteraccess.log | sort -n | uniq | wc -l
2、查詢訪問最頻繁的IP(前10)
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 10
3、查看某一時間段的IP訪問量(1-8點)
awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c| sort -nr |wc -l
4、查看訪問100次以上的IP
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
5、查看指定ip訪問過的url和訪問次數
grep "39.105.67.140" /var/log/nginx/access.log|awk '{print $7}' |sort |uniq -c |sort -n -k 1 -r
6、根據訪問URL統計PV
cat /var/log/nginx/access.log |awk '{print $7}' |wc -l
7、查詢訪問最頻繁的URL(前10)
awk '{print $7}' /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10
8、查看訪問最頻的URL([排除/api/appid])(前10)
grep -v '/api/appid' /var/log/nginx/access.log|awk '{print $7}' | sort |uniq -c | sort -rn | head -n 10
9、查看頁面訪問次數超過100次的頁面
cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
10、查看最近1000條記錄,訪問量最高的頁面
tail -1000 /var/log/nginx/access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less
11、統計每小時的請求數,top10的時間點(精確到小時)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10
12、統計每分鐘的請求數,top10的時間點(精確到分鐘)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 10
13、統計每秒的請求數,top10的時間點(精確到秒)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 10
14、查找指定時間段的日志
awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log
15、列出傳輸時間超過 0.6 秒的url,顯示前10條
cat /var/log/nginx/access.log |awk '(substr($NF,2,5) > 0.6){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10
16、列出/api/appid請求時間超過0.6秒的時間點
cat /var/log/nginx/access.log |awk '(substr($NF,2,5) > 0.6 && $7~/\/api\/appid/){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10
17、獲取前10條最耗時的請求時間、url、耗時
cat /var/log/nginx/access.log |awk '{print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10
3、公司監控nginx需要的指標
Nginx 處理請求的程序被詳細地記錄在 access.log 以及 error.log 檔案中
| 監控專案 | 所屬性質 | 指標 |
|---|---|---|
| 請求時長 | 服務性質 | 從發出請求到結束需要的時間$request_time 和 $upstream_response_time |
| 服務存活性 | 服務性質 | nginx是否存活 |
| 請求回傳錯誤 | 服務性質 | 服務器日志方式錯誤碼4xx和5xx |
| 流量 | 服務性質 | pv 和 流量 |
| 服務損耗 | 服務性質 | 連接數 打開檔案數 cpu使用率和系結cpu核心的使用率 |
(1)請求時長
自定義日志中添加上"$request_time" 和"$upstream_response_time"
這樣在后面顯示請求體和時間,根據自己請求的時長容忍度來實作程式層面的請求介面優化或者快取
(2)nginx是否存活
檢查nginx訪問 是否回傳值和自己的理想的資料回傳是否一致 或者狀態碼是否一致
(3)請求回傳錯誤
必須添加對諸如 500/502/504 等 5xx 服務類錯誤狀態碼的監控,它們告訴我們服務本身出現了問題,
- 5xx 類錯誤每分鐘出現的頻率應該在個位數,太多的 5xx 應及時排查問題并解決;
- 4xx 類錯誤,在協助解決一些非預期的權限錯誤、資源丟失或性能等問題上可以給予幫助,
例如:
| connection refused 用戶請求超時 | 用戶請求超時 |
|---|---|
| connection timed out | nginx與后端服務器連接超時 |
| while connection upstream | nginx與后端服務器連接出現問題 |
(4)流量
可以適當的監控網路介面的流量
(5)服務損耗
location /nginx-status {
stub_status on;
access_log off;
allow 10.1.1.1/24;
deny all;
}
- 檔案打開數:lsof |grep nginx|wc -l
- cpu損耗: 監控cpu的使用率即可
| active connection | 當前正在處理的活躍連接數 |
|---|---|
| reading | 正在讀取的客戶連接數 |
| writing | 處理回應資料到客戶端的數量 |
| waiting | Nginx等待下次請求的駐留的客戶連接數 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294437.html
標籤:其他
