首先一個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 通用日誌格式下的本地時間。
一個負載均衡配額制
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.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; } } }