nginx短篇(6):訪問日誌
- A+
所屬分類:Nginx 運維技術
博主會將與Nginx有關的知識點總結到"nginx短篇系列"文章中,如果你對nginx不是特別瞭解,請 按照順序 閱讀"nginx短篇系列",以便站在前文的基礎上理解新的知識點。
當我們訪問nginx服務時,nginx會記錄日誌,nginx日誌分兩種,一種是訪問日誌,一種是錯誤日誌,訪問日誌記錄在"access.log"檔案中,錯誤日誌記錄在"error.log"檔案中,這篇文章我們只關注訪問日誌的使用,也就是"access.log"。
如果你編譯安裝了nginx,預設情況下,access.log日誌會放在nginx安裝路徑的logs目錄中,如果你是通過yum源安裝的nginx,那麼access.log的預設路徑為/var/log/nginx/access.log,當然,無論你通過哪種方式安裝nginx,我們都可以自定義日誌檔案的路徑,想要自定義訪問日誌檔案的路徑非常簡單,我們只需要藉助一條配置指令即可,這條配置指令就是access_log指令,比如,我們想要將訪問日誌寫入到/opt/access.log檔案中,那麼只需要進行如下配置即可:
access_log /opt/access.log;
access_log指令還有一些別的用法,不過我們暫且先放下不聊,我們先來仔細看看預設的訪問日誌是什麼樣子的。
首先,開啟你的谷歌瀏覽器,訪問nginx預設的index.html頁面,在瀏覽器的位址列中輸入"http://10.1.1.72/index.html"進行訪問,然後,開啟logs/access.log,你會發現類似如下的日誌:
10.1.1.1 - - [09/Feb/2019:22:41:28 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
如果你並沒有仔細研究過nginx的訪問日誌,那麼當你第一眼看到上述日誌的時候,可能會有些懵逼,這一長串日誌到底是什麼意思呢?不要著急,我們慢慢聊。上述日誌看似雜亂無章,其實是有一定的規律的,我們看到的日誌之所以長成這個樣子,都是因為一條配置指令決定的,這條配置指令就是"log_format"指令。
通過"log_format"指令可以指定訪問日誌都記錄哪些內容,以怎樣的格式記錄這些內容,這樣說可能不太容易理解,不如我們先來看一個簡單的小示例,示例配置如下:
上述配置表示,我們通過"log_format"指令建立了一個"日誌格式",這個"日誌格式"的名字是"testformat","testformat"日誌格式都會記錄哪些內容呢?"testformat"日誌格式會將"remote_addr"變數和"http_user_agent"變數中的內容記錄到日誌中,並且使用" - "作為分隔符將兩個變數的內容分隔開,同時,使用雙引號""將http_user_agent變數的內容引起,nginx中有很多內建變數,"remote_addr"變數和"http_user_agent"變數就是這些內建變數中的一員,使用"$變數名"即可呼叫變數,這些變數通常與http協議的請求和響應有關係,所以我們可以利用這些變數做很多事情,比如,利用它們記錄訪問日誌。聰明如你,一定想到了,日誌中記錄什麼內容,是由我們決定的,我們在日誌格式中設定了A變數、B變數、C變數,那麼日誌檔案中就會記錄A變數的值,B變數的值,以及C變數的值。
比如:
如果我們設定的日誌格式是"A變數 -- B變數 -- C變數",那麼在日誌中記錄的就是"A值 -- B值 -- C值"。
如果我們設定的日誌格式是"C變數 # A變數 - G變數 # B變數",那麼在日誌中記錄的就是"C值 # A值 - G值 # B值"。
也就是說,記錄哪些變數,以什麼樣的順序記錄這些變數,用什麼符號將這些變數的值分隔開,都可以通過"log_format"這條配置指令進行控制。
看到此處,我們再回過頭來看剛才的問題,為什麼預設情況下我們看到的訪問日誌長成那個樣子呢?這是因為,nginx有一個預設的日誌格式,當我們沒有在配置檔案中明確定義自己的日誌格式時,nginx會使用這個預設預定義的日誌格式記錄日誌,這個日誌格式的名字叫做"combined","combined"日誌格式的具體配置如下:
log_format combined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
如你所見,log_format配置指令的預設值就是這個名為"combined"的日誌格式,這個日誌格式中記錄了上述變數,那麼這些變數分別代表了什麼意思呢?我們來總結一下(此處先大致瞭解一下,不用糾結細節):
$remote_addr變數:記錄了客戶端的IP地址(普通情況下)。 $remote_user變數:當nginx開啟了使用者認證功能後,此變數記錄了客戶端使用了哪個使用者進行了認證。 $time_local變數:記錄了當前日誌條目的時間。 $request變數:記錄了當前http請求的方法、url和http協議版本。 $status變數:記錄了當前http請求的響應狀態,即響應的狀態碼,比如200、404等響應碼,都記錄在此變數中。 $body_bytes_sent變數:記錄了nginx響應客戶端請求時,傳送到客戶端的位元組數,不包含響應頭的大小。 $http_referer變數:記錄了當前請求是從哪個頁面過來的,比如你點了A頁面中的超連結才產生了這個請求,那麼此變數中就記錄了A頁面的url。 $http_user_agent變數:記錄了客戶端的軟體資訊,比如,瀏覽器的名稱和版本號。
這些變數並非一定會有對應的值,如果變數沒有對應的值,那麼日誌中會使用 "-" 作為預設值進行佔位。
你可能會有疑問,nginx中都有哪些變數能夠使用呢?這些變數又都是什麼含義呢?你可以從如下官網連結中找到答案:
http://nginx.org/en/docs/varindex.html
上述連結為官網提供的變數列表,我們能夠從上述連結中找到能夠使用的變數,其實,你需要搞明白一點,"變數"與"配置指令"一樣,都是隸屬於某個"模組"的,如果你想要使用某個"變數",則必須先確保你的nginx中包含了對應的"模組",不是所有"模組"都提供了可用的"變數",很多模組壓根就沒有對應的變數可用,在之前的文章中,我們已經總結了怎樣通過官方手冊找到"模組"的詳細資訊,以及"模組"都包含了哪些"指令",事實上你可以使用同樣的方法,找到"模組"都包含了哪些可用的"變數",舉一反三的時候到了,如果你找到了具體方法,歡迎在評論區留言,給出你的答案。
聊完這些,再次開啟access.log日誌檔案,是不是覺得那些日誌順眼多了。
其實,"log_format"配置指令只負責定義"日誌格式",如果想要使用對應的"日誌格式",還需要與"access_log"指令結合起來使用,才能真正的實現我們的目的,也就是說,"log_format"負責定義日誌格式,"access_log"負責使用定義好的日誌格式。這樣說不太容易理解,不如來看一個配置示例,如下:
log_format testformat '···一些變數的組合···'; access_log /opt/access.log testformat;
上例中,我們使用"log_format"指令定義了一個名為"testformat"的日誌格式,然後使用"access_log"指令引用了"testformat"日誌格式,"access_log /opt/access.log testformat"表示使用"testformat"日誌格式記錄日誌,日誌記錄在"/opt/access.log"檔案中。
在nginx中,log_format指令和access_log指令的預設值如下:
log_format combined '···各變數省略···'; access_log logs/access.log combined;
正是因為上述預設配置,決定了我們看到的日誌的樣子,如果你使用了yum源的方式安裝了nginx,預設情況下你會在配置檔案中找到一個名為"main"的日誌格式,預設就是使用這個"main"日誌格式記錄訪問日誌的。
不過有一點仍然需要注意,那就是"log_format"指令和"access_log"指令所處的上下文位置。
"log_format"指令只能配置在"http塊"中。
"access_log"指令可以配置在如下上下文中:
http, server, location, if in location, limit_except
"access_log"指令還有一些其他的引數我們沒有聊到,不過最基礎的引數我們已經總結完了,其他引數等用到的時候再行總結也不遲,關於nginx的訪問日誌,就先暫時總結到這裡,希望能夠對你有所幫助。

我的微信公眾號
關注"實用運維筆記"微信公眾號,當部落格中有新文章時,可第一時間得知哦~