與request有關(guān)的變量
1净当,$arg_name
請(qǐng)求行中,名稱為name的參數(shù)的值蕴潦。比如像啼,當(dāng)請(qǐng)求行是"GET /nginx/varindex/?from=rss HTTP/1.1"時(shí),arg_name的值是空字符串
2,$is_args
如果請(qǐng)求行中包含參數(shù)萄传,那么$is_args的值是"?"甚颂,否則是空字符串
3蜜猾,
query_string
請(qǐng)求行中的全部參數(shù)(也就是查詢字符串)。比如蹭睡,當(dāng)請(qǐng)求行是"GET /nginx/varindex/?a=b&c=d HTTP/1.1"時(shí)衍菱,args的值是空字符串
4脊串,$cookie_name
名稱為name的cookie的值
5辫呻,$request
完整的原始的請(qǐng)求行。比如:"GET /b/../a?a=b HTTP/1.1"(uri不會(huì)被規(guī)范化)
6琼锋,$http_name
用來獲取任意請(qǐng)求頭的值放闺。
HTTP header的命名方式是:每個(gè)單詞的首字母大寫,其余字母小寫缕坎,單詞之間用中劃線("-")連接怖侦。比如,User-Agent谜叹、Content-Type匾寝、X-Forwarded-For等。
請(qǐng)求頭名稱和name之間的轉(zhuǎn)換方式是:將請(qǐng)求頭名稱轉(zhuǎn)換成小寫形式荷腊,并將中劃線("-")替換成下劃線("_")艳悔,比如:$http_x_forwarded_for
7,$request_length
請(qǐng)求的長(zhǎng)度女仰,包含請(qǐng)求行猜年、請(qǐng)求頭和請(qǐng)求體
8,$request_method
請(qǐng)求方法疾忍,比如GET或POST
9码倦,$request_uri
完整的原始的URI(帶參數(shù))
10,$scheme
請(qǐng)求模式锭碳,http或https
11袁稽,$content_length
"Content-Length"請(qǐng)求頭的值
12,$content_type
"Content-Type"請(qǐng)求頭的值
13擒抛,$document_root
應(yīng)用于當(dāng)前請(qǐng)求的root或alias指令的值
14推汽,
uri
規(guī)范化后的URI歧沪。所謂的規(guī)范化是指:將 以"%XX"形式編碼的文本進(jìn)行解碼 之后歹撒,解決對(duì)相對(duì)地址"."和".."的引用,并將多個(gè)相鄰的"/"壓縮成一個(gè)诊胞。
請(qǐng)求處理期間暖夭,$uri的值可能發(fā)生改變,比如在發(fā)生內(nèi)部重定向或者使用index文件的時(shí)候
15撵孤,$host
Nginx按照下面的優(yōu)先級(jí)順序迈着,設(shè)置$host的值:
- 從請(qǐng)求行中獲取到的主機(jī)名
- 從"Host"請(qǐng)求頭中獲取到的主機(jī)名
- 處理請(qǐng)求的虛擬主機(jī)的名稱
一般情況下,請(qǐng)求行中只會(huì)包含 Request URI 邪码,也就是 URI 和 QUERY STRING 裕菠,不會(huì)包含 host name。但是闭专,當(dāng)使用Nginx做HTTP正向代理服務(wù)器的時(shí)候奴潘,請(qǐng)求行中會(huì)包含host name
16旧烧,$proxy_add_x_fowarded_for
在客戶端傳遞來的X-Forwarded-For請(qǐng)求頭后面追加remote_addr掘剪。
比如,客戶端傳遞來的XFF請(qǐng)求頭是:192.168.1.1, 192.168.1.2奈虾;proxy_add_x_forwarded_for等于192.168.1.1, 192.168.1.2, 192.168.1.3
17,$realpath_root
應(yīng)用于當(dāng)前請(qǐng)求的root或alias指令的值所對(duì)應(yīng)的絕對(duì)路徑愚墓,所有的符號(hào)連接都會(huì)被解析成真實(shí)路徑
18予权,$server_protocol
請(qǐng)求協(xié)議,通常是"HTTP/1.0"浪册、"HTTP/1.1"扫腺、"HTTP/2.0"
19,$request_filename
當(dāng)前請(qǐng)求對(duì)應(yīng)的資源的路徑村象。
該變量的值是基于root(或alias)指令的值笆环,以及請(qǐng)求的URI計(jì)算出來的。比如厚者,當(dāng)root指令的值是/data/w3躁劣,URI是/images/logo.jpg時(shí),該變量等于/data/w3/images/logo.jpg
與response有關(guān)的變量
1库菲,$body_bytes_sent
下發(fā)給客戶端的字節(jié)數(shù)(不包含響應(yīng)頭)
2账忘,$request_time
從 接收到請(qǐng)求的第一個(gè)字節(jié) 到 把響應(yīng)的最后一個(gè)字節(jié)發(fā)送給客戶端,所經(jīng)歷的時(shí)間熙宇。單位是秒鳖擒,精確到毫秒
3,$send_http_name
用于獲取下發(fā)給客戶端的任意響應(yīng)頭的值烫止。響應(yīng)頭名稱和name之間的轉(zhuǎn)換方式是:將響應(yīng)頭名稱轉(zhuǎn)換成小寫形式蒋荚,并將中劃線("-")替換成下劃線("_")
4,$status
下發(fā)給客戶端的響應(yīng)碼
常用變量
1馆蠕,$binary_remote_addr
二進(jìn)制形式的客戶端地址期升。對(duì)于IPV4地址,該值的長(zhǎng)度是4字節(jié)互躬,對(duì)于IPV6地址該值的長(zhǎng)度是16字節(jié)
2播赁,$connection
連接的序號(hào)
3,$connection_requests
在開啟keepalive的情況下吨铸,客戶端可以使用一條連接發(fā)起多個(gè)請(qǐng)求行拢,該變量用于記錄通過一條連接發(fā)起的請(qǐng)求數(shù)
4,$date_local
本地時(shí)區(qū)的當(dāng)前時(shí)間
5诞吱,$date_gmt
GMT格式的當(dāng)前時(shí)間
6舟奠,$hostname
運(yùn)行Nginx的主機(jī)的主機(jī)名,比如:vm016_centos
7房维,$msec
當(dāng)前的時(shí)間戳沼瘫,精確到毫秒。比如咙俩,1551609371.088
8耿戚,$nginx_version
Nginx的版本號(hào)
9,$pid
Worker進(jìn)程的PID
10阿趁,$proxy_host
在proxy_pass指令中指定的被代理服務(wù)的名稱(可能是upstream的名稱)
11膜蛔,$proxy_port
在proxy_pass指令中指定的被代理服務(wù)的端口。如果在proxy_pass指令中未指定端口脖阵,那么該變量等于協(xié)議的默認(rèn)端口
12皂股,$remote_addr
客戶端地址
13,$remote_port
客戶端端口
14命黔,$remote_user
在開啟basic authentication的時(shí)候呜呐,客戶端所使用的用戶名
15,$server_addr
接收請(qǐng)求的虛擬主機(jī)的地址
16悍募,$server_port
接收請(qǐng)求的虛擬主機(jī)的端口
17蘑辑,$server_name
接收請(qǐng)求的虛擬主機(jī)的名稱
18,$time_iso8601
ISO 8601標(biāo)準(zhǔn)格式的本地時(shí)間
19坠宴,$time_local
通用日志格式的本地時(shí)間
與upstream相關(guān)的變量
1洋魂,$upstream_addr
保存upstream server的ip地址和端口,或Unix套接字的路徑喜鼓。在請(qǐng)求處理期間忧设,如果請(qǐng)求被代理到多個(gè)upstream server,那么它們的地址之間用","分隔颠通,比如:"192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock"址晕。當(dāng)發(fā)生(由error_page等發(fā)起的)從一個(gè)server group到另外一個(gè)server group的內(nèi)部重定向時(shí),不同的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接收到的字節(jié)數(shù)刘陶。來自于多個(gè)連接的值,像$upstream_addr中的地址一樣牢撼,用","和":"分隔
3匙隔,$upstream_bytes_sent(Nginx 1.15.8 起 可用)
發(fā)送到upstream server的字節(jié)數(shù)。來自多個(gè)連接的值熏版,像$upstream_addr中的地址一樣纷责,用","和":"分隔
4捍掺,$upstream_cache_status
該變量用來顯示緩存的使用情況。其值是:
HIT:命中緩存
MISS:未命中緩存
EXPIRED:緩存已過期
BYPASS:客戶端強(qiáng)制不使用緩存
STALE:使用了過期的緩存再膳⊥ξ穑可以通過proxy_cache_use_stale指令,指定在什么情況下喂柒,使用過期的緩存不瓶,比如http_502、error灾杰、timeout等
UPDATING:緩存正在更新
-
REVALIDATE:緩存重新生效
在啟用客戶端緩存的情況下蚊丐,服務(wù)端可以通過以下兩種方式,來判斷客戶端的緩存是否失效:ETag響應(yīng)頭 和 If-None-Match請(qǐng)求頭
Last-Modified響應(yīng)頭 和 If-Modified-Since請(qǐng)求頭當(dāng)客戶端訪問一個(gè)URL的時(shí)候艳吠,如果客戶端沒有緩存或緩存失效麦备,那么服務(wù)端會(huì)下發(fā)資源,以及Last-Modified(資源的最后修改時(shí)間)和ETag(Entity Tag讲竿,服務(wù)端計(jì)算的資源指紋泥兰,當(dāng)資源發(fā)生改變時(shí),ETag也會(huì)改變)響應(yīng)頭题禀。
以后鞋诗,客戶端再訪問該URL時(shí),會(huì)帶上If-Modified-Since和If-None-Match請(qǐng)求頭迈嘹。其中削彬,If-Modified-Since的值是上次返回的響應(yīng)中的Last-Modified頭的值,If-None-Match的值是上次返回的響應(yīng)中的ETag頭的值秀仲。
下面是Nginx的處理流程融痛,與別的文檔的描述不同,Nginx的相關(guān)源碼在:github神僵,Mozilla的說明在:MDN如果存在IMS請(qǐng)求頭雁刷,并且IMS的值小于資源的最后修改時(shí)間,那么返回200保礼,以及新的ETag和Last-Modified
如果存在INM請(qǐng)求頭沛励,并且資源的ETag值與INM的值不匹配,那么返回200炮障,以及新的Etag和Last-Modified
否則目派,認(rèn)為資源未被修改,返回304胁赢,以及空的響應(yīng)體當(dāng)開啟
proxy_cache_revalidate
時(shí)企蹭,Nginx會(huì)通過If-Modified-Since和If-None-Match請(qǐng)求頭,來使過期的緩存條目重新生效
5,$upstream_connect_time
建立到upstream server的連接所花費(fèi)的時(shí)間谅摄。單位是秒徒河,精確到毫秒。對(duì)于SSL連接螟凭,該時(shí)間也包含SSL握手所花費(fèi)的時(shí)間虚青。建立多個(gè)連接所花費(fèi)的時(shí)間之間它呀,像$upstream_addr中的地址一樣螺男,用","和":"分隔
6,$upstream_cookie_name
upstream server返回的"Set-Cookie"響應(yīng)頭中的纵穿,名稱name的cookie的值下隧。只有最后一個(gè)server返回的響應(yīng)中的cookie會(huì)被保存
7,$upstream_header_time
從upstream server接收響應(yīng)頭所花費(fèi)的時(shí)間谓媒。單位是秒淆院,精確到毫秒。多個(gè)響應(yīng)所花費(fèi)的時(shí)間之間句惯,像$upstream_addr中的地址一樣土辩,用","和":"分隔
8,$upstream_http_name
用于獲取upstream server返回的任意響應(yīng)頭的值抢野。
響應(yīng)頭名稱和name之間的轉(zhuǎn)換方式是:將響應(yīng)頭名稱轉(zhuǎn)換成小寫形式拷淘,并將中劃線替換成下劃線。
只有最后一個(gè)server的響應(yīng)頭會(huì)被保存
9指孤,$upstream_response_length
保存從upstream server獲取到的響應(yīng)的長(zhǎng)度启涯。單位是字節(jié)。多個(gè)響應(yīng)的長(zhǎng)度之間恃轩,像$upstream_addr中的地址一樣结洼,用","和":"分隔
10,$upstream_response_time
保存從upstream server接收響應(yīng)所花費(fèi)的時(shí)間叉跛。單位是秒松忍,精確到毫秒。多個(gè)響應(yīng)所花費(fèi)的時(shí)間之間筷厘,像$upstream_addr中的地址一樣鸣峭,用","和":"分隔
11,$upstream_status
保存從upstream server獲取到的響應(yīng)的狀態(tài)碼敞掘。多個(gè)響應(yīng)的狀態(tài)碼之間叽掘,像$upstream_addr中的地址一樣,用","和":"分隔