nginx詳解(二)

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章