nginx配置文件詳細解說:
一、配置指令
1、main配置段常見的配置指令:
1)分類:
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
時間驅動相關的配置
2、正常運行必備的配置
1)user
systax:user user [group]; #可以配置一個組,不過一般默認都是nginx配置
2)pid /PATH/TO/PID_FILE;
指定存儲nginx主進程號碼的文件路徑
3)include file | mask;
指明包含進來的其他配置文件片段;
4)load_module file;
指明要裝載的動態模塊;
3、性能優化相關的配置:
1)worker_processes number | auto;
worker進程的數量;通常應該等於小於當前主機的cpu的物理核心數;大於的話是沒有什么用的。小於的話主要留很小一些核心數給其他服務來使用。
auto:默認是當前主機物理CPU核心數(nginx自動匹配);
2)worker_cpu_affinity cpumask ......;
worker_cpu_affinity auto [cpumask];
CPU MASK怎么表示呢?
假如此時電腦有8顆CPU核心數。 00000000:表示8顆CPU核心,下面這個是位圖掩碼表示法。 00000001:0號CPU 00000010:1號CPU 00000100:2號CPU 00001000:3號CPU 00010000:4號CPU 00100000:5號CPU 01000000:6號CPU 10000000:7號CPU
案例演示:加入此時我的電腦是4顆CPU
一旦將某個子進程綁定在了某個核心上,那么我們可以做個壓測看一下,此時的子進程所使用的核心序號是一定的。
3)進程優先級
worker_priority number;
指定worker進程的nice值,舍得worker進程優先級;[-20.20]
4)文件數量大小
worker_rlimit_nofile number; #其中number的值要大於worker_processes*worker_connections的乘積。
案例演示:
4、調試、定位問題:
1)daemon on|off;
是否以守護進程方式運行nginx,centos6中是守護模式,centos7中不必打開守護模式,因為由systemd統一管理。
2)master_process on | off;
是否以master/worker模型運行nginx,默認是on;我們使用的也是在on模式下。
3)error_log file [level];
5、事件驅動相關的配置:
events {
.......
}
1)worker_connections number;
每個worker進程所能夠打開的最大並發連接數數量;
2)use method;
指明並發連接請求的處理方法;method一般有兩種:select和epoll。select的最大限制是1024,而epoll的連接是無限制的,所以nginx肯定使用epoll並發請求機制。
關於兩者的區別:我們可以看一下:
select | epoll | |
性能 | 隨着連接數增加,急劇下降。處理成千上萬並發連接數時,性能很差。 | 隨着連接數增加,性能基本上沒有下降。處理成千上萬並發連接時,性能很好。 |
連接數 | 連接數有限制,處理的最大連接數不超過1024。如果要處理超過1024個連接數,則需要修改FD_SETSIZE宏,並重新編譯 。 | 連接數無限制。 |
內在處理機制 | 線性輪詢 | 回調callback |
開發難易程度 | 低 | 中 |
比如:use epoll;
3)accept_mutex on | off
處理新的連接請求的方法;on以為着由worker輪流處理新請求,講究起點公平。off以為着每個新請求的到達都會通知所有的worker進程,講究結果公平。
二、主機配置
1、與套接字相關的配置
1)server{......};
配置一個虛擬主機;
server {
listen address[:PORT] | PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT; #表示web服務的默認工作路徑是在哪個地方
# proxy_pass URL; #表示nginx此時僅僅是一台反向代理服務器。
}
2) listen PORT | address [:port] | unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server:設定為默認虛擬主機;
ssl:限制僅能后通過ssl連接提供服務;
backlog=number:后援隊列長度;
rcvbuf=size:接受緩沖區大小;
sndbuf=size:發送緩沖區大小;
3)server_name name .....;
指明虛擬主機的主機名稱;后可跟多個由空白字符分割的字符串;
支持*通配任意長度的任意字符;server_name *.chaofeng.com www.chaofeng.*
支持~其實的字符做正則表達式模式匹配;server_name ~^www\d+\.chaofeng\.com$
匹配機制:
(1)首先是字符串精准匹配
(2)左側*通配符
(3)右側*通配符
(4)正則表達式;
4)tcp_nodelay on | off;
在keepalived模式下的連接是否啟用TCP_NODELAY選項;
delay:延遲發送
tcp_nodelay on表示要求不要合並發送,請求一個發送一個;對非保持連接無效。
5)tcp_nopush on | off
在sendfile模式下,是否啟用TCP_CORK選項
tcp_nopush on :在一個包中發送響應頭和文件的開頭;以完整的包發送文件
6)sendfile on | off
是否啟用sendfile功能;
系統調用sendfile()函數通過DMA把硬盤數據拷貝到kernel buffer,然后數據被kernel直接拷貝到另外一個與socket相關的kernel buffer,這里沒有user mode和kernel mode之間的切換,在kernel中直接完成了從一個個buffer到另一個buffer的拷貝;DMA把數據從kernel bueer直接拷貝到協議棧,沒有切換,也不需要數據從user mode拷貝到kernel mode,因為數據就在kernel里面。步驟減少了,切換減少了,自然性能就提升了。
7)root path;
設置web資源路徑映射,用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;可用的位置:http,server,location,if in location
8)location [ = | ~ | ~* ^~ ] uri {.....}
set configuration depending on a request URI
在一個server中location配置段可存在多個,用於實現從URI到文件系統的路徑映射;nginx會根據用戶請求的URI來檢查定義的所有location,並找出一個最佳匹配,而后應該其配置;
=:對URI做精准匹配;
location = / {
........
}
例如:會去匹配http://www.chaofeng.com/,但是不會匹配http://www.chaofeng.com/index.html
~:對URI做正則表達式模式匹配,區分字符大小寫;
~ *:對URI做正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
不帶符號:匹配起始於此uri的所有的uri;
匹配優先級:= > ^~ > ~ / ~* > 不帶符號;
兩個普通的location(即不帶符號),匹配目錄最長的那個。
兩個正則(正則的前半部分是一樣的,后半部分可能一個匹配的路徑長,另外一個路徑短),不管有序無序,只匹配到第一個正則。
案例:
server { listen 80; server_name www.ilinux.io; root /data/nginx/vhost1; error_page 404 /notfound.html; location / { #root /data/nginx/vhost2; allow all; } location ~* \.(jpg|png)$ { allow all; } location ^~ /images/ { alias /data/pictures/; } }
在location中,如果內部定義了root指定映射的路徑,則會覆蓋掉server內部的那個root路徑。也就是說他們是有繼承關系的。我們可以把server的哪個root映射的路徑當作父root路徑,那么location中那個root映射的路徑當作子root路徑,父root路徑統管全局作用,如果location沒有定義子root路徑,那么這些location默認會使用父root映射的路徑下的內容,但是如果location中定義子root路徑,那么子root路徑將會繼承父root路徑,這里的繼承是指子root路徑覆蓋父root路徑的映射內容。還要注意的是,子root路徑僅僅在當前自己所在的那個location中有效,子root路徑只有局部作用。
9)alias path
定義路徑別名,文檔映射的另一種機制;僅僅能用於location上下文;
注意:
location中使用root指令和alias指令的意義不同;
a)root,給定的路徑對應於location中的/URI/左側的/;
b)alias,給定的路徑對應於location中的/URI/右側的/;
案例:
現在我們訪問一下:
現在我們修改一下配置:
我的images目錄下是沒有header.jpg這張圖片的。
現在我們訪問一下:
總結: alias ,匹配/images/中的第二個/,即訪問 www.nginx_vhosts1.io/images/header.jpg 。為路徑 /var/nginx_lt1/ 下的header.jpg.如上圖
10)error_page code uri;
瀏覽器返回給用戶的錯誤界面404其實也是一個頁面,只有當狀態碼為404的時候,web服務器會調用這個界面然后返回給瀏覽器。所以我們也可以定義一個錯誤頁面返回給我們。
案例:
然后我們在/var/nginx_lt1/目錄下定義一個錯誤頁面
打開瀏覽器故意訪問一個不存在的頁面:
11)index file .......;
默認資源:http,server,location
三、定義客戶端請求的相關配置
1)keepalive_timeout timeout [header_timeout];
設定保持連接的超時時長,0表示禁止長連接;默認時75s;
2)keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,默認是100。
3)keepalive_disable none | browser .....;
對那種瀏覽器禁用長連接;(目前市面的瀏覽器都是比較新的,所以這一項不必過於關注)
4)send_timeout time;
向客戶端發送響應報文的超時時長,此處,是指兩次寫操作之間的間隔時長。
5)client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩沖區大小;默認是16k;超出此大小時,其將暫存到磁盤上的由client_body_temp_path指令所定義的位置
6)client_body_temp_path apth [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;(設定文件路徑路由的方式)
主要使用16進制的數字;
client_body_temp_path /var/tmp/client_body 2 1 1
2 :表示256個一級子目錄。
1 :每個一級子目錄下有16個二級子目錄
1 :每個二級子目錄下有16個三級子目錄
計算:那么一共有256*16*16個三級子目錄。
四、對客戶端進行限制的相關配置:
1)limit_rate rate;
- 限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;
Context: http, server, location, if in location
2)limit_except method ... {...}
- 限制對指定的請求方法之外的其它方法的使用客戶端
-
示例: limit_except GET { allow 192.168.1.0/24; deny all; } #除了GET和HEAD之外,其它所有的method都允許192.168.1.0/24網絡地址訪問,其它ip地址都拒絕;
五、文件操作優化配置
1)aio on | off |threads[=pool];
- 是否啟用aio功能;默認為off。使用默認就行
- Context: http, server, location
2)directio size | off;
在linux主機啟用IO_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如:directio 4m;
directio與sendfile功能講解:
要使aio生效需把directio設置為打開狀況,並且如果aio生效,那么將自動不使用sendfile(),這在linux下這是顯然的,要么利用aio讀到緩存區,要么利用sendfile()直接發送出去,兩者不可兼用,而對於freebsd系統下aio和sendfile並用的情況,我並不了解,所以也就不妄加評論;
可以看到directio是針對每個請求的文件大小而決定是否開啟directio的,因此對於上面的整個示例配置,也就會針對每個請求的不同而不同: 如果某處請求的文件大於等於512k,那么將啟用directio,從而aio生效,進而sendfile不生效; 如果某處請求的文件小於512k,那么將禁用directio,從而aio也就不生效,轉而使用sendfile(),即sendfile生效;
這種設計貌似剛好把linux下aio和sendfile兩種機制的優點很好的結合起來使用。對於大文件采用aio,節省cpu,而對於小文件,采用sendfile,減少拷貝;並且對於大文件aio采用directio,避免擠占文件系統緩存,讓文件系統緩存更多的小文件。 從理論上來看,這種配置比較適合系統內存有限、小文件請求比較多、間隔有幾個大文件請求的Web環境;如果內存足夠大,那么應該充分利用文件系統緩存,而directio使得aio無法使用緩存是衡量最終是否需要采用aio的一個需要仔細考慮的因素;網上有人總結說nginx+aio很好,也有人說其很差,其實根據特定的系統環境和應用場景來做配置調節,才能達到性能的最優,nginx提供的 AIO 只是一套工具,沒有固定的好與差之分,就看你能否恰當的用好它,但據nginx官網論壇來看,在linux系統的大部分場景下,目前因使用aio功能附加的限制而帶來的實際效果估計並不太理想:
open_file_cache max=N [inactive=time];
Configures a cache that can store;
nginx可以緩存以下三種信息:
- <1> 文件的描述符、文件大小和最近一次的修改時間;
- <2> 打開的目錄結構;
- <3> 沒有找到的或者沒有權限訪問的文件的相關信息;
-
-
-
- max=N: 可緩存的緩存項上限;達到上限后會使用LRU算法(最近最少使用)實現緩存管理;
- inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即為非活動項;
-
-
4)open_file_cache_valid time;
-
-
- 緩存項有效性的檢查頻率;默認為60s;
-
5)open_file_cache_min_uses number;
-
-
- 在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類為活動項;
-
6)open_file_cache_errors on|off;
-
-
- 是否緩存查找時發生錯誤的文件一類的信息;
-
六、權限
1)ngx_http_auth_basic_module模塊:實現基於用戶的訪問控制,使用basic機制進行用戶認證
nginx使用htpasswd(包為httpd-tools)制作賬號密碼,然后添加在虛擬主機中。
2)ngx_http_stub_status_module模塊:用於輸出nginx的基本狀態信息
stub_status;
配置示例:

訪問一下:
對輸出內容做解釋:
Active connections: 活動狀態的連接數;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閑連接數
3)ngx_http_log_module模塊:用於以指定的格式寫入請求日志
log_format name string ...;
-
- string 可以使用nginx核心模塊及其它模塊的內嵌變量
- 注意:此配置只能用於http段中
access_log path [format [buffer=size] [gzip=[level1]] [flush=time][if=condition]];
access_log off; #這個功能在一些不必要的location中可以關閉日志功能
- 訪問日志文件路徑,格式及相關的緩沖的配置;
- buffer=size: 設置日志緩沖區大小
- flush=time:定義清空時長
示例:
4)open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
-
- 緩存各日志文件相關的元數據信息;
- max:緩存的最大文件描述符數量;
- min_uses:在inactive指定的時長內訪問大於等於此值方可被當作活動項;
- inactive:非活動時長
- valid:驗證緩存中各緩存項是否為活動項的時間間隔
示例:為nginx定義使用類似於httpd的combined格式的訪問日志 #在/etc/nginx/nginx.conf文件中http段配置日志格式 [root@wujunjie ~]# vim /etc/nginx/nginx.conf http { log_format comd '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent"'; ... } #給vhost1主機添加訪問日志,設置為comd格式 [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf server { ... access_log /var/log/nginx/vhost1-access.log comd; ... } #訪問測試后查看日志格式 [root@wujunjie ~]# tail -2 /var/log/nginx/vhost1-access.log 192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images HTTP/1.1" 301 388 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" 192.168.1.106 - tom [06/Aug/2018:23:18:27 +0800] "GET /images/ HTTP/1.1" 403 324 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
5)ngx_http_gzip_module:用gzip格式壓縮響應;
1.gzip on | off;
Enables or disables gzipping of responses.
2.gzip_comp_level level;
Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.
3.gzip_disable regex ...;
Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.
4.gzip_min_length length;
啟用壓縮功能的響應報文大小閾值;
5.gzip_buffers number size;
支持實現壓縮功能時為其配置的緩沖區數量及每個緩存區的大小;
6.gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx作為代理服務器接收到從被代理服務器發送的響應報文后,在何種條件下啟用壓縮功能的;
off:對代理的請求不啟用
no-cache, no-store,private:表示從被代理服務器收到的響應報文首部的Cache-Control的值為此三者中任何一個,則啟用壓縮功能;
7.gzip_types mime-type ...;
壓縮過濾器,僅對此處設定的MIME類型的內容啟用壓縮功能;
配置示例: gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
案例演示:
此配置可用位置:http, server, location(在http中定義表示對所有的server生效,在server中定義,表示對所有的location生效。在location中定義,表示對某個location生效)
如何查找壓縮的數據類型呢?
6)ngx_http_ssl_module模塊:
1.ssl on | off;
是否啟用htttps協議
2.ssl_certificate file;
當前虛擬主機使用PEM格式的證書文件;
3.ssl_certificate_key file;
當前虛擬主機上與其證書匹配的私鑰文件;
4.ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1][TLSv1.2]
支持ssl協議版本,默認為后三個;
5.ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用Openssl內建的緩存,此緩存為每worker進程私有;
[shared:name:size]:在各worker之間使用一個共享的緩存;
6.ssl_session_timeout time;
客戶端一側的連接可以服用ssl session cache中緩存的ssl參數的有效時長;
案例:
配置示例: #創建私有CA自簽證書,以192.168.32.132為CA [root@www ~]# cd /etc/pki/CA [root@www CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ........................................................................+++ ..................................+++ e is 65537 (0x10001) [root@www CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:ZHEJIANG Locality Name (eg, city) [Default City]:NINGBO Organization Name (eg, company) [Default Company Ltd]:ilinux.com Organizational Unit Name (eg, section) []:opt Common Name (eg, your name or your server's hostname) []:www.ilinux.com Email Address []: [root@www CA]# touch index.txt [root@www CA]# echo 01 > serial #在nginx主機上生成私鑰和申請證書 [root@wujunjie ~]# mkdir /etc/nginx/ssl [root@wujunjie ~]# (umask 077;openssl genrsa -out /etc/nginx/ssl/.nginx.key 2048) [root@wujunjie ~]# openssl req -new -key /etc/nginx/ssl/.nginx.key -out /etc/nginx/ssl/nginx.crs -days 365 [root@wujunjie ssl]# scp nginx.csr [root@192.168.32.132:/tmp](mailto:root@192.168.32.132:/tmp) #在CA上簽署證書 [root@www CA]# openssl ca -in /tmp/nginx.csr -out certs/nginx.crt -days 365 #把簽署好的證書nginx.crt傳會nginx主機 [root@www CA]# scp certs/nginx.crt root@192.168.32.128:/etc/nginx/ssl #修改nginx配置文件,啟用ssl [root@wujunjie ~]# vim /etc/nginx/conf.d/vhost1.conf server { listen 443 ssl; server_name www1.ilinux.com; root /data/nginx/vhost1; index index.html error_page 404 =200 /notfound.html; access_log /var/log/nginx/vhost1-access.log main; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/.nginx.key; ssl_protocols sslv2 sslv3 tlsv1 tlsv1.1 tlsv1.2; ssl_session_cache shared:SSL:10m; location / { allow all; } } [root@wujunjie ~]# vim /data/nginx/vhost1/index.html <h1>nginx</h1> <h2>192.168.32.128</h2> #檢查語法,重載配置 [root@wujunjie ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@wujunjie ~]# nginx -s reload
補充一篇博客的說明:
7)ngx_http_rewrite_module模塊:
用於使用正則表達式模式更改請求URI,返回重定向,並有條件的選擇配置
例如:
bbs.magedu.com/ --> www.magedu.com/bbs/
http://www.magedu.com/ --> https://www.magedu.com/
http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom/
http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/
將用戶請求的URI基於regex所描述的模式進行檢查,然后完成替換;
1.rewrite regex replacement [flag]
將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI;
注意:如果在同一級配置塊中存在多個rewrite規則,那么會自下而上逐個檢查;被某條件規則替換完成后,會重新一輪的替換檢查,因此,隱含有循環機制;[flag]所表示的標志位用於控制此循環機制;
如果replacement是以http://或https://開頭,則替換結果會直接以重定向返回給客戶端;301:永久重定向;
[flag]
last:重寫完成后停止對當前URI在當前location中后續的其他重寫操作,而后對新的URI啟動新的一路重寫檢查;提前重啟新一輪循環; break:重寫完成后停止對當前URI在當前location中后續的其他重寫操作,而后直接跳轉至重寫規則配置塊之后的其他配置;循環結束; redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端,有客戶端重新發起請求;不能以http://或https://開頭; permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;
案例:
[root@www1 conf.d]# vim vhost.conf server { listen 80; server_name www.ilinux.com; root /data/nginx/vhost1; rewrite /(.*)\.png$ /$1.jpg; } [root@www1 conf.d]# nginx -s reload
注意:如果沒有加flag,默認就是permanent
http重定向為https
[root@www1 conf.d]# vim vhost.conf server { listen 80; server_name www.ilinux.com; root /data/nginx/vhost1; rewrite /(.*)$ https://%{HTTP_HOST} /$1 } [root@www1 conf.d]# nginx -s reload
2、return
停止處理並將指定的代碼返回給客戶端
return code [text]; return code URL; return URL;
3、rewrite_log on |off;
是否開啟重寫日志
4.if (condition) {...}
引入一個新的配置上下文:條件滿足是,執行配置塊中的配置指令;
可用於server和location段中
condition: 比較操作符: == != ~:模式匹配,區分字符大小寫 ~:模式匹配,區分字符大小寫 !~:模式不匹配,區分字符大小寫 !~:模式不匹配,不區分字符大小寫 文件及目錄存在性判斷: -e, !-e -f, !-f -d, !-d -x, !-x
5、set $variable_value
用戶自定義變量
7)ngx_http_referer_module模塊
作用:The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the “Referer” header field.
格式:valid_referers none | blocked | server_names | string ...;
定義referer首部的合法引用用值;
none:請求報文首部沒有referer首部; blocked:請求報文的referer首部沒有值; server_names:參數,其可以有值作為主機名或主機名模式; arbitrary_string:直接字符串,但可使用*作通配符; regular expression:被指定的正則表達式模式匹配到的字符串;要使用~打頭,例如 ~.*\.magedu\.com; $invalid_referer : 模塊內置變量,非法引用,只要沒被valid_referers定義匹配到的就是非法引用 ...
示例:
配置示例: valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; if($invalid_referer) { return http://www.magedu.com/invalid.jpg; }
示例: