全局配置置與頂層配置塊
nginx.conf從整體上講分全局配置main, 頂層配置塊及子配置塊。放在配置文件中,不用{}括起來的部分是全局配置,第一層用{}括起來的是頂層配置塊,在頂層配置塊中,再用{}括起來的是子配置塊。頂層配置塊目前有http 、event 、stream。
main 全局配置
全局配置是Nginx在運行時與具體業務功能(如HTTP服務或者E-mail服務代理)無關的一些參數,如工作進程數、運行的身份等。全局配置在配置文件最外層。
1.工作進程數
語法:worker_processes number I auto;
默認:worker_process 1;
配置塊: 全局。
說明:在配置文件的全局main 部分,管理進程接收任務並將請求分配給工作進程處理,工作進程是實際的處理進程。工作進程的個數可以設置爲CPU 的核數(grep ^processor/proc/cpuinfoIwe -1),也可以是auto值,如果開啓了ss l 和gzip 更應該設置成與邏輯CPU數量一樣甚至爲2 倍,可以減少I/ O 操作。如果Nginx服務器還有其他服務,可以考慮適當減少。
2.綁定工作進程到指定的CPU 內核
語法:worker cpu affinity cpumask[ cpumask .. ·]
默認:無。
配置塊:全局。
說明:如果CPU 非常繁忙,不一定會把每一個工作進程分配到一個核心上,通過本指令手工指定會得到真正的併發(僅對Linux有效)。例如:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
3.工作進程最大打開文件數
語法:worker rlimit nofile number;
默認: 元。
配置塊: 全局。
說明: 改變工作進程最大打開文件數,修改配置無須重啓管理進程。
4. 工作進程的當前工作路徑
語法:worker_directory directory;
默認: 無。
配置塊: 全局。
說明: 定義當前工作進程的工作路徑,主要用於生成coredump 文件, 工作進程所在用
戶和組需要對工作目錄有寫權限。
5. 工作進程優先級
語法:worker_priority number;
默認:worker_priority O;
配置塊: 全局。
說明: 定義工作進程的優先級,取值範圍爲-20 ~ +20 。
6. coredump 文件最大尺寸
語法:worker rlimit core size;
默認:無。
配置塊:全局。
說明:定義工作進程cored ump 文件尺寸,改動無須重啓管理進程。
7 . 是否以守護進程方式運行Nginx
語法:daemon onloff;
默認:daemon on ;
配置塊: 全局。
說明:指明是否以守護進程方式運行Nginx ,默認爲打開。
8. 是否以master_process 方式工作
語法:master_process onloff;
默認:master process on;
配置塊:全局。
說明:指明工作進程是否馬上啓動,主要用於Nginx 深度開發使用,不是常規配置功能項。
9. error 日誌設置
語法:error log /path/file level;
默認:error_log logs/error.log err;
配置塊: main 、http 、mail 、stream 、server 、location
說明:設置日誌文件路徑名,還可以設置要寫入的錯誤級別。
10. 定義環境變量
語法:env VARIVAR=Value;
配置塊:全局。
說明:直接設置操作系統上的環境變量。例如:
env MACCOC OPTIONS;
env PERLSLIB=/data/site/modules;
env OPENSSL ALLOW PROXY CERTS=l;
11. 引用其他配置文件
語法:include / path/file;
默認: 元。
配置塊: any
說明:文件名可以是絕對路徑,也可以是相對路徑,如果是相對路徑,就是nginx.conf所在的路徑。例如:
include mime.types;
include /usr/local/ip_limit.conf;
12. 鎖定文件
語法:lock file file;
默認:lock file logs/nginx.lock;
配置塊:全局。
說明: Nginx 使用鎖定文件實現accept_mutex 。在多數系統上,這個鎖用原子操作實現,則這個值就被忽略掉了。這個配置在使用lock file 機制的系統上使用。
13 . 設置pid 文件路徑
語法:pid path/file;
默認:pid logs/nginx.pid;
配置塊: main 。
說明:設置保存管理進程ID 的文件,用於使用進程ID 操作Nginx 的環境。
14. 設置工作進程運行時的用戶及用戶組
語法:user username[groupn 缸ne];
默認:user nobody;
配置塊: main 。
說明:指定工作進程工作時的用戶和用戶組,主要在Linux 和UNIX 上使用。
15. SSL 硬件加速
語法:ssl一engine device;
說明:如果服務器上有SSL 硬件加速設備,可以通過配置實現硬件加速。可以使用Open SSL 命令查看是否有硬件設備:openssl engine -t;
16. 工作進程中多線程讀和寫的線程池
語法:thread_pool name threads=number [max_queue=number];
默認:thread pool default threads=32 max queue=65535;
配置塊: main 。
說明:這條指令從1.7.1 l 版本出現,定義工作進程中對文件讀和寫時用到的線程池。threads 參數定義線程池中線程的數量。max_queue 限制允許在隊列中等待的任務,默認是65 536 個任務。隊列超出時,任務將返回一個錯誤信息。
17. 工作進程時間頻率
語法:timer resolution interval;
默認: 無。
配置塊: main 。
說明:早期的Linux 中, gettimeofday 是一個系統調用,需要進行一次核心態和用戶態的切換,所以需要限制。現在的內核中,gettimeofday 僅是一次vsysc all , 是對共享內存中的數據做訪問,代價不大,所以目前通常不需要考慮這個問題。
events 配置塊
events 模塊中包含Nginx 中所有處理連接的設置。events 是Nginx 使用到的I/O 事件模型,是最主要的進出交互部分。Nginx 強大的部分就是在Linux 上完美實現了e poll 模型。這裏定義events 的模型選擇和參數。
常用配置項如下:
events{
use epoll;
worker connections 20000;
}
1. 設置事件模型
語法:use method;
默認: 無。
配置塊: events 。
說明: method 取值爲[ kqueue I rtsig I epoll I /dev/poll I select I poll ]; 指令用於確定使用的事件模型, 一般在Linux 下用epoll 。如果不設置本值, Nginx 會自動確定事件模型。
( 1 )標準事件模型
select 、poll 屬於標準事件模型,如果當前系統不存在更有效的方法, Nginx 會選擇select 或poll 。
( 2 )高效事件模型
kqueue :用於FreeBSD 4 .1+ 、OpenBSD 2.9 + 、NetBSD 2 . 0 和Mac OS X 。使用雙處理器的Mac OS X 系統使用kqueue 可能會造成內核崩潰。
epoll :用於Linux 內核2.6 版本及以後的系統。
/dev / poll :用於Solaris 7 11199+ 、HP幾JX 11.22+ (eventport)、IRIX 6.5.15 +和Tru64 UNIX5.lA+ 。
eventport :用於Solaris 10 。爲了防止出現內核崩潰的問題,有必要安裝安全補丁程序。
查看linux 版本號可以使用cat /proc/version 命令。
2. 每個工作進程的最大連接數
語法:worker connections number;
默認:worker connections 512;
配置塊: event 。
說明:寫在events 部分,指每一個工作進程能併發處理(發起)的最大連接數(包含與客戶端或後端被代理服務器間等所有連接數) 。當Nginx 作爲反向代理服務器時,計算公式爲最大連接數= worker _processes °¡ worker_ connections/4 ,所以這裏客戶端最大連接數是1024 ,這個可以增大到8192 , 看情況而定,但不能超過worker_rlimit_ nofile 。當Nginx 作爲http 服務器時,以上計算公式裏面改爲除以2 。
3. 工作進程併發接收
語法:multi_accept onioff;
默認:multi_accept off;
配置塊: events 。
說明:如果multi_accept 是禁用的, 一個工作進程同一時刻只能接收一個新的連接,否則,可以在同一時刻接收所有的連接。當類型是kqueue 時,這個配置指令會被自動忽略。
4. AIO 最大輸出數
語法:worker_aio_requests number;
默認:worker aio request 32;
配置塊: event s 。
說明:當在epoll 連接處理方法中使用AIO 時,設置單工作進程AIO 輸出的最大數。
HTTP服務器配置塊
HTTP 模塊是Nginx 中重要的模塊,顧名思義, 這是處理HTTP 請求的模塊。HTTP 模塊中一般使用HTTP 全局配置參數控制整體行爲,使用server 配置虛擬主機,包含監聽地址、文檔路徑和各種location 。反向代理、負載均衡等都是在內部的ser v er 等模塊實現的。同時在各個子配置塊或location 等內部劃分了許多階段( phase ),這些階段可以註冊Lua 代碼或Lua 文件,干預處理的過程。一個典型的Web 服務器會包含全局配置、多個serve r 塊和多個l oca tion 塊:
http{
gzip on;
upstream{
…
}
…
server{
listen localhost:80;
…
location /webstatic {
if ... {
…
}
root /opt/webresource;
…
}
location ~* . (jpg Jjpeg I png I jpe I gif) $ {
…
}
}
server{
…
}
}
Nginx 爲Web 服務器提供了很多配置項, 這些配置項有的可以出現在任意一個配置塊中, 有的只能在特定的塊中, 這點在查看配置項描述時需要注意一下。
1.監聽端口
語法:listen address[ :port] [default_server] [ssl] [http2 I spdy] [proxy_protocol]
[ setfib=number] [ fastopen=number] [ backlog=number] [ rcvbuf=size] [ sndbuf=size]
[ accept_filter=filter] [deferred] [bind] [ ipv6only=on I off] [reuseport] [ so_keepalive
=on I off I [ keepidle]: [ keepintvl]: [ keepcnt]];
listen port [default_server] [ssl] [http2 I spdy] [proxy_protocol] [setfib=number]
[fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter]
[deferred] [bind] [ ipv6only=on I off] [reuseport] [ so_keepalive=on I off I [keepidle]: [kee
pintvl] : [ keepcnt] ] ;
listen unix:path [default_server] [ssl] [http2 I spdy] [proxy_protocol]
[backlog=number] [rcvbuf=size ] [sndbuf=size] [accept_filter=filter] [deferred] [bind]
[so_ keepalive=on I off I [ keepidle]: [ keepintvl] : [ keepcnt]];
默認:listen *:80 I *:8000;
配置塊: server 。
說明: listen 參數決定Ng inx 如何監聽端口。在listen 後面可以只加IP 、端口或主機名,非常靈活。例如:
listen 127.0.0.1:8000;
listen 127.0 .0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
如果使用IPv6 ,那麼可以這樣使用:
listen [::]:8000;
listen [ : : l] ;
還可以加其他參數:
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
主要參數的意義如下:
• default :將所在的server 塊作爲整個Web 服務的默認server 塊。如果沒有設置這個參數,將以找到的第一個server 塊爲默認server 塊。
• default server :同default 。
• backlog=num :表示TCP 中backlog 隊列大小,默認爲一1 ,表示不設置。在TCP 三次握手過程中,進程還沒有開始處理監聽句柄, backlog 隊列就會放置這些新連接。如果隊列已滿,新的客戶嘗試連接,則會失敗。
• rcvbuf=s ize : 設置s o rcvbuf 接收緩衝區大小。
• sndbuf=size :設置so sndbuf 發送緩衝區大小。
• accept_ filter :設置accept 過濾器,只對FreeBSD 操作系統有用。
• deferred : 設置本參數後,客戶端建立連接,並且完成了三次握手,也不會調度工作進程來處理,直到客戶端實際請求數據到來才分配工作進程處理,適用於大併發情況下減輕工作進程負擔。
• bind :綁定當前ip/port 對, 只有在一個端口監聽多個地址時纔會生效。
• ssl : 在當前監聽的端口上建立的連接必須使用SSL 協議。
2. 主機名稱
語法:server name name[ ... ];
默認:server name "”;
配置塊: server 。
說明: server name 後可以跟多個主機名稱。例如:server_name www.google.com mail.google.com;
3. location
語法:location[= I~I~* I^~I@] /uri/ { ... }
配置塊: server 。
說明: location 嘗試根據用戶請求中的URI 匹配上面的/uri 表達式,如果匹配,就選擇
location 中的配置處理用戶請求。匹配的方式有很多種,下面介紹匹配規則。
1 ) =表示把URI 作爲字符串,以便與參數中的uri 做完全匹配。例如:
location = {
# 只有當用戶請求,纔會作用本location 下的配置
…
}
2)~表示匹配URI 時是大小寫敏感的。
3) ~*表示匹配URI 時是大小寫不敏感的。
4)~表示匹配時只需要前半部分與URI 匹配即可。例如:
Location ^~/image/{
# 以/ image / 開始的請求都會匹配上
…
}
5 )@表示僅用於Nginx 服務內部請求之間重定向,又名命名location (named location ) 可以在URI 中使用正則表達式,例如:
Location ~* \.(gif | jpg| jpeg)${
# 匹配以.gif 、. jpg 、. jpeg 結尾的請求
}
location 是有順序的,當一個請求可以匹配多個location 時只會被第一個匹配的location 處理。location 的匹配只能表達如果匹配, 則……”, 如果需要匹配“如果不匹配,則……就比較難實現。可以在最後加一個/ location , 如果前面都沒有匹配上,則由“/ ”處理。
4 設置root 路徑
語法:root path
默認:html
配置塊: http 、server 、location 、if。
例如,定義資源文件相對於HTTP 請求的根目錄。
location /download/{
root /opt/web/html/;
}
如果有一個URI 是/download / index /test.html ,那麼Web 服務器會返回服務器上/opt/web/html /download/ index / test.html 文件的內容。
5. 以別名方式設置資源路徑
語法:alias path;
配置塊: location 。
說明: alias 是用來設置文件資源路徑的, 與root 的不同點在於如何解讀location 後面的uri 參數, alia s 和root 會以不同的方式將用戶請求映射到真正的磁盤文件上。例如,有一個請求的URI 是/conf/ nging.co時, 而實際文件在/usr/ local /nginx/conf/ nginx.conf ,那麼可以使用下面的方式設置:
location /conf {
alias /usr/local / nginx/conf/;
}
如果用root 設置,則爲
location /conf {
root /usr/local/nginx
}
alias 後面也可以添加正則表達式,例如:
location ~^ / test/(\w+)\.(\w+)${
alias /usr/local/nginx/$2/$1.$2;
}
在請求/test/ nging.conf 時, 會返回/usr/ local/nginx/ conf/nginx.conf 文件的內容。root 和alias 配置塊不同, root 使用更廣。
6. 首頁
語法:index file ... ;
默認:index index.html;
配置塊: http 、server 、location 。
說明:如果訪問站點的URI 是/, 一般返回網站首頁。i nd ex 後面可以跟多個參數,Nginx 按照順序訪問這些文件。例如:
location /{
root path;
index /index.html /html/index.php / index.asp;
}
7 . 根據HTTP 返回碼重定向頁面
語法:error_page code[code ... ][=l=answer-code ]uri l @named_location
配置塊: http 、server 、location 、if。
說明: 當某個請求返回錯誤碼時, 如果匹配上了error_page 中設置的頁面,則重定向到新的URI 中。例如:
error_page 404 /404.html
error_page 502 503 504 /50x.html
error_page 403 /http://example.com.forbidden.html
error_page 404 =@fetch;
雖然重定向了URI , 但返回的HTTP 錯誤碼還是原來的值,可以使用=更改返回的錯誤碼。例如:
error page 404 =200 /empty.gif;
error page 404 =403 /forbidden.gif;
如果不想修改URI ,只想重定向到另外一個location 中處理,可以這樣設置:
location / {
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://backend;
}
其中, 404 請求會被反向代理到http ://backend 上游服務器中。
8. 是否允許遞歸使用error_page
語法:recursive_error_pages[onloff];
默認:recursive error pages off;
配置塊: http 、server 、location 。
說明: 標明是否允許遞歸定義error_page 。
9. try_ files
語法:try files pathl [path2] uri;
配置塊: s erver 、location 。
說明: try _fies 後要跟若干路徑,最後必須要有uri 參數,表示嘗試按照順序訪問每一
個path ,如果可以有效地讀取, 就直接向用戶返回這個path 對應的文件並結束請求, 否則
繼續向下訪問。如果都找不到,就定向到最後的uri 上, 所以這個uri 必須存在,而且應該
是可以有效重定向的。例如:
try files /system/maintenance.html $uri $uri / index.html $uri.html @other;
location @other{
proxy pass http://backend;
}
還可以與error_pag 巳配合使用。例如:
location {
try files $uri $uri/ /error.php?c=404 =404;
}
未完待續。。。