Nginx安裝完畢後,會產生對應的安裝目錄,根據前面的安裝路徑,Nginx的設定檔路徑為/opt/nginx/conf,其中nginx.conf為Nginx的主設定檔。這裡重點介紹下nginx.conf這個設定檔。 Nginx設定檔主要分成四部分:main(全域設定)、server(主機設定)、upstream(負載平衡伺服器設定)和 location(URL符合特定位置的設定)。 main部分設定的指令將影響其他所有設定;server部分的指令主要用於指定主機和連接埠;upstream指令主要用於負載平衡,設定一系列的後端伺服器;location部分用於匹配網頁位置。這四者之間的關係式:server繼承main,location繼承server,upstream既不會繼承其他設定也不會被繼承。 在這四個部分當中,每個部分都包含若干指令,這些指令主要包含Nginx的主模組指令、事件模組指令、HTTP核心模組指令,同時每個部分也可以使用其他HTTP模組指令,例如Http SSL模組、HttpGzip Static模組和Http Addition模組等。 下面透過一個Nginx設定實例,詳細介紹下nginx.conf每個指令的意義。為了能更清楚地了解Nginx的結構和每個設定選項的意義,這裡依照功能點將Nginx設定檔分為7個部分逐次講解,以下就圍繞這7個部分進行介紹。 1.Nginx的全域配置
下面這段內容是對Nginx的全域屬性配置,程式碼如下:
[html] view
plaincopy
- user nobody nobody;
- worker_processes 4
- pid logs/nginx.pid;
-
worker_rlimit_nofile 6553555;worker_rlimit_nofile 6553555;
- events{
- use epoll;
- worker_connections
-
對上面這段程式碼中每個設定選項的意義解釋如下:
- user是個主模組指令,指定Nginx Worker進程運行用戶以及用戶組,預設由nobody帳號運行。
worker_processes是個主模組指令,指定了Nginx要開啟的進程數。每個Nginx進程平均耗費10M~12M記憶體。根據經驗,一般指定一個行程就夠了,如果是多核心CPU,建議指定和CPU的數量一樣的行程數即可。
error_log是個主模組指令,用來定義全域錯誤日誌檔。日誌輸出等級有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。
pid是個主模組指令,用來指定進程id的儲存檔案位置。
worker_rlimit_nofile用來指定一個nginx程序可以開啟的最多檔案描述符數目,這裡是65535,需要使用指令「ulimit -n 65535」來設定。
events指令是設定Nginx的工作模式及連線數上限。
[html] view
plaincopy
events{
use epoll;
- }
use是個事件模組指令,用來指定Nginx的工作模式。 Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效率的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系統。對於Linux系統,epoll工作模式是首選。
worker_connections也是事件模組指令,用來定義Nginx每個行程的最大連線數,預設是1024.最大客戶端連線數由worker_processes和worker_connections決定,即Max_client=worker_processes*worker_connections,當反向代理時,max_clients變成:max_clients
= worker_processes * worker_connections/4。
進程的最大連線數受Linux系統進程的最大開啟檔案數限制,在執行作業系統指令「ulimit -n 65536」後worker_connections的設定才能生效。 2.HTTP伺服器設定
接下來開始進行HTTP伺服器設定。
下面這段內容是Nginx對HTTP伺服器相關屬性的配置,程式碼如下:
[html] view
plaincopy
- http{
- include conf/mime.types
- log_format main '$remote_addr - $remote_user [$time_local] '
- '"$request" $status $bytes_sent '
- '"$http_referer" "$http_user_agent
log_format download '$remote_addr - $remote_user [ $time_local] ' '"$request" $status $bytes_sent ' '"$_referer" http_range" "$sent_http_content_range"'; -
client_max_body_size 20m; client_header_buffer_size 32K; large_client_header_buffers 4 32k; Sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; -
client_header_timeout 10; client_body_timeout 10; -
- 下面詳細介紹下這段程式碼中每個設定選項的含義。 include是個主模組指令,實現設定檔所包含的檔案的設定,可以減少主設定檔的複雜度。類似Apache中的include方法。 default_type屬於HTTP核心模組指令,這裡設定預設類型為二進位流,也就是當檔案類型未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器存取PHP檔案就會出現下載視窗。
下面的程式碼實現日誌格式的設定。
- [html] view
plaincopy
-
log_format main '$remote_addr - $remote_user [$time_local] ' 🎠
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local]quest ' '
'"$http_referer" " $http_user_agent" ' - '"$http_range" "$sent_http_content_range"';
log_format是Nginx的HttpLog模組指令,用來指定Nginx日誌的輸出格式。 main為此日誌輸出格式的名稱,可以在下面的access_log指令中引用。
client_max_body_size用來設定允許客戶端請求的最大的單一檔案位元組數。
client_header_buffer_size用於指定來自客戶端請求頭的headerbuffer大小。對於大多數請求,1K的緩衝區大小已經足夠,如果自訂了訊息頭或有更大的Cookie,可以增加緩衝區大小。這裡設定為32K。
large_client_header_buffers用來指定客戶端請求中較大的消息頭的快取最大數量和大小, “4”為個數,“128K”為大小,最大緩存量為4個128K。
sendfile參數用於開啟高效能檔案傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設定為on用於防止網路阻塞。
keepalive_timeout設定客戶端連線保持活動的逾時時間。在超過這個時間之後,伺服器會關閉該連線。
client_header_timeout設定客戶端請求頭讀取逾時時間。如果超過這個時間,客戶端還沒有發送任何數據,Nginx將傳回「Request time out(408)」錯誤。
client_body_timeout設定客戶端請求主體讀取逾時時間。如果超過這個時間,客戶端還沒有發送任何數據,Nginx將回傳「Request time out(408)」錯誤,預設值是60。
send_timeout指定回應客戶端的逾時時間。這個逾時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。 3.HttpGzip模組配置
下面配置Nginx的HttpGzip模組。這個模組支援線上即時壓縮輸出資料流。要查看是否安裝了此模組,需要使用下面的指令:
[html] view
plaincopy
-
[root@localhost conf]# /opt/nginx/sbin/nginx -V configure arguments: --with-http_stub_status_module -- with-http_gzip_static_module
--prefix- =/opt/nginx
- 通過/opt/nginx/sbin
通過/opt/nginx/sbin/gininx HttpGzip模組。
下面是HttpGzip模組在Nginx配置中的相關屬性設定:
[html] view
plaincopy
gzip on; -
gzip_min_length 1k
-
gzip_http_version 1.1;
-
gzip_comp_level 2;
lain -javascript text/css application/xml; gzip_vary on;
- gzip用於開啟資料流
- gzip_min_length設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的Content-Length中取得。預設值是0,不管頁面多大都進行壓縮。建議設定成大於1K的位元組數,小於1K可能會越壓越大。
gzip_buffers表示申請4個單位為16K的記憶體作為壓縮結果流緩存,預設值是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。
gzip_http_version用於設定識別HTTP協定版本,預設為1.1,目前大部分瀏覽器已經支援GZIP解壓,使用預設即可。
gzip_comp_level用來指定GZIP壓縮比,1 壓縮比最小,處理速度最快;9 壓縮比最大,傳輸速度快,但處理最慢,也比較消耗cpu資源。
gzip_types用來指定壓縮的類型,無論是否指定,「text/html」類型總是會被壓縮的。
gzip_vary選項可以讓前端的快取伺服器快取經過GZIP壓縮的頁面,例如用Squid快取經過Nginx壓縮的資料。 4.負載平衡配置
下面設定負載平衡的伺服器清單。
[html] view
plaincopy
- upstream ixdba.net{
- ip_hash;
- ip_hash;
-
ip.192. server 192.168.12.134:80 down;
- server 192.168.12.135: 8009 max_fails=3 fail_timeout=20s20s1. 8.12.136:8080;
- }
-
upstream是Nginx的HTTP Upstream模組,這個模組透過一個簡單的調度演算法來實現客戶端IP到後端伺服器的負載平衡。在上面的設定中,透過upstream指令指定了一個負載平衡器的名稱ixdba.net。這個名稱可以任意指定,在後面需要的地方直接呼叫即可。
Nginx的負載平衡模組目前支援4種調度演算法,以下進行分別介紹,其中後兩項屬於第三方的調度方法。
輪詢(預設)。每個請求依時間順序逐一分配到不同的後端伺服器,如果後端某台伺服器宕機,故障系統會自動剔除,使用戶存取不受影響。
Weight。指定輪詢權值,Weight值越大,分配到的存取機率越高,主要用於後端每個伺服器效能不均的情況。
ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共享問題。
fair。比上面兩個更聰明的負載平衡演算法。此種演算法可以依據頁面大小和載入時間長短智慧地進行負載平衡,也就是根據後端伺服器的回應時間來分配請求,回應時間短的優先分配。 Nginx本身是不支援fair的,如果需要使用這種調度演算法,必須下載Nginx的upstream_fair模組。
url_hash。依照存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端快取伺服器的效率。 Nginx本身是不支援url_hash的,如果需要使用這種調度演算法,必須安裝Nginx 的hash軟體包。
在HTTP Upstream模組中,可以透過server指令指定後端伺服器的IP位址和端口,同時還可以設定每個後端伺服器在負載平衡調度中的狀態。常用的狀態有:
down,表示目前的server暫時不參與負載平衡。
backup,預留的備份機器。當其他所有的非backup機器故障或忙碌的時候,才會要求backup機器,因此這台機器的壓力最輕。
max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,傳回proxy_next_upstream 模組定義的錯誤。
fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。 max_fails可以和fail_timeout一起使用。
注意 當負載調度演算法為ip_hash時,後端伺服器在負載平衡調度中的狀態不能是weight和backup。
5.server虛擬主機設定下面介紹對虛擬主機的設定。建議將對虛擬主機進行設定的內容寫入另外一個文件,然後透過include指令包含進來,這樣更方便維護和管理。
[html] view
plaincopy
server{
- listen 80; . www.ixdba.net;
- index index.html index.htm index.jsp;
- root /web/wwwroot/www.ixdba.net
- charset gb2312;
server標誌定義虛擬主機開始,listen用於指定虛擬主機的服務端口,server_name用來指定IP位址或域名,多個域名之間用空格分開。 Index用來設定存取的預設首頁位址,root指令用來指定虛擬主機的網頁根目錄,這個目錄可以是相對路徑,也可以是絕對路徑。 Charset用於設定網頁的預設編碼格式。
access_log logs/www.ixdba.net.access.log main;
access_log用來指定此虛擬主機的存取日誌存放路徑,最後的main用於指定存取日誌的輸出格式。 6.URL匹配配置
URL位址匹配是進行Nginx設定中最靈活的部分。 location支援正規表示式匹配,也支援條件判斷匹配,使用者可以透過location指令實現Nginx對動、靜態網頁進行過濾處理。
以下這段設定是透過location指令來對網頁URL進行分析處理,所有副檔名以.gif、.jpg、.jpeg、.png、.bmp、.swf結尾的靜態檔都交給nginx處理,而expires用來指定靜態檔案的過期時間,這裡是30天。
[html] view
plaincopy
- location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { 🎠 /web/wwwroot/www.ixdba.net;
- expires 30d;
- }
以下這段設定是將upload和html下的所有檔案都交給系統/www.中。
[html] view
plaincopy
location ~ ^/(upload|html)/ {
- ;
-
expires 30d; }
- 在最後這段設定中,location是對此虛擬主機下動態網頁的過濾處理,也就是將所有以.jsp為後綴的檔案都交給本機的8080埠處理。
- [html] view
plaincopy
location ~ .*.jsp$ {
xy_pass http://localhost:8080;
- }
- 7. StubStatus模組配置
StubStatus模組能夠取得Nginx自上次啟動以來的工作狀態,此模組非核心模組,需要在Nginx編譯安裝時手動指定才能使用此功能。 -
以下指令實指定啟用取得Nginx工作狀態的功能。
-
[html] view
plaincopy
- location /NginxStatus {
- ;
-
access_log logs/NginxStatus.log; auth_basic 地 }
- stub_status設定為「on」表示啟用StubStatus的工作狀態統計功能。 access_log 用來指定StubStatus模組的存取日誌檔。 auth_basic是Nginx的一種認證機制。 auth_basic_user_file用來指定認證的密碼文件,由於Nginx的auth_basic認證採用的是與Apache相容的密碼文件,因此需要用Apache的htpasswd指令來產生密碼文件,例如要新增一個webadmin用戶,可以使用下面方式產生密碼文件:
/usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd webadmin- 會得到以下提示訊息:New password:輸入密碼之後,系統會要求再次輸入密碼。確認之後新增用戶成功。
要查看Nginx的運作狀態,可以輸入http://ip/ NginxStatus,然後輸入剛建立的使用者名稱和密碼就可以看到以下資訊:
Active connections: 1 server accepts handled requests139393939393939 Reading: 0 Writing: 1 Waiting: 0
Active connections表示當前活躍的連接數,第三行的三個數字表示Nginx目前總共處理了393411個連接, 成功創建393411次握手, 總共處理了393799個請求。最後一行的Reading表示Nginx讀取到客戶端Header資訊數, Writing表示Nginx回傳給客戶端的Header資訊數,「Waiting」表示Nginx已經處理完,正在等候下一次請求指令時的駐留連線數。
在最後這段設定中,設定了虛擬主機的錯誤訊息回傳頁面,透過error_page指令可以自訂各種錯誤訊息的回頁。在預設情況下,Nginx會在主目錄的html目錄中尋找指定的回傳頁面,特別要注意的是,這些錯誤訊息的回傳頁面大小一定要超過512K,否者會被ie瀏覽器取代為ie預設的錯誤頁面。
[html] view
plaincopy
error_page 404 error_page 500 502 503 504 /50x.html;
root html;
- } }
-
} 51cto.com/2895551/790611
-
以上就介紹了解析Nginx配置文件,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。