通過配置Nginx內置的stub_status
模塊,您可以啟用專用的狀態頁實時顯示Nginx服務器的關鍵指標,例如活躍的客戶端連接數(Active connections)、在讀取請求頭(Reading)、發送響應(Writing)以及處于等待狀態(Waiting)的連接數。您可以通過Logtail插件采集Nginx監控日志并進行查詢分析,持續監控Nginx集群的性能。
前提條件
已在服務器上安裝Logtail。具體操作,請參見安裝Logtail(Linux系統)或安裝Logtail(Windows系統)。
目前支持Linux Logtail 0.16.0及以上版本,Windows Logtail 1.0.0.8及以上版本。
步驟一:配置stub_status
模塊
本文以Linux系統為例介紹操作步驟。
執行以下命令,安裝和啟動Nginx。
sudo yum install -y nginx sudo systemctl restart nginx
執行以下命令確認Nginx已具備status功能。
nginx -V 2>&1 | grep -o with-http_stub_status_module
返回以下信息,表示已支持status功能。
with-http_stub_status_module
配置Nginx服務器。
打開Nginx的配置文件,在
server {..}
塊中添加以下代碼。關于nginx_status
的更多信息,請參見Nginx status。location /nginx_status { stub_status on; #啟用stub_status模塊 access_log off; allow ${服務器IP}; #允許訪問的服務器IP deny all; # 拒絕所有其他 IP 地址訪問這個狀態頁面 }
執行以下命令,驗證配置結果。
nginx -t sudo systemctl restart nginx curl http://${服務器IP}/nginx_status
返回以下結果,表示配置成功。
Active connections: 1 server accepts handled requests 2507455 2507455 2512972 Reading: 0 Writing: 1 Waiting: 0
步驟二:采集Nginx監控日志
登錄日志服務控制臺。
單擊控制臺頁面右側的快速接入數據卡片。
在接入數據頁面,查找自定義數據插件并單擊。
- 選擇目標Project和Logstore,單擊下一步。
- 創建機器組。
- 如果您已有可用的機器組,請單擊使用現有機器組。
- 如果您還沒有可用的機器組,請執行以下操作(以ECS為例)。
- 在ECS機器頁簽中,通過手動選擇實例方式選擇目標ECS實例,單擊創建。
具體操作,請參見安裝Logtail(ECS實例)。
重要 如果您的服務器是與日志服務屬于不同賬號的ECS、其他云廠商的服務器和自建IDC時,您需要手動安裝Logtail。更多信息,請參見安裝Logtail(Linux系統)或安裝Logtail(Windows系統)。手動安裝Logtail后,您必須在該服務器上手動配置用戶標識。具體操作,請參見配置用戶標識。
- 安裝完成后,單擊確認安裝完畢。
- 在創建機器組頁面,輸入名稱,單擊下一步。
日志服務支持創建IP地址機器組和用戶自定義標識機器組,詳細參數說明請參見創建IP地址機器組和創建用戶自定義標識機器組。
- 在ECS機器頁簽中,通過手動選擇實例方式選擇目標ECS實例,單擊創建。
確認目標機器組已在應用機器組區域,單擊下一步。
重要創建機器組后立刻應用,可能因為連接未生效,導致心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。
在數據源設置頁簽中,粘貼以下代碼到插件配置欄,其中${服務器IP}請替換成您的服務器IP地址,然后單擊下一步。
{ "inputs": [ { "type": "metric_http", "detail": { "IntervalMs": 60000, "Addresses": [ "http://${服務器IP}/nginx_status", "http://${服務器IP}/nginx_status", "http://${服務器IP}/nginx_status" ], "IncludeBody": true } } ], "processors": [ { "type": "processor_regex", "detail": { "SourceKey": "content", "Regex": "Active connections: (\\d+)\\s+server accepts handled requests\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+Reading: (\\d+) Writing: (\\d+) Waiting: (\\d+)[\\s\\S]*", "Keys": [ "connection", "accepts", "handled", "requests", "reading", "writing", "waiting" ], "FullMatch": true, "NoKeyError": true, "NoMatchError": true, "KeepSource": false } } ] }
inputs為數據源配置,必選項。
重要一個inputs中只允許配置一個類型的數據源。
processors為處理配置,用于解析數據。可選項,您可以配置一種或多種處理方式。
如果當前的inputs配置無法滿足日志解析需求,您可以在插件配置中添加processors配置,即添加Logtail插件處理數據。例如提取字段、提取日志時間、脫敏數據、過濾日志等。更多信息,請參見使用Logtail插件處理數據。
重要參數說明如下表所示:
參數
類型
是否必須
說明
type
string
是
數據源類型,固定為metric_http。
IntervalMs
int
是
每次請求的間隔,單位:ms。
Addresses
數組
是
配置為您需要監控的URL列表。
IncludeBody
boolean
否
是否采集請求體,默認值:false。如果為true,則采集后,將請求體內容存放在content字段中。
完成采集配置1分鐘后,即可查看日志,樣例如下所示。日志服務默認生成nginx_status儀表盤,展示查詢和分析結果。
步驟三:查詢和分析日志
登錄日志服務控制臺。
在Project列表區域,單擊目標Project。
在控制臺左側,單擊日志存儲,在日志庫列表中單擊目標Logstore。
輸入查詢和分析語句,然后單擊最近15分鐘,設置查詢和分析的時間范圍。
更多信息,請參見步驟一:輸入查詢和分析語句。
查詢日志
查詢某IP地址的相關信息。
_address_: 10.10.0.0
查詢響應時間超過100毫秒的請求。
_response_time_ms_ > 100
查詢狀態碼不為200的請求。
not _http_response_code_ : 200
分析日志
每5分鐘統計一次waiting、reading、writing、connection的平均值。
*| select avg(waiting) as waiting, avg(reading) as reading, avg(writing) as writing, avg(connection) as connection, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
統計最大等待連接數排名前十的服務器。
*| select max(waiting) as max_waiting, _address_, from_unixtime(max(__time__)) as time group by address order by max_waiting desc limit 10
統計IP地址數量。
* | select count(distinct(_address_)) as total
統計請求失敗的IP地址數量。
not _result_ : success | select count(distinct(_address_))
統計最近十次請求失敗的IP地址。
not _result_ : success | select _address_ as address, from_unixtime(__time__) as time order by __time__ desc limit 10
每5分鐘統計一次請求總數。
*| select avg(handled) * count(distinct(_address_)) as total_handled, avg(requests) * count(distinct(address)) as total_requests, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
每5分鐘統計一次平均請求延遲。
*| select avg(_response_time_ms_) as avg_delay, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
統計請求成功的數量和失敗的數量。
not _http_response_code_ : 200 | select count(1)
_http_response_code_ : 200 | select count(1)