Nginx常用變數大全
目錄
1,$arg_name
請求行中,名稱為name 的引數的值。比如,當請求行是"GET /nginx/varindex/?from=rss HTTP/1.1"時,$arg_from的值是"rss"。當請求行中沒有名稱為name 的引數時,$arg_name 的值是空字串
2,$is_args
如果請求行中包含引數,那麼$is_args的值是"?",否則是空字串
3,$args、$query_string
請求行中的全部引數(也就是查詢字串)。比如,當請求行是"GET /nginx/varindex/?a=b&c=d HTTP/1.1"時,$args的值是a=b&c=d。當請求行中沒有任何引數時,$args的值是空字串
4,$cookie_name
名稱為name 的cookie的值
5,$request
完整的原始的請求行。比如:"GET /b/../a?a=b HTTP/1.1"(uri不會被規範化)
6,$http_name
用來獲取任意請求頭的值。
HTTP header的命名方式是:每個單詞的首字母大寫,其餘字母小寫,單詞之間用中劃線("-")連線。比如,User-Agent、Content-Type、X-Forwarded-For等。
請求頭名稱和name 之間的轉換方式是:將請求頭名稱轉換成小寫形式,並將中劃線("-")替換成下劃線("_"),比如:$http_x_forwarded_for
7,$request_length
請求的長度,包含請求行、請求頭和請求體
8,$request_method
請求方法,比如GET或POST
9,$request_uri
完整的原始的URI(帶引數)
10,$scheme
請求模式,http或https
11,$content_length
"Content-Length"請求頭的值
12,$content_type
"Content-Type"請求頭的值
13,$document_root
應用於當前請求的root或alias指令的值
14,$document_uri、$uri
規範化後的URI。所謂的規範化是指:將 以"%XX"形式編碼的文字進行解碼 之後,解決對相對地址"."和".."的引用,並將多個相鄰的"/"壓縮成一個。
請求處理期間,$uri的值可能發生改變,比如在發生內部重定向或者使用index檔案的時候
15,$host
Nginx按照下面的優先順序順序,設定$host的值:
- 從請求行中獲取到的主機名
- 從"Host"請求頭中獲取到的主機名
- 處理請求的虛擬主機的名稱
一般情況下,請求行中只會包含 Request URI ,也就是 URI 和 QUERY STRING ,不會包含 host name。但是,當使用Nginx做HTTP正向代理伺服器的時候,請求行中會包含host name
16,$proxy_add_x_fowarded_for
在客戶端傳遞來的X-Forwarded-For請求頭後面追加$remote_addr(用逗號分隔)。如果客戶端沒有傳遞X-Forwarded-For請求頭,那麼該變數等於$remote_addr。
比如,客戶端傳遞來的XFF請求頭是:192.168.1.1, 192.168.1.2;$remote_addr是192.168.1.3。那麼$proxy_add_x_forwarded_for等於192.168.1.1, 192.168.1.2, 192.168.1.3
17,$realpath_root
應用於當前請求的root或alias指令的值所對應的絕對路徑,所有的符號連線都會被解析成真實路徑
18,$server_protocol
請求協議,通常是"HTTP/1.0"、"HTTP/1.1"、"HTTP/2.0"
19,$request_filename
當前請求對應的資源的路徑。
該變數的值是基於root(或alias)指令的值,以及請求的URI計算出來的。比如,當root指令的值是/data/w3,URI是/images/logo.jpg時,該變數等於/data/w3/images/logo.jpg
1,$body_bytes_sent
下發給客戶端的位元組數(不包含響應頭)
2,$request_time
從 接收到請求的第一個位元組 到 把響應的最後一個位元組傳送給客戶端,所經歷的時間。單位是秒,精確到毫秒
3,$send_http_name
用於獲取下發給客戶端的任意響應頭的值。響應頭名稱和name 之間的轉換方式是:將響應頭名稱轉換成小寫形式,並將中劃線("-")替換成下劃線("_")
4,$status
下發給客戶端的響應碼
1,$binary_remote_addr
二進位制形式的客戶端地址。對於IPV4地址,該值的長度是4位元組,對於IPV6地址該值的長度是16位元組
2,$connection
連線的序號
3,$connection_requests
在開啟keepalive的情況下,客戶端可以使用一條連線發起多個請求,該變數用於記錄通過一條連線發起的請求數
4,$date_local
本地時區的當前時間
5,$date_gmt
GMT格式的當前時間
6,$hostname
執行Nginx的主機的主機名,比如:vm0 16_centos
7,$msec
當前的時間戳,精確到毫秒。比如,1551609371.088
8,$nginx_version
Nginx的版本號
9,$pid
Worker程序的PID
10,$proxy_host
在proxy_pass指令中指定的被代理服務的名稱(可能是upstream的名稱)
11,$proxy_port
在proxy_pass指令中指定的被代理服務的埠。如果在proxy_pass指令中未指定埠,那麼該變數等於協議的預設埠
12,$remote_addr
客戶端地址
13,$remote_port
客戶端埠
14,$remote_user
在開啟basic authentication的時候,客戶端所使用的使用者名稱
15,$server_addr
接收請求的虛擬主機的地址
16,$server_port
接收請求的虛擬主機的埠
17,$server_name
接收請求的虛擬主機的名稱
18,$time_iso8601
ISO 8601標準格式的本地時間
19,$time_local
通用日誌格式的本地時間
1,$upstream_addr
儲存upstream server的ip地址和埠,或Unix套接字的路徑。在請求處理期間,如果請求被代理到多個upstream server,那麼它們的地址之間用","分隔,比如:"192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock"。當發生(由error_page等發起的)從一個server group到另外一個server group的內部重定向時,不同的server group之間用":"分隔,比如:"192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80"。如果server group中沒有可用的server,那麼該變數的值是server group的名字
2,$upstream_bytes_received
從upstream server接收到的位元組數。來自於多個連線的值,像$upstream_addr中的地址一樣,用","和":"分隔
3,$upstream_bytes_sent(Nginx 1.15.8 起 可用)
傳送到upstream server的位元組數。來自多個連線的值,像$upstream_addr中的地址一樣,用","和":"分隔
4,$upstream_cache_status
該變數用來顯示快取的使用情況。其值是:
- HIT:命中快取
- MISS:未命中快取
- EXPIRED:快取已過期
- BYPASS:客戶端強制不使用快取
- STALE:使用了過期的快取。可以通過proxy_cache_use_stale指令,指定在什麼情況下,使用過期的快取,比如http_502、error、timeout等
- UPDATING:快取正在更新
-
REVALIDATE:快取重新生效
在啟用客戶端快取的情況下 ,服務端可以通過以下兩種方式,來判斷客戶端的快取是否失效:
- ETag響應頭 和 If-None-Match請求頭
- Last-Modified響應頭 和 If-Modified-Since請求頭
以後,客戶端再訪問該URL時,會帶上If-Modified-Since和If-None-Match請求頭。其中,If-Modified-Since的值是上次返回的響應中的Last-Modified頭的值,If-None-Match的值是上次返回的響應中的ETag頭的值。
下面是Nginx的處理流程,與別的文件的描述不同,Nginx的相關原始碼在:github ,Mozilla的說明在:MDN
- 如果存在IMS請求頭,並且IMS的值小於資源的最後修改時間,那麼返回200,以及新的ETag和Last-Modified
- 如果存在INM請求頭,並且資源的ETag值與INM的值不匹配,那麼返回200,以及新的Etag和Last-Modified
- 否則,認為資源未被修改,返回304,以及空的響應體
proxy_cache_revalidate
時,Nginx會通過If-Modified-Since和If-None-Match請求頭,來使過期的快取條目重新生效
5,$upstream_connect_time
建立到upstream server的連線所花費的時間。單位是秒,精確到毫秒。對於SSL連線,該時間也包含SSL握手所花費的時間。建立多個連線所花費的時間之間,像$upstream_addr中的地址一樣,用","和":"分隔
6,$upstream_cookie_name
upstream server返回的"Set-Cookie"響應頭中的,名稱name 的cookie的值。只有最後一個server返回的響應中的cookie會被儲存
7,$upstream_header_time
從upstream server接收響應頭所花費的時間。單位是秒,精確到毫秒。多個響應所花費的時間之間,像$upstream_addr中的地址一樣,用","和":"分隔
8,$upstream_http_name
用於獲取upstream server返回的任意響應頭的值。
響應頭名稱和name 之間的轉換方式是:將響應頭名稱轉換成小寫形式,並將中劃線替換成下劃線。
只有最後一個server的響應頭會被儲存
9,$upstream_response_length
儲存從upstream server獲取到的響應的長度。單位是位元組。多個響應的長度之間,像$upstream_addr中的地址一樣,用","和":"分隔
10,$upstream_response_time
儲存從upstream server接收響應所花費的時間。單位是秒,精確到毫秒。多個響應所花費的時間之間,像$upstream_addr中的地址一樣,用","和":"分隔
11,$upstream_status
儲存從upstream server獲取到的響應的狀態碼。多個響應的狀態碼之間,像$upstream_addr中的地址一樣,用","和":"分隔
本文在Nginx 1.12.2下測試通過