Nginx Nginx是一款面向性能設計的HTTP伺服器,相較於Apache、lighttpd具有占有記憶體少,穩定性高等優勢,整體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操作系統下,Nginx使用epoll事件模型,在OpenBSD或FreeBSD操作系統上採用類似於e ...
Nginx
Nginx是一款面向性能設計的HTTP伺服器,相較於Apache、lighttpd具有占有記憶體少,穩定性高等優勢,整體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。 在Linux操作系統下,Nginx使用epoll事件模型,在OpenBSD或FreeBSD操作系統上採用類似於epoll的高效事件模型kqueue。Nginx在官方測試的結果中,能夠支持五萬個並行連接,而在實際的運作中,可以支持二萬至四萬個並行連接。Nginx除了是一個輕量級的非同步框架的Web伺服器,還能用作反向代理和負載平衡器。
Nginx工作時有一個主線程和幾個工作線程,主線程的目的是載入和驗證配置文件、維護工作線程;工作線程用來處理實際的請求,其數量可配置,也可以自動調整為伺服器CPU數量。Nginx主配置文件: /etc/nginx/nginx.conf,及/etc/nginx/conf.d/*.conf。Nginx由不同的模塊組成,這些模塊由配置文件中指定的指令控制。
常見模塊及配置指令
Core functionality
主配置文件/etc/nginx/nginx.conf格式:
main block event { ... } http { ... server { ... } server { ... listen server_name root location /uri/ { ... if CONDITION { ... } } } }
其中 main block 配置段常見的配置指令:
分類:
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
事件驅動相關的配置
正常運行必備的配置:
1、user USERNAME [GROUP];
指定worker processes所屬用戶及用戶組
2、pid /PATH/TO/PID_FILE;
指定存儲nginx主進程進程號碼的文件路徑
3、include file | mask;
指明包含進來的其它配置文件片斷
4、load_module file;
指明要裝載的動態模塊
性能優化相關的配置:
1、worker_processes number | auto;
worker進程的數量:通常應該等於小於當前主機的cpu的物理核心數
auto:當前主機物理CPU核心數
2、worker_cpu_affinity cpumask ...; 或 worker_cpu_affinity auto [cpumask];
綁定CPU核心與worker進程,預設不綁定
cpumask示例:8核
00000001:0號CPU
00000010:1號CPU
3、worker_priority number;
指定worker進程的nice值,設定worker進程優先順序;[-20,20]
4、worker_rlimit_nofile number;
worker進程所能夠打開的文件數量上限
調試、定位問題:
1、daemon on|off;
是否以守護進程方式運行Nignx
2、master_process on|off;
是否以master/worker模型運行nginx;預設為on
3、error_log file [level];
定義錯誤日誌記錄級別
事件驅動相關的配置:
events {
...
}
1、worker_connections number;
每個worker進程所能夠打開的最大併發連接數數量
啟動nginx後最大併發連接數量: worker_processes * worker_connections
2、use method;
指明併發連接請求的處理方法,不指定時nginx會自動選擇最高效的處理方法
use epoll;
3、accept_mutex on | off;
處理新的連接請求的方法:on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達都會通知所有的worker進程
ngx_http_core_module
配置格式:
http { ... ... server { ... server_name root location [OPERATOR] /uri/ { ... } } server { ... } }
常見配置指令:
與套接字相關的配置:
1、server { ... }
虛擬主機配置欄位
安全上下文:http
示例:
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
2、listen address[:port] [default_server] [ssl] [http2|spdy] [backlog=number] [rcvbuf=size] [sndbuf=size];
指定監聽的地址和埠等,常用選項:
default_server:設定為預設虛擬主機
ssl:限制僅能夠通過ssl連接提供服務
backlog=number:後援隊列長度
rcvbuf=size:接收緩衝區大小
sndbuf=size:發送緩衝區大小
安全上下文:server
示例:
# 監聽指定的IP及埠
listen 192.168.4.119:80;
# 監聽指定埠只能通過SSL
listen 443 ssl;
3、server_name name ...;
指明虛擬主機的主機名稱,後可跟多個由空白字元分隔的主機名稱;
安全上下文:server
示例:
# 支持*通配任意長度的任意字元
server_name *.test.com www.test.*;
# 支持~起始的字元做正則表達式模式匹配
server_name ~^www\d+\.test\.com$
4、tcp_nodelay on | off;
在keepalived模式下的連接是否啟用tcp_nodelay選項
安全上下文:http,server,location
5、tcp_nopush on|off;
在sendfile模式下,是否啟用選項
安全上下文:http,server,location
6、sendfile on | off;
是否啟用sendfile功能
安全上下文:http,server,location,if in location
定義路徑相關的配置:
7、root path;
設置web資源路徑映射,用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑
安全上下文:http,server,location,if in location
8、location [ = | ~ | ~* | ^~ ] uri { ... }
設置請求的uri對應的資源。在一個server中location配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的uri來檢查定義的所有location,並找出一個最佳匹配,而後應用其配置。其中:
=:對uri做精確匹配
^~:對uri的左半部分做匹配檢查,不區分字元大小寫
~:對uri做正則表達式模式匹配,區分字元大小寫
~*:對uri做正則表達式模式匹配,不區分字元大小寫
不帶符號:匹配起始於此uri的所有的url
@:定義位置名稱,實現資源跳轉
匹配優先順序:=, ^~, ~/~*,不帶符號;
安全上下文:server,location
示例:
server {
listen 192.168.4.119:80;
server_name www.test.com;
root /data/web; #設置虛擬主機的web根目錄
# = 精確匹配/data/web/test目錄下的test.html文件
location = /test.html {
root /data/web/test; #指定location的web根目錄
}
# ~ 正則匹配/data/web/aaa目錄下帶有AAA字元串的文件(區分大小寫)
location ~ .*AAA.* {
root /data/web/aaa;
}
# ~* 正則匹配/data/web/bbb目錄下帶有bbb字元串的文件(不區分大小寫)
location ~* .*bbb.* {
root /data/web/bbb;
}
# ^~ 匹配/data/web/www目錄下的文件
location ^~ /www {
root /data/web/www
}
}
9、alias path;
定義路徑別名,文檔映射的另一種機制
安全上下文:location
註意:root指令和alias指令的意義不同,並且不能同時用在同一個location中。
(1) root,給定的路徑對應於location中的/uri/左側的/
(2) alias,給定的路徑對應於location中的/uri/右側的/
10、error_page code ... [=[response]] uri;
指定錯誤的uri路徑
安全上下文:http,server,location,if in location
示例:
#當網頁的狀態碼為404時,跳轉到指定的404.html頁面
error_page 404 /404.html;
11、try_files file ... uri;
如果指定路徑下文件不存在,則跳轉到指定的uri或者返回指定狀態碼。
安全上下文:server,location
示例:
location ~ .*test.* {
try_files test.html /404.html;
}
#嘗試打開test.html,如果沒有此文件,則返回狀態碼500
location = /test.html {
try_files test.html =500;
}
定義客戶端請求的相關配置
12、keepalive_timeout timeout [header_timeout];
設定保持連接的超時時長,0表示禁止長連接;預設為75s
安全上下文:http,server,location
13、keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,預設為100
安全上下文:http,server,location
14、keepalive_disable none | browser ...;
對哪種瀏覽器禁用長連接
安全上下文:http,server,location
15、send_timeout time;
向客戶端發送響應報文的超時時長,此處指兩次連續寫操作之間的間隔時長
安全上下文:http,server,location
16、client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小,預設為16k;超出此大小時,其將被暫存到磁碟上的由client_body_temp_path指令所定義的位置
安全上下文:http,server,location
17、client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量,其中level表示存儲目錄的數量,用16進位表示
安全上下文:http,server,location
示例:
client_body_temp_path /var/tmp/client_body 2 1 1
2:表示用2位16進位數字表示一級子目錄:00-ff,共256個一級子目錄
1:表示用1位16進位數字表示二級子目錄;0-f,共16個二級子目錄
1:表示用1位16進數制字表示三級子目錄:0-f,共16個二級子目錄
對客戶端進行限制的相關配置:
18、limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制
安全上下文:http,server,location,if in location
19、limit_except method ... { ... }
限制客戶端除指定的請求方法之外不能訪問伺服器
安全上下文:location
示例:
# 限制192.168.4.0/24的客戶端只能通過GET請求
limit_except GET {
allow 192.168.4.0/24;
deny all;
}
文件操作優化的配置
20、aio on|off | threads[=pool];
是否啟用aio功能
安全上下文:http,server,location
21、directio size | off;
當文件大於等於給定的大小時啟用O_DIRECT標記,例如directio 4m;
安全上下文:http,server,location
22、open_file_cache off; 或 open_file_cache max=N [inactive=time];
nginx可以緩存以下三種信息:
(1) 文件的描述符、文件大小和最近一次的修改時間
(2) 打開的目錄結構
(3) 沒有找到的或者沒有許可權訪問的文件的相關信息
max=N:可緩存的緩存項上限;達到上限後會使用LRU演算法實現緩存管理
inactive=time:緩存項的非活動時長,在指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses所指定的次數的緩存項即為非活動項
安全上下文:http,server,location
23、open_file_cache_valid time;
緩存項有效性的檢查頻率;預設為60s;
安全上下文:http,server,location
24、open_file_cache_min_uses number;
在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類為活動項,預設為1
安全上下文:http,server,location
25、open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息,預設為off
安全上下文:http,server,location
ngx_http_index_module
此模塊用於實現基於IP的訪問控制功能。
index file...; 定義預設的web網頁資源,預設為index index.html 安全上下文:http,server,location 示例: location / { index index.html; }
ngx_http_access_module
allow|deny address|CIDR|unix:|all; 允許或拒絕訪問的Ip網段,匹配順序為從上往下匹配。 安全上下文: http,server,location,limit_except 示例: location / { deny 192.168.4.1; allow 192.168.4.0/24; deny all; }
ngx_http_auth_basic_module
此模塊用於實現基於用戶的訪問控制功能。 1、auth_basic string|off 配置auth_basic提示的信息 安全上下文:http,server,location,limit_except 2、auth_basic_user_file file; 指定保存用戶賬戶密碼的file文件,該文件由htpasswd生成 安全上下文:http,server,location,limit_except 示例: #生成保存認證用戶信息的文件 [root@nginx ~]# htpasswd -c /etc/nginx/nginxpasswd test1 New password: Re-type new password: Adding password for user test1 [root@nginx ~]# htpasswd /etc/nginx/nginxpasswd test2 New password: Re-type new password: Adding password for user test2 #添加nginxbasic認證配置 location ^~ /auth { auth_basic "nginx auth_basic"; auth_basic_user_file /etc/nginx/nginxpasswd; }
ngx_http_stub_status_module
此模塊用於輸出nginx的基本狀態信息。
stub_status;
用於輸出nginx的基本狀態信息
安全上下文:server,location。
示例:
location /status {
stub_status;
}
訪問http://192.168.4.119/status可獲取nginx伺服器的狀態信息,如下:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
各項釋義:
Active connections: 活動狀態的連接數;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閑連接數
ngx_http_log_module
1、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; 用於設置訪問日誌文件路徑,格式及相關的緩衝的配置。預設情況下,access_log預定義了combined的日誌格式,用戶可在format中直接調用。 安全上下文:http,server,location,if in location,limit_except 示例: #將日誌以combined格式記錄在指定路徑 access_log /var/log/nginx/access.log combined; #將訪問nginx的status的頁面以指定的test格式存放在指定的路徑中 location /status { stub_status; access_log /data/log/access_log test; } 2、log_format name [escape=default|json|none] string ...; 在string中可使用nginx核心模塊及其它模塊內嵌的變數來生成log日誌,預設日誌的格式為combined格式。 安全上下文:http 示例: #定義名為test的日誌格式 log_format test '$remote_addr $status "$request"' 3、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; 用於緩存各日誌文件相關的元數據信息。 安全上下文:http,server,location 各項釋義: max:緩存的最大文件描述符數量; min_uses:在inactive指定的時長內訪問大於等於此值方可被當作活動項,預設為1 inactive:非活動時長; valid:驗正緩存中各緩存項是否為活動項的時間間隔,預設為60s 示例: open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
ngx_http_gzip_module
此模塊能夠使用gzip壓縮響應報文的大小,通過能夠將需要傳輸的數據減少一半或者更多 1、gzip on|off; 是否開啟壓縮響應 安全上下文:http,server,location,if in location 2、gzip_comp_level level; 設置壓縮響應的等級,從1到9,預設為1 安全上下文:http,server,location 3、gzip_disable regex ...; 根據正則表達式匹配瀏覽器類型來關閉響應壓縮 安全上下文:http,server,location 4、gzip_min_length length; 指定被壓縮的響應報文的最小長度,預設為20個位元組 安全上下文:http,server,location 5、gzip_buffers number size; 設置壓縮響應報文時的緩衝區數量及每個緩衝區大小 安全上下文:http,server,location 6、gzip_proxied off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any ...; nginx作為代理伺服器接收到從被代理伺服器發送的響應報文後,在何種條件下啟用壓縮功能,預設為off 釋義: off:對代理的請求不啟用; no-cache,no-store,private:表示從被代理伺服器收到的響應報文首部的Cache-Control的值為此三者中任何一個,則啟用壓縮功能 安全上下文:http,server,location 7、gzip_types mime-type ...; 壓縮過濾器,僅對此處設定的MIME類型的內容啟用壓縮功能,預設壓縮text/html 安全上下文:http,server,location 示例: gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
ngx_http_ssl_module
1、ssl on|off; 在虛擬伺服器上啟動https協議 安全上下文:http,server 2、ssl_certificate file; 指定當前https協議使用的SSL證書,證書需為pem格式。 安全上下文: http,server 3、ssl_certificate_key file; 指定當前https協議所使用證書的私鑰文件 安全上下文: http,server 4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 指定支持的ssl協議的版本,預設為後三個 安全上下文: http,server 5、ssl_session_cache off|none|[builtin[:size]] [shared:NAME:size]; 用於設置存儲ssl會話參數的緩存類型及大小 釋義: builtin[:size]:使用OpenSSL內建的緩存,此緩存為每worker進程私有; shared:NAME:size:在各worker之間使用一個共用的緩存 安全上下文: http,server 6、ssl_session_timeout time; 設置客戶端可復用緩存的會話參數的時間 安全上下文: http,server 示例: server { listen 192.168.0.83:443 ssl; server_name www2.abc.com; root /data/https; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:SSLCACHE:20m; }
ngx_http_rewrite_module
此模塊用於將用戶請求的URI基於regex所描述的模式進行檢查,而後完成替換,使得用戶訪問替換後的URI
1、rewrite regex replacement [flag];
此指令將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI。如果replacement是以http://或https://開頭,則替換結果會直接以重定向返回給客戶端。另外如果在同一級配置塊中存在多個rewrite規則,則會自下而下逐個檢查;被某條件規則替換完成後,會新起一輪的替換檢查,因此隱含有迴圈機制;[flag]所表示的標誌位用於控制此迴圈機制,包括以下標誌:
last:重寫完成後停止對當前URI在當前location中後續的其他重寫操作,而後對新的URI啟動新一輪重寫檢查,即提前重啟新一輪的重寫迴圈;
break:重寫完成後停止對當前URI在當期location中的後續的其他重寫操作,而後直接跳轉至重寫規則配置塊之後的其他配置,結束重寫迴圈;
redirect:重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端重新發起請求;此flag所重寫的URI不能以http://或https://開頭;
permanent:重寫完成後以永久重定向的方式直接返回重寫後生成的新的URI給客戶端,由客戶端重新發起請求
安全上下文:server,location,if
示例:
location /users/ {
rewrite ^/users/profile/(.*)$ /show?user=$1? break;
}
2、return code [text];
return code URL;
return URL;
停止處理請求,並返回指定的文本信息、狀態碼或URL給客戶端
安全上下文:server,location,if
示例:
location ~ .*test.* {
return 404 "test";
}
3、rewrite_log on | off;
是否開啟重寫日誌
安全上下文:http,server,location,if
4、if (condition) { ... };
條件判斷配置段,當滿足條件時,執行配置段中的指令
其中condition中的比較符有以下幾種:
字元串比較操作符:
=:匹配
!=:不匹配
~:模式匹配,區分字元大小寫;
!~:模式不匹配,區分字元大小寫;
~*:模式匹配,不區分字元大小寫;
!~*:模式不匹配,不區分字元大小寫
文件及目錄存在性判斷:
-e,!-e:文件是否存在;
-f,!-f:文件是否為普通文件;
-d,!-d:文件是否為目錄;
-x,!-x:文件是否可執行
安全上下文:server,location
示例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
5、set $variable value;
自定義用戶變數
安全上下文:server,location,if
示例:
set $newindex "index.html";
if ($host = "www.sina.com") {
set $newindex "index.php";
}
index $newindex;
ngx_http_referer_module
valid_referers none|blocked|server_names|string ...; 定義referer首部的合法可用值 釋義: none:請求報文首部沒有referer首部; blocked:請求報文的referer首部沒有值; server_names:參數,其可以有值作為主機名或主機名模式; arbitrary_string:直接字元串,但可使用*作通配符 regular_expression:被指定的正則表達式模式匹配到的字元串,要使用~開頭,如 ~.*\.test\.com 安全上下文: server,location 示例: valid_referers none blocked server_names *.teest.com tesst.* ~\.test\.; if($invalid_referer) { return http://www.test.com/test.jpg; }