NGINX訪問日誌和日誌切割

2021-10-14 09:08:42 字數 3627 閱讀 9967

當我們訪問nginx服務時,nginx會記錄日誌,nginx日誌分兩種,一種是訪問日誌,一種是錯誤日誌,訪問日誌記錄在"access.log"檔案中,錯誤日誌記錄在"error.log"檔案中

編譯安裝了nginx,預設情況下,access.log日誌會放在nginx安裝路徑的logs目錄中

[root@myserver_2 nginx]# pwd

/nginx

[root@myserver_2 nginx]# ls

auto conf html man sbin

changes configure license objs scgi_temp

changes.ru contrib logs proxy_temp src

client_body_temp fastcgi_temp makefile readme uwsgi_temp

[root@myserver_2 nginx]#

通過yum源安裝的nginx,那麼access.log的預設路徑為/var/log/nginx/access.log

[root@myserver nginx]# pwd

/var/log/nginx

[root@myserver nginx]# ls

access.log error.log

開啟谷歌瀏覽器,訪問nginx預設的index.html頁面,在瀏覽器的位址列中輸入""進行訪問,然後,開啟logs/access.log,你會發現類似如下的日誌:

'"$http_user_agent" "$http_x_forwarded_for"';通過"log_format"指令建立了乙個"日誌格式",這個"日誌格式"的名字是"main","main"日誌格式都會記錄哪些內容呢?"main"日誌格式會將"remote_addr"變數和"http_user_agent"變數中的內容記錄到日誌中,並且使用" - "作為分隔符將兩個變數的內容分隔開,同時,使用雙引號""將http_user_agent變數的內容引起,nginx中有很多內建變數,"remote_addr"變數和"http_user_agent"變數就是這些內建變數中的一員,使用"$變數名"即可呼叫變數,這些變數通常與http協議的請求和響應有關係,所以我們可以利用這些變數做很多事情,比如,利用它們記錄訪問日誌。聰明如你,一定想到了,日誌中記錄什麼內容,是由我們決定的,我們在日誌格式中設定了a變數、b變數、c變數,那麼日誌檔案中就會記錄a變數的值,b變數的值,以及c變數的值

$remote_user變數:當nginx開啟了使用者認證功能後,此變數記錄了客戶端使用了哪個使用者進行了認證。

$time_local變數:記錄了當前日誌條目的時間。

$request變數:記錄了當前http請求的方法、url和http協議版本。

$status變數:記錄了當前http請求的響應狀態,即響應的狀態碼,比如200、404等響應碼,都記錄在此變數中。

$body_bytes_sent變數:記錄了nginx響應客戶端請求時,傳送到客戶端的位元組數,不包含響應頭的大小。

$http_user_agent變數:記錄了客戶端的軟體資訊,比如,瀏覽器的名稱和版本號

nginx會將訪問日誌寫入到access.log日誌檔案中,天長日久,access.log檔案就會越來越大,如果訪問量巨大,並不用多長時間,access.log檔案的體積就會變得非常大,對於我們的管理工作來說,這是不利的,首先,當我們開啟乙個非常大的日誌檔案時,就會比較慢,而且,從乙個非常大的日誌中找到某個時間段的日誌也會比較慢,所以,我們最好將日誌按天分割開(或者按照你覺得合適的時間段分隔開).

我們需要為nginx配置"日誌分割"的功能,或者稱之為"日誌滾動"的功能,說到nginx的日誌切割,要分如下兩種情況來說:

一、通過編譯的方式安裝nginx後,預設沒有日誌分割的功能

二、通過yum源的方式安裝nginx後,缺省會對nginx日誌進行切割

第一種方法是編寫指令碼實現日誌切割

第二種方法是使用系統自帶的日誌滾動軟體"logrotate"完成日誌切割,但是無論選擇哪種方法,其實都是殊途同歸,在本質上都是一樣的,那麼,我們先來看看怎樣通過最"原始"的方法為nginx進行日誌滾動。

[root@linuxprobe logrotate.d]# ls

bootlog dnf nginx sssd wpa_supplicant

btmp iscsiuiolog numad subscription-manager wtmp

chrony libvirtd psacct syslog

cups libvirtd.qemu samba up2date

[root@linuxprobe logrotate.d]#

nginx -s"命令可以向nginx的主程序(master程序)傳送訊號,這些訊號就是quit訊號、stop訊號、reload訊號以及reopen訊號,其實,我們借助reopen訊號,就能為nginx實現日誌滾動的效果

程序訊號

term或者int:表示立即停止nginx

quit:表示優雅的停止nginx

hup:過載配置檔案

usr1:重新開啟日誌檔案

usr2:熱公升級nginx程式

winch:優雅的關閉相應的worker程序

需要用到剛才提到的reopen訊號了,我們需要向nginx主程序傳送乙個reopen訊號,以便nginx能夠開啟乙個新的日誌檔案,具體命令如下:

nginx -s reopen

除了能夠使用"nginx -s"命令傳送訊號,我們也可以借助"kill"命令向nginx程序傳送訊號,你肯定經常使用kill命令,當你想要強制停掉程序的時候,會使用"kill -9 pid"向程序傳送"sigkill"訊號,除了"-9"代表的"sigkill"訊號,我們也可以借助kill命令向程序傳送一些別的訊號,kill命令並不是此處討論的重點,而是我們需要借助kill命令,向nginx主程序傳送乙個名為"usr1"的訊號,在程式中,"usr1"訊號的作用是可以自定義的,也就是說,當程式捕捉到"usr1"訊號的時候進行什麼操作,取決於程式設計時的設定,不同的程式採取的操作可能不同,而在nginx中,"usr1"訊號可以幫助我們重新開啟日誌,換句話說就是,"nginx -s reopen"命令的作用和"kill -usr1 nginxpid"的作用是一樣的,"nginxpid"指的是nginx的master程序的程序號,所以,在編寫nginx日誌滾動指令碼時,你可以使用這兩個命令中的任何乙個,以便nginx可以重新開啟日誌檔案

yum安裝的系統自帶的日誌滾動軟體"logrotate"完成日誌切割配置檔案中

[root@myserver logrotate.d]# cat nginx 

/var/log/nginx/*log

nginx自動切割訪問日誌

web 訪問日誌 access log 記錄了所有外部客戶端對web伺服器的訪問行為,包含了客戶端ip,訪問日期,訪問的url資源,伺服器返回的http狀態碼等重要資訊。一條典型的web訪問日誌如下 規劃 1 要解決問題 2 nignx沒有自動分開檔案儲存日誌的機制。由於nginx它不會幫你自動分檔...

nginx訪問日誌的切割

設定日誌定期擷取一是為了方便查閱,二是為了i o擁塞 截止到目前筆者維護過的伺服器中單台伺服器日訪問日誌大小就達到1.6g,如果不定期擷取,由於檔案內容較大,後期對檔案程序查詢 移動時將會嚴重影響系統效能 nginx日誌格式不像apache resin那麼人性化,nginx訪問日誌無法在nginx的...

Nginx 訪問日誌輪詢切割

預設情況下 nginx 會把所有的訪問日誌生成到乙個指定的訪問日誌檔案 access.log 裡,但這樣一來,時間長了就會導致日誌個頭很大,不利於日誌的分析和處理,因此,有必要對 nginx 日誌,按天或按小時進行切割,使其分成不同的檔案儲存。這裡使用按天切割的方法。bin bash this sc...