nginx的log、upstream和server

nginx的log、upstream和server

1、log

    首先一個log格式化的例子。
php

#配置格式main的log
log_format main '$host $status [$time_local] $remote_addr [$time_local] $request_uri '

'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" '

'$bytes_sent $request_time $sent_http_x_cache_hit';

#使用格式爲main的log
access_log logs/access.log main;

    咱們看見nginx的參數都是$xxx的形式出現,只要經過給定的參數,咱們能夠配置不少東西
java

$arg_PARAMETER  HTTP 請求中某個參數的值,
Eg:如/index.php?site=www.ttlsa.com,能夠用$arg_site取得www.ttlsa.com這個值.
 
$args HTTP 請求中的完整參數。
Eg:例如,在請求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
 
$binary_remote_addr 二進制格式的客戶端地址。例如:\x0A\xE0B\x0E
 
$body_bytes_sent 表示在向客戶端發送的http響應中,包體部分的字節數
 
$content_length 表示客戶端請求頭部中的Content-Length 字段
 
$content_type 表示客戶端請求頭部中的Content-Type 字段
 
$cookie_COOKIE 表示在客戶端請求頭部中的cookie 字段
 
$document_root 表示當前請求所使用的root 配置項的值
 
$uri 表示當前請求的URI,不帶任何參數
 
$document_uri 與$uri 含義相同
$request_uri 表示客戶端發來的原始請求URI,帶完整的參數。$uri和$document_uri未必是用戶的原始請求,在內部重定向後多是重定向後的URI,而$request_uri 永遠不會改變,始終是客戶端的原始URI.
 
$host 表示客戶端請求頭部中的Host字段。若是Host字段不存在,則以實際處理的server(虛擬主機)名稱代替。若是Host字段中帶有端口,如IP:PORT,那麼$host是去掉端口的,它的值爲IP。$host 是全小寫的。這些特性與http_HEADER中的http_host不一樣,http_host只取出Host頭部對應的值。 
 
$hostname 表示 Nginx所在機器的名稱,與 gethostbyname調用返回的值相同 
 
$http_HEADER 表示當前 HTTP請求中相應頭部的值。HEADER名稱全小寫。例如,示請求中 Host頭部對應的值 用 $http_host表 
 
$sent_http_HEADER 表示返回客戶端的 HTTP響應中相應頭部的值。HEADER名稱全小寫。例如,用 $sent_ http_content_type表示響應中 Content-Type頭部對應的值 
 
$is_args 表示請求中的 URI是否帶參數,若是帶參數,$is_args值爲 ?,若是不帶參數,則是空字符串 
 
$limit_rate 表示當前鏈接的限速是多少,0表示無限速 
 
$nginx_version 表示當前 Nginx的版本號 
 
$query_string 請求 URI中的參數,與 $args相同,然而 $query_string是隻讀的不會改變 
 
$remote_addr 表示客戶端的地址 
 
$remote_port 表示客戶端鏈接使用的端口 
 
$remote_user 表示使用 Auth Basic Module時定義的用戶名 
 
$request_filename 表示用戶請求中的 URI通過 root或 alias轉換後的文件路徑 
 
$request_body 表示 HTTP請求中的包體,該參數只在 proxy_pass或 fastcgi_pass中有意義 
 
$request_body_file 表示 HTTP請求中的包體存儲的臨時文件名 
 
$request_completion 當請求已經所有完成時,其值爲 「ok」。若沒有完成,就要返回客戶端,則其值爲空字符串;或者在斷點續傳等狀況下使用 HTTP range訪問的並非文件的最後一塊,那麼其值也是空字符串。
 
$request_method 表示 HTTP請求的方法名,如 GET、PUT、POST等 
 
$scheme 表示 HTTP scheme,如在請求 https://nginx.com/中表示 https 
 
$server_addr 表示服務器地址 
$server_name 表示服務器名稱 
$server_port 表示服務器端口 
 
$server_protocol 表示服務器向客戶端發送響應的協議,如 HTTP/1.1或 HTTP/1.
 
$remote_addr, $http_x_forwarded_for 記錄客戶端IP地址
 
$remote_user 記錄客戶端用戶名稱
 
$request 記錄請求的URL和HTTP協議
 
$status 記錄請求狀態
 
$body_bytes_sent 發送給客戶端的字節數,不包括響應頭的大小; 該變量與Apache模塊mod_log_config裏的「%B」參數兼容。
 
$bytes_sent 發送給客戶端的總字節數。
 
$connection 鏈接的序列號。
 
$connection_requests 當前經過一個鏈接得到的請求數量。
 
$msec 日誌寫入時間。單位爲秒,精度是毫秒。
 
$pipe 若是請求是經過HTTP流水線(pipelined)發送,pipe值爲「p」,不然爲「.」。
 
$http_referer 記錄從哪一個頁面連接訪問過來的
 
$http_user_agent 記錄客戶端瀏覽器相關信息
 
$request_length 請求的長度(包括請求行,請求頭和請求正文)。
 
$request_time 請求處理時間,單位爲秒,精度毫秒; 從讀入客戶端的第一個字節開始,直到把最後一個字符發送給客戶端後進行日誌寫入爲止。
 
$time_iso8601 ISO8601標準格式下的本地時間。
 
$time_local 通用日誌格式下的本地時間。

2、upstream

    一個負載均衡配額制
nginx

upstream img_relay {
    server 127.0.0.1:8027;
    server 127.0.0.1:8028;
    server 127.0.0.1:8029;
    hash $request_uri;
}

server{
    listen 80;
    server_name localhost.com,www.localhost.com
    local =\ {
        proxy_redirect off;
        proxy_pass http://img_relay/
    }
}

nginx的upstream目前支持4種方式的分配正則表達式

一、輪詢(默認)
算法

每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
後端

upstream bakend {
    server 192.168.0.14 ;
    server 192.168.0.15 ;
}

二、weight瀏覽器

指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。緩存

例如:服務器

upstream bakend {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
}

二、ip_hash(最經常使用的)cookie

每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。

例如:

upstream bakend {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}

三、fair(第三方)

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

upstream backend {
    server server1;
    server server2;
    fair;
}

四、url_hash(第三方)

按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。

例:在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法

upstream backend {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

tips例子:

upstream bakend{
    #定義負載均衡設備的Ip及設備狀態
    server 127.0.0.1:9090 down ;
    server 127.0.0.1:8080 weight=2;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
    server 127.0.0.1:7070 backup;
}

1.down            表示單前的server暫時不參與負載
2.weight          默認爲1.weight越大,負載的權重就越大。
3.max_fails:     容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
4.fail_timeout:   max_fails次失敗後,暫停的時間。
5.backup:      其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。

在須要使用負載均衡的server中增長

server{
    .....
    local /= {
        proxy_pass http://bakend/;
    }
}

3、server的uri格式化

    3.1 路徑匹配

location 後面的uri字符串匹配,主要有下面5種方式

#格式:location [=|^~|~|~*] /uri/ {...}

# 第一種
location =/ {
    只要是uri=/直接匹配
}

# 第二種
location ^~ /nginx/ {
    匹配 uri 以/nginx/開頭的。優先級小於 location = /nginx/
}

# 第三種
location ~ /nginx/ {
    匹配 uri 以nginx開始的。優先級小於 location = /nginx/ 和 location ^~ /nginx/ 
}

# 第四種
location ~* /nginx/ {
    和 location = ~/相似,可是不區分大小寫
}

    3.2 root和alias

 root:定義了網站的文件位置.能夠在[http][server][location]中都設置。訪問文件路徑 =root+uri
 
 location = /test/ {
     root /usr/local/www/test;
 }
 
 alias:第一了一個uri的別名,訪問路徑= alias+uri(將location的匹配丟掉) 
  location = /test/ {
     alias /usr/local/www/test;
 }
 
 用戶要訪問一個文件:www.localhost/test/my/mylog
 root的文件: /usr/local/www/test/test/my/mylog
 alias的文件:/usr/local/www/test/my/mylog

    3.3 重寫

        nginx的重寫是依賴pcre庫完成,能夠將uri從一個location跳轉到另一個location。使用Nginx提供的全局變量或者本身設置的變量,結合正則表達式和標誌位實現url重寫以及重定向。只能對域名後除了?後傳遞的參數外的uri字符串起做用。

        a、rewrite:重寫指令

        格式:rewrite regex replacement [flag]

#flag標誌位:
last:表示完成rewrite
break:中止執行虛擬機的後續rewrite指令集
redirect:返回302的臨時重定向,地址欄會顯示跳轉後的地址
permanent:返回301的永久重定向,地址欄會顯示跳轉後的地址。

        b、指令

            if判斷指令:if(condition){...}

#condition:
一、當表達式只是一個變量時,若是值爲空或任何以0開頭的字符串都會當作false
二、直接比較變量和內容時,使用=或!=
三、~正則表達式匹配,~*不區分大小寫的匹配,!~區分大小寫的不匹配
四、
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行

例子:
if($http_user_agent ~ MSIE){
    rewrite ^(.*)$ /msie/$1 break;
} 若是USER_AGENT有MSIE字符串,則跳轉到 /msie/文件夾。(這裏的$1=(.*)這個正則變量)

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
} 若是cooke 匹配正則,則設置$id爲$1=([^;]+)(?:;|$)

if ($request_method = POST) {
    return 405;
} 若是method = post,返回405狀態

if ($slow) {
    limit_rate 10k;
} 若是$slow匹配,則經過set指令設置

          c return :跳轉指令

               Stops processing and returns the specified code to a client。中止請求,並返回第一的status數字給客服端。

        d、set:設置指令

                爲給定的變量設置一個特定值。

       e、rewrite_log:日誌重寫指令,使用本身的設置的$xxx變量來寫log格式。

                啓用時將在error_log中記錄notice級別的重寫日誌

       f、uniitialized_variable_warn:控制是否概率未初始化的警告變量。

  例子

    經過自定義的參數來重寫log格式

http{
    #開啓重寫日誌
    rewrite_log on;
    #重寫日誌格式
    log_format imagelog '[time_local] '$image_file' 'image_type' '$body_bytes_sent'' status;
    
    server{
        root /home/www;
        location / {
            #重寫錯誤日誌
            error_log logs/rewrite.log notice;
            
            #重寫規則
            rewrite '^/images/([a-z]{2}/([a-z0-9]{5})/(.*)\.(png|jpg|gif))$' /data/?file=$3.$4
            #一、$1=([a-z]{2}),$2=[a-z0-9]{5},$3=(.*)\.(png|jpg|gif)
            #二、不能添加 "last",不然下面的set指令不會執行
            
            set $image_file $3;
            set $image_type $4;
        }    
    }
}
相關文章
相關標籤/搜索