一個簡單的配置文件以下:php
#定義Nginx運行的用戶及用戶組 user userName userGroupName; #工做進程數目,根據硬件調整,一般等於CPU數量或者2倍於CPU worker_processes 1; #錯誤日誌路徑與級別,級別選項:debug|info|notice|warn|error|crit|alert|emerg error_log logs/error.log debug; #pid(進程標識符)存放路徑 pid logs/nginx.pid; events { #每一個工做進程的最大鏈接數量 worker_connections 1024; #鏈接超時時間,這裏指的是http層面的keep-alive並不是tcp的keepalive keepalive_timeout 60; #指定IO模型,linux建議epoll,FreeBSD建議採用kqueue,window下不指定 use epoll; } #設置http服務器 http { #文件擴展名與文件類型映射表 include mime.types; #默認文件類型 default_type text/html; #日誌格式設置,main爲日誌格式的名稱可在後文中引用 log_format main '$remote_addr - $remote_user[$time_local] "$request" ' '$status $body_bytes_sent"$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #訪問日誌路徑、格式 access_log logs/access.log main; #sendfile指令指定 nginx是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。 #若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。 sendfile on; #容許或禁止使用socket的TCP_CORK的選項,此選項僅在使用sendfile的時候使用 tcp_nopush on; #超時時間 keepalive_timeout 65; #是否開啓gzip壓縮 #gzip on; #虛擬主機配置,下能夠有多個location用來表示不一樣的反向代理 server { #監聽端口 listen 80; #主機名,默認爲本機 server_name 127.0.0.1; #編碼 charset utf-8; #訪問日誌 access_log logs/host.access.log main; #根路徑「/」 的訪問規則 location / { #網站根目錄 root html; #默認網頁 index index.html index.htm index.php; } #發生404錯誤時跳轉到/404.html頁面 error_page 404 /404.html; #配置名爲「static_file_server」的主機,按照權重負載均衡 upstream static_file_server { server 192.168.2.1:8080 weight=1; server 192.168.2.2:8080 weight=2; server 192.168.2.3:8080 weight=3; } #正則表達式,配置以「.js」、「.css」結尾的路徑的訪問規則 location ~ .*\.(js|css)?$ { #將該類請求轉發至static_file_server proxy_pass http://static_file_server/ #設置瀏覽器緩存過時時間 expires 600; #關閉重定向 proxy_redirect off; #如下三行,目的是將代理服務器收到的用戶的信息傳到真實服務器上 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #拒絕的ip deny 127.0.0.1; #容許的ip allow 172.18.5.54; } } }
3.1 內置變量
在log_format配置項當中,使用了不少Nginx的內置變量,一些變量表明瞭客戶端請求頭部的一些字段,如:$http_user_agent,$http_cookie等等,因爲這些變量會在請求中定義,因此可能沒法保證他們是存在的或者說能夠定義到一些別的地方(例如遵循必定的規範)。css
經常使用變量以下:html
變量名linux
說明nginx
$argsweb
請求行中的參數,同$query_string正則表達式
$content_length算法
請求頭中的Content-length字段後端
$content_type瀏覽器
請求頭中的Content-Type字段
$document_root
當前請求在root指令中指定的值
$document_uri
不帶請求參數的當前URI,不包含主機名,同$uri
$host
請求中的主機頭字段,若是請求中的主機頭不可用,則爲服務器處理請求的服務器名稱
$http_user_agent
客戶瀏覽器信息
$http_cookie
客戶端cookie信息
$remote_addr
客戶端的IP地址
$remote_port
客戶端的端口
$remote_user
通過Auth Basic Module驗證的用戶名
$request_file_name
當前請求的文件路徑,由root或alias指令與URI請求生成
$request_method
這個變量是客戶端請求的動做,一般爲GET或POST
$request_uri
包含請求參數的原始URI,不包含主機名
$server_addr
服務器地址
$server_name
服務器名稱
$server_port
請求到達服務器的端口號
$server_protocol
請求使用的協議,一般是HTTP/1.0或HTTP/1.1
$scheme
HTTP方法(如http,https)
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
3.2 負載均衡配置
upstream用於配置負載均衡。Nginx的upstream目前支持4種方式的分配:
l 輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
l weight
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
例如:
upstream bakend{ server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
l ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
例如:
upstream bakend{ ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
l fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend{ server server1; server server2; fair; }
l 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; }此外,在負載機器的IP能夠附帶狀態參數,例如
upstream bakend{ ip_hash; 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; }
每一個設備的狀態設置爲:
l down表示單前的server暫時不參與負載
l weight爲weight越大,負載的權重就越大。
l backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
3.3 正則匹配
正則匹配規則:
l =開頭表示精確匹配
l ^~ 開頭表示uri以某個常規字符串開頭,不是正則匹配
l ~ 開頭表示區分大小寫的正則匹配
l ~* 開頭表示不區分大小寫的正則匹配
l $結尾表示以某字符串結尾的正則匹配
看幾個實例:
location = / { #通用匹配, 若是沒有其它匹配,任何請求都會匹配到 [ configuration A ] } location / { # 由於全部的地址都以 / 開頭,因此這條規則將匹配到全部請求 # 可是正則和最長字符串會優先匹配 [ configuration B ] } location/documents/ { # 匹配任何以 /documents/ 開頭的地址,匹配符合之後,還要繼續往下搜索 # 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條 [ configuration C ] } location ~/documents/Abc { # 匹配任何以 /documents/ 開頭的地址,匹配符合之後,還要繼續往下搜索 # 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條 [ configuration CC ] } location ^~/images/ { # 匹配任何以 /images/ 開頭的地址,匹配符合之後,中止往下搜索正則,採用這一條。 [ configuration D ] } location ~*\.(gif|jpg|jpeg)$ { # 匹配全部以 gif,jpg或jpeg 結尾的請求 # 然而,全部請求 /images/ 下的圖片會被 config D 處理,由於 ^~ 到達不了這一條正則 [ configuration E ] } location/images/ { # 字符匹配到 /images/,繼續往下,會發現 ^~ 存在 [ configuration F ] } location/images/abc { # 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在 # F與G的放置順序是沒有關係的 [ configuration G ] } location ~/images/abc/ { # 只有去掉 config D 纔有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,採用 [ configuration H ] }順序 no優先級: (location =) > (location 完整路徑) >(location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
上面的匹配結果 按照上面的location寫法,如下的匹配示例成立:
/ -> config A
精確徹底匹配,即便/index.html也匹配不了
/downloads/download.html-> config B
匹配B之後,往下沒有任何匹配,採用B
/images/1.gif-> configuration D
匹配到F,往下匹配到D,中止往下
/images/abc/def-> config D
最長匹配到G,往下匹配D,中止往下
你能夠看到 任何以/images/開頭的都會匹配到D並中止,FG寫在這裏是沒有任何意義的,H是永遠輪不到的,這裏只是爲了說明匹配順序
/documents/document.html-> config C
匹配到C,往下沒有任何匹配,採用C
/documents/1.jpg-> configuration E
匹配到C,往下正則匹配到E
/documents/Abc.jpg-> config CC
最長匹配到C,往下正則順序匹配到CC,不會往下到E
因此實際使用中,有三個匹配規則定義可做參考:
#直接匹配網站根,經過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。 #這裏是直接轉發給後端應用服務器了,也能夠是一個靜態首頁 # 第一個必選規則 location = / { proxy_pass http://tomcat:8080/index } # 第二個必選規則是處理靜態文件請求,這是nginx做爲http服務器的強項 # 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用 location ^~/static/ { root /webroot/static/; } location ~*\.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三個規則就是通用規則,用來轉發動態請求到後端應用服務器 #非靜態文件請求就默認是動態請求,本身根據實際把握 location / { proxy_pass http://tomcat:8080/ }
3.4 rewrite配置
rewrite功能就是,使用nginx提供的全局變量或本身設置的變量,結合正則表達式和標誌位實現url重寫以及重定向。rewrite只能放在server{},location{},if{}中,而且只能對域名後邊的除傳遞參數外的字符串起做用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只對/a/we/index.php重寫。語法:
rewrite regex replacement [flag]
若是想對域名或參數字符串起做用,可使用全局變量匹配,也可使用proxy_pass反向代理。
表面看rewrite和location功能有點像,都能實現跳轉,主要區別在於rewrite是在同一域名內更改獲取資源的路徑,而location是對一類路徑作控制訪問或反向代理,能夠proxy_pass到其餘機器。不少狀況下rewrite也會寫在location裏,它們的執行順序是:
(1)執行server塊的rewrite指令
(2)執行location匹配
(3)執行選定的location中的rewrite指令
若是其中某步URI被重寫,則從新循環執行1-3,直到找到真實存在的文件;循環超過10次,則返回500 Internal Server Error錯誤。
flag標誌位用法以下:
l last : 至關於Apache的[L]標記,表示完成rewrite
l break : 中止執行當前虛擬主機的後續rewrite指令集
l redirect : 返回302臨時重定向,地址欄會顯示跳轉後的地址
l permanent : 返回301永久重定向,地址欄會顯示跳轉後的地址
由於301和302不能簡單的只返回狀態碼,還必須有重定向的URL,這就是return指令沒法返回301,302的緣由了。這裏 last 和 break 區別有點難以理解:last通常寫在server和if中,而break通常使用在location中; last不終止重寫後的url匹配,即新的url會再從server走一遍匹配流程,而break終止重寫後的匹配;break和last都能組織繼續執行後面的rewrite指令。
還有一個if指令,很是有用,語法爲
if(condition){
...
}
對給定的條件condition進行判斷。若是爲真,大括號內的rewrite指令將被執行,if條件(conditon)能夠是以下任何內容:
l 當表達式只是一個變量時,若是值爲空或任何以0開頭的字符串都會當作false
l 直接比較變量和內容時,使用=或!=
l ~正則表達式匹配,~*不區分大小寫的匹配,!~區分大小寫的不匹配
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
例如:
if($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } //若是UA包含"MSIE",rewrite請求到/msid/目錄下 if ($http_cookie~* "id=([^;]+)(?:;|$)") { set $id $1; } //若是cookie匹配正則,設置變量$id等於正則引用部分 if($request_method = POST) { return 405; } //若是提交方法爲POST,則返回狀態405(Methodnot allowed)。return不能返回301,302 if ($slow) { limit_rate 10k; } //限速,$slow能夠經過 set 指令設置 if (!-f$request_filename){ break; proxy_pass http://127.0.0.1; } //若是請求的文件名不存在,則反向代理到localhost 。這裏的break也是中止rewrite檢查 if ($args ~post=140){ rewrite ^ http://example.com/ permanent; } //若是query string中包含"post=140",永久重定向到example.com location ~*\.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.comwww.leizhenfang.com; if ($invalid_referer) { return 404; } //防盜鏈 }
3.5 FastCGI配置
Nginx自己是不支持對外部程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。FastCGI接口在Linux下是socket,(這個socket能夠是文件socket,也能夠是ip socket)。爲了調用CGI程序,還須要一個FastCGI的wrapper(wrapper能夠理解爲用於啓動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接納到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。
如下爲Nginx支持PHP的配置示例:
location ~\.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }經過location指令,將全部以php爲後綴的文件都交給127.0.0.1:9000來處理,而這裏的IP地址和端口就是FastCGI進程監聽的IP地址和端口。 fastcgi_param指令指定放置PHP動態程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,建議將這個目錄與Nginx虛擬主機指定的根目錄保持一致,固然也能夠不一致。 fastcgi_params文件是FastCGI進程的一個參數配置文件,在安裝Nginx後,會默認生成一個這樣的文件,這裏經過include指令將FastCGI參數配置文件包含了進來。