2.7 日誌模塊:
文檔連接:http://nginx.org→documentation→ngx_http_log_module
變量含義:
$remote_user :客戶端用戶名,一般會爲“-”。
$time_local :客戶端的訪問時間,格式一般爲"26/Jun/2014:14:44:34 +0800”。
$request :客戶端請求的URI。
請求html頁面時爲"/index.html HTTP/1.1",
請求php頁面爲"/index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1”
$status :響應狀態碼。這裏正常的話就是"200"。
$body_bytes_sent:服務器向客戶端發送的字節數。
$http_referer:引用客戶端來源,說明客戶端是從哪個地方來的,可能就是盜鏈。
比如在http://172.16.100.18/index.html中添加http://172.16.100.1/index.html網頁中的內容鏈接時,在172.16.100.1中的日誌中就可以看到請求客戶端是172.16.100.18,而不是Real-Client-IP。
如果Real-Client-IP是請求php內容時,那麼日誌中可能還會包含172.16.100.1對自己的請求。
下面是http://172.16.100.18/index.html中可以使用html超鏈接語言(注意是英文引號):
<html> <head><title>Welcome</title></head> <body> <h1><font size="10" color="blue">大片鏈接</font></h1> <a href="http://172.16.100.1/index.html">index.html</a> <br/><a href="http://172.16.100.1/index.php">index.php</a> </body> </html>
$http_user_agent:用戶的瀏覽器型號,一般會先解析國產瀏覽器,然後是外國瀏覽器
遨遊:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.800 Chrome/30.0.1599.101 Safari/537.36
IE10:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64; Trident/6.0)
$http_x_forwarded_for:nginx爲後端服務器時,需要記錄真實客戶端IP時,
前端的nginx代理服務器需要在location段添加
"proxy_set_header realip $remote_addr"
此字段也需要更改爲"$http_realip"(此格式無下劃線,如果保持原格式,前端需要多加幾個參數)
如果後端爲Apache,則需要在日誌格式定義段combined中添加"%{realip}i"以記錄真實客戶端IP。
access_log off表示關閉訪問日誌,比如當訪問:http://IP/status時。
2.8 訪問控制模塊
ngx_http_access_module(基於IP的認證)
location / { root /web/htdocs; index index.html; deny 192.168.1.1; allow 192.168.1.0/24; deny 172.16.100.5; allow 172.16.100.0/16; deny all; }
nginx_http_auth_basic_module(基於用戶的認證)
location /yinsi { root /web/htdocs; index index.html; auth_basic "user_auth"; 這表示啓用basic認證,並且這個authname叫什麼 auth_basic_user_file /etc/nginx/.user_auth; 用戶認證的文件在哪裏 這個文件藉助於Apache的htpasswd創建。 } #htpasswd -c -m /etc/nginx/.user_auth yh 這裏輸入兩次密碼。 #elinks
2.9自動索引功能
autoindex
當用戶訪問的路徑下不使用首頁,或沒有首頁文件,那麼就可以將其路徑下的所有文件以列表形式顯示出來。這種方式比較危險,一般是極力避免的,但是作爲下載站點還是很好的。
location /download { root /www/htdocs/download; autoindex on; autoindex localtime; 顯示頁面文件所在主機準確時間 autoindex_exact_size on;顯示頁面文件的準確大小,否則只是模糊值。 } #elinks http://IP/download
3.0添加自定義響應首部:
ngx_http_headers_module
格式:
add_header custom-header-name nginx內置變量
可以添加的"nginx內置變量"頭部信息有很多,這些變量可以通過這個路徑獲得:ngx_http_core_module→Embedded Variables
add_header server_ip $server_addr添加一個服務器IP的頭部,用以說明代理服務器時誰 使用Google瀏覽器時→F12→Network→index.html→Response Headers→Real-Client-IP
3.1重寫模塊:
nginx_http_rewrite_module:
用來完成URL重寫的:比如本來訪問的是http://www.yh_old.com/bbs/index.html,但是由於各種原因,不管事bbs目錄不存在了,或者是域名更改了,都可以將舊URL重寫至新URL:http://www.yh_new/p_w_picpaths/index.html。此部分纔是難點。
Syntax:rewrite regex replacement [flag]; Default:— Context:server, location, if
簡單的重寫:
location / { root /web/htdocs; index index.html index.php; rewrite /bbs/(.*)$ /p_w_picpaths/$1 last; } 這裏表示訪問http://IP/bbs/目錄下的任何內容,都重寫至http://IP/p_w_picpaths/目錄下。這裏使用了正在表達式的分組,但是在引用分組時的"\1"卻必須改成"$1"。
重寫規則有的時候是由很多條的,所以定義各條規則之間的關係是必須的:
第一種情況:
last:在第一次重寫完成後,直接跳出,然後再使用新的URL重新進行rewrite規則匹配。
brak:在第一次重寫完成後,直接從新的URI去訪問了,不再繼續rewrite規則匹配了。
如果location後面有具體路徑、或者在IF語句中都要使用break。
redirect:使用替換機制,不是重寫。類似於last,第一次替換後,需要重頭檢查一遍。
返回302代碼,臨時重定向,也叫顯示重定向。
permanent:返回301代碼,永久重定向,也叫隱式重定向。
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } 注意:這裏是在server段,表示所有media和audio目錄下的內容都定向到mp3目錄中,即使用last也不會發生循環現象。
location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } 這裏表示所有http://IP/download都會進行重寫判斷,而rewrite規則表示只要匹配一次就直接從新的URL走了。否則,就會在循環10次後,返回500錯誤。
IF判斷:
Syntax:if (condition) { ... } Default:— Context:server, location
... if ($request_uri ~* \.(jpg|png|gif|html)$) { ... } ... 將URI進行if判斷,如果符合後面的條件,則... 這種形式與location雷同,但是更復雜了,所以一般不這麼用。
condition中的正則匹配:
~ :與指定的正則模式匹配時,返回的是“真”。匹配時區分字符的大小寫。
~* :功能同上,但是匹配時,不分區字符的大小寫。
!~ :與指定的正則模式不匹配時,返回的纔是“真”。區分大小寫。
!~*:同上,但不區分大小寫。
condition中的文件及目錄匹配:
-f,!-f:判斷指定路徑是否存在,且爲文件。
-d,!-d:判斷指定路徑是否存在,且爲目錄。
-e,!-e:判斷指定路徑的目錄或文件是否存在。
-x,!-x:判斷指定路徑的文件是否存在,且可以執行。
IF的實際應用場景是用於匹配nginx的內置變量值,這是location做不到的:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } 變量意義日誌部分已經講過,表示用戶瀏覽器,如果是IE,就重寫到msie目錄下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } 變量表示用戶的cookie信息, if ($request_method = POST) { return 405; } 表示請求方法爲POST時,就返回405錯誤。 if ($request_method == PUT) { proxy_pass http://upload.yh.com; } 如果用戶的請求方法爲PUT上傳,則將其代理至後端upstream。 #curl -T /etc/fstab http://IP if ($slow) { limit_rate 10k; } $slow是一個布爾值(非1即0),當爲1時,表示進行限速。 if ($invalid_referer) { return 403; } 發生非法引用,就返回403錯誤碼。
上面有return、set,也屬於重寫模塊,所以也需要解釋下:
return:停止處理並返回指定狀態碼(code)給客戶端,URL中可以包含變量。
Syntax:return code [text]; return code URL; return URL; Default:— Context:server, location, if
set:定義一個變量並賦值,值可以是文本,變量或者文本變量混合體。
Syntax:set $variable value; Default:— Context:server, location, if
3.2狀態信息輸出:
ngx_http_stub_status_module:
Syntax:stub_status; Default:— Context:server, location
location /status { stub_status on; access_log off; auth_basic "stub_user_auth"; auth_basic_user_file /etc/nginx/.stub_user_auth; } 一般在啓用狀態信息查看功能時需要加認證功能,且關閉日誌,防止敏感信息外泄。 #elinks http://IP/status Active connections: 3 server accepts handled requests 3 3 1 Reading: 0 Writing: 1 Waiting: 2
Active connections:目前的活動連接數。 accepts: 已經接受的連接數。 handled: 已經處理的連接數。 requests:已經處理過的客戶端請求數。(一次tcp握手連接,可以有多個請求) reading: 正在接進來的請求數。 writing: 響應的用戶請求數。 waiting: 目前處理reading+writing過程的連接。
3.3壓縮模塊:
ngx_http_gzip_module
Syntax:gzip on | off; Default:gzip off; Context:http, server, location, if in location
gzip on|off;
是否啓用此模塊。
gzip_buffers number size;
指定緩存壓縮應答的緩衝區數量和大小,如果不設置,一個緩存區的大小爲分頁大小,根據環境的不同可能是4k或8k。
gzip_comp_level level;
壓縮級別1-9。
gzip_disable regex;
符合正則的就不壓縮,以適應不支持壓縮的老闆IE6。
gzip_min_length length;
需要壓縮的文件的最小值,否則壓縮無意義,徒然浪費CPU。
gzip_http_version 1.0|1.1;
是否根據HTTP請求版本來啓用gzip壓縮。
當HTTP版本爲1.0時,Vary: Accept-Encoding沒有被設置,這將引起某些代理緩存失效,可以使用add_header,同樣,在使用這個版本時Content-Length也沒有設置,因此Keepalive不能在這個版本使用。
gzip_proxied off;
根據某些請求和應答來決定是否在對代理請求的應答啓用壓縮,其後有很多參數可選。
查看壓縮與否的方法:
F12→Network→網頁→Accept-Encoding:gzip,deflate,sdch