Nginx内置变量以及日志格式变量参数详解
Nginx內(nèi)置變量以及日志格式變量參數(shù)詳解
$args #請(qǐng)求中的參數(shù)值 $query_string #同 $args $arg_NAME #GET請(qǐng)求中NAME的值 $is_args #如果請(qǐng)求中有參數(shù),值為"?",否則為空字符串 $uri #請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù),參數(shù)位于$args),可以不同于瀏覽器傳遞的$request_uri的值,它可以通過(guò)內(nèi)部重定向,或者使用index指令進(jìn)行修改,$uri不包含主機(jī)名,如"/foo/bar.html"。 $document_uri #同 $uri $document_root #當(dāng)前請(qǐng)求的文檔根目錄或別名 $host #優(yōu)先級(jí):HTTP請(qǐng)求行的主機(jī)名>"HOST"請(qǐng)求頭字段>符合請(qǐng)求的服務(wù)器名.請(qǐng)求中的主機(jī)頭字段,如果請(qǐng)求中的主機(jī)頭不可用,則為服務(wù)器處理請(qǐng)求的服務(wù)器名稱 $hostname #主機(jī)名 $https #如果開啟了SSL安全模式,值為"on",否則為空字符串。 $binary_remote_addr #客戶端地址的二進(jìn)制形式,固定長(zhǎng)度為4個(gè)字節(jié) $body_bytes_sent #傳輸給客戶端的字節(jié)數(shù),響應(yīng)頭不計(jì)算在內(nèi);這個(gè)變量和Apache的mod_log_config模塊中的"%B"參數(shù)保持兼容 $bytes_sent #傳輸給客戶端的字節(jié)數(shù) $connection #TCP連接的序列號(hào) $connection_requests #TCP連接當(dāng)前的請(qǐng)求數(shù)量 $content_length #"Content-Length" 請(qǐng)求頭字段 $content_type #"Content-Type" 請(qǐng)求頭字段 $cookie_name #cookie名稱 $limit_rate #用于設(shè)置響應(yīng)的速度限制 $msec #當(dāng)前的Unix時(shí)間戳 $nginx_version #nginx版本 $pid #工作進(jìn)程的PID $pipe #如果請(qǐng)求來(lái)自管道通信,值為"p",否則為"." $proxy_protocol_addr #獲取代理訪問(wèn)服務(wù)器的客戶端地址,如果是直接訪問(wèn),該值為空字符串 $realpath_root #當(dāng)前請(qǐng)求的文檔根目錄或別名的真實(shí)路徑,會(huì)將所有符號(hào)連接轉(zhuǎn)換為真實(shí)路徑 $remote_addr #客戶端地址 $remote_port #客戶端端口 $remote_user #用于HTTP基礎(chǔ)認(rèn)證服務(wù)的用戶名 $request #代表客戶端的請(qǐng)求地址 $request_body #客戶端的請(qǐng)求主體:此變量可在location中使用,將請(qǐng)求主體通過(guò)proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass傳遞給下一級(jí)的代理服務(wù)器 $request_body_file #將客戶端請(qǐng)求主體保存在臨時(shí)文件中。文件處理結(jié)束后,此文件需刪除。如果需要之一開啟此功能,需要設(shè)置client_body_in_file_only。如果將次文件傳 遞給后端的代理服務(wù)器,需要禁用request body,即設(shè)置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off $request_completion #如果請(qǐng)求成功,值為"OK",如果請(qǐng)求未完成或者請(qǐng)求不是一個(gè)范圍請(qǐng)求的最后一部分,則為空 $request_filename #當(dāng)前連接請(qǐng)求的文件路徑,由root或alias指令與URI請(qǐng)求生成 $request_length #請(qǐng)求的長(zhǎng)度 (包括請(qǐng)求的地址,http請(qǐng)求頭和請(qǐng)求主體) $request_method #HTTP請(qǐng)求方法,通常為"GET"或"POST" $request_time #處理客戶端請(qǐng)求使用的時(shí)間,單位為秒,精度毫秒; 從讀入客戶端的第一個(gè)字節(jié)開始,直到把最后一個(gè)字符發(fā)送給客戶端后進(jìn)行日志寫入為止。 $request_uri #這個(gè)變量等于包含一些客戶端請(qǐng)求參數(shù)的原始URI,它無(wú)法修改,請(qǐng)查看$uri更改或重寫URI,不包含主機(jī)名,例如:"/cnphp/test.php?arg=freemouse" $scheme #請(qǐng)求使用的Web協(xié)議,"http" 或 "https" $server_addr #服務(wù)器端地址,需要注意的是:為了避免訪問(wèn)linux系統(tǒng)內(nèi)核,應(yīng)將ip地址提前設(shè)置在配置文件中 $server_name #服務(wù)器名 $server_port #服務(wù)器端口 $server_protocol #服務(wù)器的HTTP版本,通常為 "HTTP/1.0" 或 "HTTP/1.1" $status #HTTP響應(yīng)代碼 $time_iso8601 #服務(wù)器時(shí)間的ISO 8610格式 $time_local #服務(wù)器時(shí)間(LOG Format 格式) $cookie_NAME #客戶端請(qǐng)求Header頭中的cookie變量,前綴"$cookie_"加上cookie名稱的變量,該變量的值即為cookie名稱的值 $http_NAME #匹配任意請(qǐng)求頭字段;變量名中的后半部分NAME可以替換成任意請(qǐng)求頭字段,如在配置文件中需要獲取http請(qǐng)求頭:"Accept-Language",$http_accept_language即可 $http_cookie $http_host #請(qǐng)求地址,即瀏覽器中你輸入的地址(IP或域名) $http_referer #url跳轉(zhuǎn)來(lái)源,用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的 $http_user_agent #用戶終端瀏覽器等信息 $http_x_forwarded_for $sent_http_NAME #可以設(shè)置任意http響應(yīng)頭字段;變量名中的后半部分NAME可以替換成任意響應(yīng)頭字段,如需要設(shè)置響應(yīng)頭Content-length,$sent_http_content_length即可 $sent_http_cache_control $sent_http_connection $sent_http_content_type $sent_http_keep_alive $sent_http_last_modified $sent_http_location $sent_http_transfer_encoding?
log_format有一個(gè)默認(rèn)的、無(wú)須設(shè)置的combined日志格式設(shè)置,相當(dāng)于Apache的combined日志格式,其具體參數(shù)如下:
log_format combined ?'$remote_addr-$remote_user [$time_local]'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ' "$request"?$status $body_bytes_sent'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ' "$http_referer" "$http_user_agent" ';
?
我現(xiàn)在使用的日志格式:
log_format access ?'$http_x_forwarded_for $remote_addr [$time_local] "http://$host" "$request" '
? ? ? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" "$http_user_agent" "$remote_user" ';
當(dāng)日志文件中記錄的值為"-"時(shí),表示為空
access為自定義的日志格式的名稱,使用時(shí)引用即可:
access_log ?/data/logs/nginx/ihouse_access.log access;
------------------------------------------------------------------------------------------------------
正確設(shè)置nginx中remote_addr和x_forwarded_for參數(shù)
什么是remote_addr:
remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務(wù)端根據(jù)客戶端的ip指定的,當(dāng)你的瀏覽器訪問(wèn)某個(gè)網(wǎng)站時(shí),假設(shè)中間沒(méi)有任何代理,那么網(wǎng)站的web服務(wù)器(Nginx,Apache等)就會(huì)把remote_addr設(shè)為你的機(jī)器IP,如果你用了某個(gè)代理,那么你的瀏覽器會(huì)先訪問(wèn)這個(gè)代理,然后再由這個(gè)代理轉(zhuǎn)發(fā)到網(wǎng)站,這樣web服務(wù)器就會(huì)把remote_addr設(shè)為這臺(tái)代理機(jī)器的IP
什么是x_forwarded_for:
正如上面所述,當(dāng)你使用了代理時(shí),web服務(wù)器就不知道你的真實(shí)IP了,為了避免這個(gè)情況,代理服務(wù)器通常會(huì)增加一個(gè)叫做x_forwarded_for的頭信息,把連接它的客戶端IP(即你的上網(wǎng)機(jī)器IP)加到這個(gè)頭信息里,這樣就能保證網(wǎng)站的web服務(wù)器能獲取到真實(shí)IP
使用HAProxy做反向代理時(shí):
通常網(wǎng)站為了支撐更大的訪問(wèn)量,會(huì)增加很多web服務(wù)器,并在這些服務(wù)器前面增加一個(gè)反向代理(如HAProxy),它可以把負(fù)載均勻的分布到這些機(jī)器上。你的瀏覽器訪問(wèn)的首先是這臺(tái)反向代理,它再把你的請(qǐng)求轉(zhuǎn)發(fā)到后面的web服務(wù)器,這就使得web服務(wù)器會(huì)把remote_addr設(shè)為這臺(tái)反向代理的IP,為了能讓你的程序獲取到真實(shí)的客戶端IP,你需要給HAProxy增加以下配置
? ?option forwardfor
它的作用就像上面說(shuō)的,增加一個(gè)x_forwarded_for的頭信息,把客戶端的ip添加進(jìn)去,否則的話經(jīng)測(cè)試為空值
如上面的日志格式所示:$http_x_forwarded_for 是客戶端真實(shí)的IP地址,$remote_addr是前端Haproxy的IP地址
或者:
當(dāng)Nginx處在HAProxy后面時(shí),就會(huì)把remote_addr設(shè)為HAProxy的IP,這個(gè)值其實(shí)是毫無(wú)意義的,你可以通過(guò)nginx的realip模塊,讓它使用x_forwarded_for里的值。使用這個(gè)模塊需要重新編譯Nginx,增加--with-http_realip_module參數(shù)
./configure ?--user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module \ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???--with-http_realip_module?--http-log-path=/data/logs/nginx/access.log --error-log-path=/data/logs/nginx/error.log
? ? ?set_real_ip_from 10.1.10.0/24;
? ? ?real_ip_header X-Forwarded-For;
上面的兩行配置就是把從10.1.10這一網(wǎng)段過(guò)來(lái)的請(qǐng)求全部使用X-Forwarded-For里的頭信息作為remote_addr,這樣此時(shí)remote_addr就是客戶端真實(shí)的IP地址
--------------------------------------------------------------
X-Forwarded-For 和 X-Real-IP 獲取客戶端的ip的區(qū)別:
一般來(lái)說(shuō),X-Forwarded-For是用于記錄代理信息的,每經(jīng)過(guò)一級(jí)代理(匿名代理除外),代理服務(wù)器都會(huì)把這次請(qǐng)求的來(lái)源IP追加在X-Forwarded-For中 來(lái)自4.4.4.4的一個(gè)請(qǐng)求,header包含這樣一行?X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3?代表 請(qǐng)求由1.1.1.1發(fā)出,經(jīng)過(guò)三層代理,第一層是2.2.2.2,第二層是3.3.3.3,而本次請(qǐng)求的來(lái)源IP 4.4.4.4是第三層代理 而X-Real-IP,一般只記錄真實(shí)發(fā)出請(qǐng)求的客戶端IP,上面的例子,如果配置了X-Read-IP,將會(huì)是?X-Real-IP: 1.1.1.1?所以 ,如果只有一層代理,這兩個(gè)頭的值就是一樣的?
?
?
?
所有相關(guān)變量具體請(qǐng)?jiān)斂垂倬W(wǎng):
http://nginx.org/en/docs/varindex.html
http://blog.csdn.net/njxdy/article/details/9998481
?
總結(jié)
以上是生活随笔為你收集整理的Nginx内置变量以及日志格式变量参数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mysql安全措施
- 下一篇: 利用redis漏洞远程添加计划任务挖取比