常用配置項
在工作中,我們與 nginx 打交道更多的是通過其配置文件來進行。那么掌握這些配置項各自的作用就很有必要了。(相關推薦:Linux教程)
首先, nginx.conf 的內容通常是這樣的:
...?????????????? ...????????????#核心摸塊 events?{????????#事件模塊 ???... } http?{?????#?http?模塊 ????server?{??????#?server塊 ????????location?[PATTERN]?{??#?location塊 ????????????... ????????} ????????location?[PATTERN]?{ ????????????... ????????} ????} ????server?{ ??????... ????} } mail?{?????#?mail?模塊 ?????server?{????#?server塊 ??????????... ????} }
我們依次看一下每個模塊一般有哪些配置項。
核心模塊
user?admin;?#配置用戶或者組 worker_processes?4;?#允許生成的進程數,默認為1? pid?/nginx/pid/nginx.pid;?#指定?nginx?進程運行文件存放地址? error_log?log/error.log?debug;?#錯誤日志路徑,級別
事件模塊
events?{? ????accept_mutex?on;?#設置網路連接序列化,防止驚群現象發生,默認為on? ????multi_accept?on;?#設置一個進程是否同時接受多個網絡連接,默認為off? ????use?epoll;?#事件驅動模型select|poll|kqueue|epoll|resig ????worker_connections?1024;?#最大連接數,默認為512 }
http 模塊
http?{ ????include???????mime.types;???#文件擴展名與文件類型映射表 ????default_type??application/octet-stream;?#默認文件類型,默認為text/plain ????access_log?off;?#取消服務日志???? ????sendfile?on;???#允許?sendfile?方式傳輸文件,默認為off,可以在http塊,server塊,location塊 ????sendfile_max_chunk?100k;??#每個進程每次調用傳輸數量不能大于設定的值,默認為0,即不設上限 ????keepalive_timeout?65;??#連接超時時間,默認為75s,可以在http,server,location塊 ????server? ????{ ????????????keepalive_requests?120;?#單連接請求上限次數 ????????????listen?80;?#監聽端口 ????????????server_name??127.0.0.1;???#監聽地址?????? ????????????index?index.html?index.htm?index.php; ????????????root?your_path;??#根目錄 ????????????location?~?.php$ ????????????{ ??????????????????fastcgi_pass?unix:/var/run/php/php7.1-fpm.sock; ??????????????????#fastcgi_pass?127.0.0.1:9000; ??????????????????fastcgi_index?index.php; ??????????????????include?fastcgi_params; ????????????} ????} }
配置項解析
worker_processes
worker_processes 用來設置 Nginx 服務的進程數。該值推薦使用 CPU 內核數。
worker_cpu_affinity*
worker_cpu_affinity 用來為每個進程分配CPU的工作內核,參數有多個二進制值表示,每一組代表一個進程,每組中的每一位代表該進程使用CPU的情況,1代表使用,0代表不使用。所以我們使用 worker_cpu_affinity0001001001001000; 來讓進程分別綁定不同的核上。默認情況下worker進程不綁定在任何一個CPU上。
worker_rlimit_nofile
設置毎個進程的最大文件打開數。如果不設的話上限就是系統的 ulimit–n 的數字,一般為65535。
worker_connections
設置一個進程理論允許的最大連接數,理論上越大越好,但不可以超過 worker_rlimit_nofile 的值。
use epoll
設置事件驅動模型使用 epoll。epoll 是 Nginx 支持的高性能事件驅動庫之一。是公認的非 常優秀的事件驅動模型。
accept_mutex off
關閉網絡連接序列化,當其設置為開啟的時候,將會對多個 Nginx 進程接受連接進行序列化,防止多個進程對連接的爭搶。當服務器連接數不多時,開啟這個參數會讓負載有一定程度的降低。但是當服務器的吞吐量很大時,為了效率,請關閉這個參數;并且關閉這個參數的時候也可以讓請求在多個 worker 間的分配更均衡。所以我們設置 accept_mutex off;。
multi_accept on
設置一個進程可同時接受多個網絡連接。
Sendfile on
Sendfile 是 Linux2.0 以后的推出的一個系統調用,它能簡化網絡傳輸過程中的步驟,提高服務器性能。
不用 sendfile 的傳統網絡傳輸過程:
硬盤?>>?kernel?buffer?>>?user?buffer?>>?kernel?socket?buffer?>>?協議棧
用 sendfile() 來進行網絡傳輸的過程:
硬盤?>>?kernel?buffer?(快速拷貝到?kernelsocket?buffer)?>>協議棧
tcp_nopush on;
設置數據包會累積一下再一起傳輸,可以提高一些傳輸效率。 tcp_nopush 必須和 sendfile 搭配使用。
tcp_nodelay on;
小的數據包不等待直接傳輸。默認為on。?看上去是和 tcp_nopush 相反的功能,但是兩邊都為 on 時 nginx 也可以平衡這兩個功能的使用。
keepalive_timeout
HTTP 連接的持續時間。設的太長會使無用的線程變的太多。這個根據服務器訪問數量、處理速度以及網絡狀況方面考慮。
send_timeout
設置 Nginx 服務器響應客戶端的超時時間,這個超時時間只針對兩個客戶端和服務器建立連接后,某次活動之間的時間,如果這個時間后,客戶端沒有任何活動,Nginx 服務器將關閉連接。
gzip on
啟用 gzip,對響應數據進行在線實時壓縮,減少數據傳輸量。
gzip_disable “msie6”
Nginx服務器在響應這些種類的客戶端請求時,不使用 Gzip 功能緩存應用數據, gzip_disable “msie6”對IE6瀏覽器的數據不進行 GZIP 壓縮。
常用的配置項大致這些,對于不同的業務場景,有的需要額外的其他配置項,這里不做展開。
其他
http 配置里有 location 這一項,它是用來根據請求中的 uri 來為其匹配相應的處理規則。
location 查找規則
location??=?/?{ ??#?精確匹配?/?,主機名后面不能帶任何字符串 ??[?config?A?] } location??/?{ ??#?因為所有的地址都以?/?開頭,所以這條規則將匹配到所有請求 ??#?但是正則和最長字符串會優先匹配 ??[?config?B?] } location?/documents/?{ ??#?匹配任何以?/documents/?開頭的地址,匹配符合以后,還要繼續往下搜索 ??#?只有后面的正則表達式沒有匹配到時,這一條才會采用這一條 ??[?config?C?] } location?~?/documents/Abc?{ ??#?匹配任何以?/documents/Abc?開頭的地址,匹配符合以后,還要繼續往下搜索 ??#?只有后面的正則表達式沒有匹配到時,這一條才會采用這一條 ??[?config?CC?] } location?^~?/images/?{ ??#?匹配任何以?/images/?開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條 ??[?config?D?] } location?~*?.(gif|jpg|jpeg)$?{ ??#?匹配所有以?gif,jpg或jpeg?結尾的請求 ??#?然而,所有請求?/images/?下的圖片會被?config?D?處理,因為?^~?到達不了這一條正則 ??[?config?E?] } location?/images/?{ ??#?字符匹配到?/images/,繼續往下,會發現?^~?存在 ??[?config?F?] } location?/images/abc?{ ??#?最長字符匹配到?/images/abc,繼續往下,會發現?^~?存在 ??#?F與G的放置順序是沒有關系的 ??[?config?G?] } location?~?/images/abc/?{ ??#?只有去掉?config?D?才有效:先最長匹配?config?G?開頭的地址,繼續往下搜索,匹配到這一條正則,采用 ????[?config?H?] }
正則查找優先級從高到低依次如下:
“ = ” 開頭表示精確匹配,如 A 中只匹配根目錄結尾的請求,后面不能帶任何字符串。
“ ^~ ” 開頭表示uri以某個常規字符串開頭,不是正則匹配。
“ ~ ” 開頭表示區分大小寫的正則匹配。
“ ~* ”開頭表示不區分大小寫的正則匹配。
“ / ” 通用匹配, 如果沒有其它匹配,任何請求都會匹配到。
負載均衡配置
Nginx 的負載均衡需要用到 upstream 模塊,可通過以下配置來實現:
upstream?test-upstream?{ ????ip_hash;?#?使用?ip_hash?算法分配 ????server?192.168.1.1;?#?要分配的?ip ????server?192.168.1.2; } server?{ ????location?/?{??????? ????????proxy_pass?http://test-upstream; ????} }
上面的例子定義了一個 test-upstream 的負載均衡配置,通過 proxy_pass 反向代理指令將請求轉發給該模塊進行分配處理。