1.前言
最近想要統計項目中的請求時間,來判斷那些請求響應時間來進行優化對應的代碼。
傳統辦法是使用PHP在項目的入口文件和輸出的分別計算時間,然后計算時間差值。但是這種的話,非常麻煩,而且需要修改項目文件,改動較大。如果你對nginx比較了解的話,你就會發現nginx也有統計請求時間的功能,而且配置一下就能實現該功能。
下面就介紹一下nginx統計請求時間的方式。
環境介紹
- Linux環境:Ubuntu 18.10
- Nginx版本:1.15.5
- PHP版本:7.2.15
我為了能測試該功能,特意搭建了一個phpmyadmin項目來統計訪問的請求時間。
定義log格式
對於記錄請求時間,那么我們需要定義個log格式,來記錄請求的URL以及請求處理時間。
該定義在/etc/nginx/nginx.conf中:
http {
...
# 注意這一行 log_format statistics_time "$request $request_time"; ... }
下面介紹一下這行配置的意義:
log_format 定義nginx log格式的指令
statistics_time 定義log格式的名稱
$request 請求的URI和HTTP協議,如: “GET /article-10000.html HTTP/1.1”
$request_time 整個請求的總時間,單位為分,精確到微秒。如:0.205
定義記錄位置
下面打開/etc/nginx/sites-enabled/pma.
server { listen 80; root /home/baoguoxiao/code/php/phpmyadmin; index index.php index.html; server_name pma.lvh.me; location / { } access_log /var/log/nginx/access_pma.log; access_log '/var/log/nginx/time_pma.log' statistics_time; # 注意這行 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } }
下面解釋一下這一行的指令:
access_log nginx 設置訪客log路徑的指令 /var/log/nginx/time_pma.log 定義訪問日志的路徑 statistics_time log格式的名稱,對應上面的自定義log格式
配置好之后,就可以重啟nginx,查看效果了。下面就是我查看的日志的部分內容:
GET / HTTP/1.1 0.037 POST /ajax.php HTTP/1.1 0.012 POST /navigation.php?ajax_request=1 HTTP/1.1 0.018 POST /ajax.php HTTP/1.1 0.019 POST /ajax.php HTTP/1.1 0.011 POST /version_check.php HTTP/1.1 0.008 GET /favicon.ico HTTP/1.1 0.000 GET /db_structure.php?server=1&db=mysql&ajax_request=true&ajax_page_request=true&_nocache=1550413689281586612&token=%3B%24*%5DFp%7BVsh%40~8%5D9t HTTP/1.1 0.126
實現按天區分
如何實現按天分配,網上介紹的方式都太重了。我感覺應該nginx是可以自己實現分天記錄日志的。在我的不懈搜索之下,真讓我找到了。
本次修改都是只需要修改一個文件就可以了:
/etc/nginx/sites-enabled/pma
server {
...
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") { set $date $1$2$3; } access_log /var/log/nginx/time_pma_$date.log statistics_time; ... }
但是在實際運行中並不會出現對應的日志,通過查看error.log可以看到如下錯誤:
2019/02/17 22:33:09 [crit] 54018#54018: *58 open() "/var/log/nginx/time_pma_20190217.log" failed (13: Permission denied) while logging request, client: 192.168.1.230, server: pma.lvh.me, request: "POST /navigation.php?ajax_request=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock", host: "pma.lvh.me"
通過該日志可以明白是權限的問題導致的該情況。
所以執行以下命令對文件夾進行賦予權限
sudo chown www-data /var/log/nginx -R
這里我的nginx運行的用戶是www-data,如果你的nginx用戶是www,那么你就要將上面命令中的www-data修改為www再執行。
這樣就可以看到生成的對應文件了。
$ ls
access.log access_pma.log error.log time_pma_20190217.log time_pma.log
2.下一步
下一步思考如何將nginx進行入庫,然后實現各種查詢和聚合查詢。
3. 總結
通過上面的方式通過nginx的配置可以做很多的事情。今天要多多加強對於nginx配置的了解。這樣通過一些簡單的配置,可以做更多的事情,從而減輕自己的工作量。
原文地址:https://www.cnblogs.com/royfans/p/14439687.html
參考地址:https://www.wahahahaohe.com/524.html
參考地址:https://www.jianshu.com/p/44680c081ea0