log nginx 客户端请求大小_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文件中,那么只需要進行如下配置即可:
Shell
access_log?/opt/access.log;
1
access_log?/opt/access.log;
access_log指令還有一些別的用法,不過我們暫且先放下不聊,我們先來仔細看看默認的訪問日志是什么樣子的。
首先,打開你的谷歌瀏覽器,訪問nginx默認的index.html頁面,在瀏覽器的地址欄中輸入"http://10.1.1.72/index.html"進行訪問,然后,打開logs/access.log,你會發現類似如下的日志:
Shell
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"
1
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"日志格式的具體配置如下:
Shell
log_format?combined?'$remote_addr?-?$remote_user?[$time_local]?"$request"?$status?$body_bytes_sent?"$http_referer"?"$http_user_agent"';
1
log_format?combined?'$remote_addr?-?$remote_user?[$time_local]?"$request"?$status?$body_bytes_sent?"$http_referer"?"$http_user_agent"';
如你所見,log_format配置指令的默認值就是這個名為"combined"的日志格式,這個日志格式中記錄了上述變量,那么這些變量分別代表了什么意思呢?我們來總結一下(此處先大致了解一下,不用糾結細節):
Shell
$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變量:記錄了客戶端的軟件信息,比如,瀏覽器的名稱和版本號。
1
2
3
4
5
6
7
8
$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中都有哪些變量能夠使用呢?這些變量又都是什么含義呢?你可以從如下官網鏈接中找到答案:
上述鏈接為官網提供的變量列表,我們能夠從上述鏈接中找到能夠使用的變量,其實,你需要搞明白一點,"變量"與"配置指令"一樣,都是隸屬于某個"模塊"的,如果你想要使用某個"變量",則必須先確保你的nginx中包含了對應的"模塊",不是所有"模塊"都提供了可用的"變量",很多模塊壓根就沒有對應的變量可用,在之前的文章中,我們已經總結了怎樣通過官方手冊找到"模塊"的詳細信息,以及"模塊"都包含了哪些"指令",事實上你可以使用同樣的方法,找到"模塊"都包含了哪些可用的"變量",舉一反三的時候到了,如果你找到了具體方法,歡迎在評論區留言,給出你的答案。
聊完這些,再次打開access.log日志文件,是不是覺得那些日志順眼多了。
其實,"log_format"配置指令只負責定義"日志格式",如果想要使用對應的"日志格式",還需要與"access_log"指令結合起來使用,才能真正的實現我們的目的,也就是說,"log_format"負責定義日志格式,"access_log"負責使用定義好的日志格式。這樣說不太容易理解,不如來看一個配置示例,如下:
Shell
log_format?testformat?'···一些變量的組合···';
access_log?/opt/access.log?testformat;
1
2
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指令的默認值如下:
Shell
log_format?combined?'···各變量省略···';
access_log?logs/access.log?combined;
1
2
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的訪問日志,就先暫時總結到這里,希望能夠對你有所幫助。
總結
以上是生活随笔為你收集整理的log nginx 客户端请求大小_nginx的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: data后缀文件解码_WMA文件格式和解
- 下一篇: react页面数据过多怎么办_解决 R