Nginx配置及部分最佳化
設定檔的組成部分:
主設定檔:nginx.conf //沒有片段化的設定檔,所以需要自己添加 include conf.d/*.conf來進行片段化的設定
/etc/nginx/conf.d/*.conf
fastcgi的設定檔:/etc/nginx/fastcgi.conf(新) fastcgi_params(php傳遞參數) fastcgi _conf.default(預設配置) //使用哪個最好主設定檔中指明,前兩個與php結合
uwsgi_params //定義fastcgi和pam結合
/usr/local/nginx/html //主測試頁
配置指令(必須以分號結尾):
main block:對http及mail模組均有效;
Directive value1 [value2…];
支援使用變數:
內建變數:由模組引入,可直接引用;
自訂變數:set variable_name value;
引用變數:$variable_name
設定檔群組織結構
配置前進行備份,設定檔中的選項依賴於安裝時的模組。
main block //全域配置; event { ... } //事件驅動的相關配置段; http { ... } //http的配置。 mail {... } //mail相關配置
http配置段: //下面嗎可以有橫多的server虛擬機器主機,或者
http {......server { ... server_name //名字 root //指明根路徑 alias //指明映射 location /uri/ { //指明 } ...}server {...} //每個主機一個,哪怕只有一個。}
main配置段:
配置指令類別:
正常運行必備的配置;最佳化效能相關的配置;用於調試、定位問題的配置;
正常運行必備的配置: user USERNAME [GROUPNAME]; // 指定用於運行worker進程的使用者和組;
user nginx nginx; pid /PATH/TO/PID_FILE; //指定nginx進程的pid檔案路徑; 可以在官方文檔中查看。
pid /var/run/nginx.pid; worker_rlimit_nofile_number # ; //指定一個worker進程所能夠開啟的最大檔案描述符數量; worker_rlimit_sigpending #; //指定每個使用者能夠發往worker進程的訊號的數量;
效能最佳化相關的配置:
worker_processes #|auto; //指明背景工作處理序worker進程的個數;通常應該為物理CPU核心數量減1,因為cpu的編號從0開始。
可以為”auto”,實現自動設定;
worker_cpu_affinity CPUMASK | auto …; //affininty親和力
讓每個核運行一個nginx進程,如果不這樣CPU輪轉是吧進程切換出去再次切換進來的時候,不一定是原來的cpu,CPU本機快取就沒辦法命中,效能不保證;這回產生不必要的浪費。
CPUMASK: cpu掩碼 下面是滴1,2 ,3 4 個cpu上
0001; 0010; 0100; 1000 指明運行在哪個cpu上,1掩蓋的位在第幾位上就是幾。然後減一。因為cpu的編號從0開始。
ps axo commond ,pib,psr // 查看效果 命令 pid 哪個cpu
worker_cpu_affinity 00000001 00000010 00000100; //指運行在哪幾個或那個CPU上。
master工作是很清閑,所以不用綁定 worker_priority nice; //調整worker進程優先順序
[-20, 19] timer_resolution interval; //計時器解析度,降低此值,可減少gettimeofday()系統調用的次數 調試、定位問題的配置: daemon off|on ; //是否以守護進程方式啟動nignx;調試的的時候應該設定為off,此時會將相關的資訊輸出到螢幕上; master_process on|off; //是否以master/worker模型運行nginx;調試時設定為off;
error_log /PATH/TO/ERROR_LOG LEVEL;
error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
//錯誤記錄檔檔案及其層級;出於調試的需要,可以設定為debug;但debug僅在編譯時間使用了“–with-debug”選項時才有效;
能放在server中上面的配置選項。
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:發送到錯誤輸出;
syslog:server=address[,parameter=value]:發送給syslog伺服器;
memory:size 日誌寫到緩衝中再慢慢寫到磁碟
記錄層級:debug依賴於configure時的–with-debug選項; nginx.conf的配置event相關:
main配置段不需要放在括弧中
events {
…
} worker_connections #; //每個worker進程所能夠響應的最大並發請求數量;預設512個。
受限於worker_rlimit_noflie(可以開啟的檔案的數量)
worker_proceses * worker_connections =當前nginx能夠響應的並發串連數量 use [epoll|rgsig|select|poll]; //指明並發串連請求處理時的方法。linux上是epoll。定義使用的事件模型;建議讓nginx自動選擇; accept_mutex [on|off]; //master調度worker接收使用者的請求的負載平衡鎖;預設開啟。啟用時,表示用於讓多個worker輪流地、序列化地響應新請求;使用的accept()系統調用。如果禁用則可能會產生資源競爭。 accept_mutex_delay TIME //設定獲得互斥鎖的最少延遲時間。預設500ms。 lock_file /PATH/TO/LOCK_FILE; //accept_mutex用到的鎖檔案路徑。 通訊端或主機相關的指令
http {...} // nginx 使用鎖機制,保證互斥。
http{
…
} //相關的配置。 server {} //定義一個虛擬機器主機;基於IP和主機名稱沒什麼區別。server在http內部。
server { listen PORT; server_name NAME; root /PATH/TO/DOCUMENTROOT; }
注意:
(1) 基於port;listen指令監聽在不同的連接埠;
(2) 基於hostname; server_name指令指向不同的主機名稱;
(3) 基於IP的虛擬機器主機; listen IP:PORT //很少用。IP和名稱的主機名稱區別不大。
- listen //
listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];listen port [default_server] [ssl] ;listen unix:path [default_server][ssl];第三類的通訊端,unix通訊端。
default_server:設定預設虛擬機器主機;用於基於IP地址,或使用了任意不能對應於任何一個server的name時所返回網站;
ssl:用於限制只能通過ssl串連提供服務;
backlog:後援隊列的長度;
spdy:SPDY protocol(speedy),在編譯了spdy模組的情況下,用於支援SPDY協議;
http2:http version 2;
sndbuf: 發送緩衝區的大小。
rcvbuf: 接收緩衝大小; server_name NAME […]; //指明當前主機的server名。
後可跟一個或多個主機名稱;支援使用*任意長度的任一字元;名稱還可以使用萬用字元和Regex(~);
(1) 首先做精確匹配;例如:www.magedu.com
(2) 左側萬用字元;例如:*.magedu.com
(3) 右側萬用字元,例如:www.magedu.*
(4) Regex,例如:~^.*\.magedu\.com$ //~開頭表示,如果正則匹配到很多主機名稱,則優先順序為1》2》3》4
(5) default_server
tcp_nodelay on|off; //對keepalive模式下的串連是否使用TCP_NODELAY選項,(小資源不被回應,而是會一併返回);
sendfile on|off; //(核心中封裝響應報文)是否啟用sendfile功能;
tcp_nopush on|off;
//是否啟用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)選項;僅在sendfile為on時有用。(); 路徑相關的指令:
nginx -t -s
- root 設定web資源的路徑映射;用於指明使用者請求的URL所對應本地檔案系統的文檔的目錄路徑;
可用的上下文:http,server,localtion,if
mkdir -pv /web/html server { ... root /data/www/vhost1; }
http://www.magedu.com/images/logo.jpg –> /data/www/vhosts/images/logo.jpg
server { //就需要三行設定虛擬機器主機listen,server_name root ... listen 80; server_name www.magedu.com; location /images/ { root /data/imgs/; ... } }
http://www.magedu.com/images/logo.jpg –> /data/imgs/images/logo.jpg location [ = | ~ | ~* | ^~ ] uri { … } //根據資源種類選擇對應的處理方式,location用來選擇資源。
location @name { … }
功能:允許根據使用者請求的URI來匹配定義的各location(匹配資源),匹配到時,此請求將被相應的location塊中的配置所處理;簡言之,即用於為需要用到專用配置的uri提供特定配置 。location可以進行嵌套;
server { ... server_name www.magedu.com; root /data/www; location /admin/ { configuration A } }
location PATTER
=:URI的精確匹配;
~:做Regex匹配,區分字元大小寫;
~*:做Regex匹配,不區分字元大小寫;
^~:URI的左半部分匹配,不區分字元大小寫;
匹配優先順序:精確匹配= > ^~ > ~或~* > 不帶符號的URL; alias path;
只能用於location配置段,定義路徑別名,文檔映射的一種機制;
location /i/ { alias /web/html/; }
訪問http://xxxx/i/a.jpg —–> /web/html/a.jpg
location /bbs/ { root /web/forum/; }
訪問的是 /web/forum/bbs/a.jpg
注意:
root指令:給定的路徑對應於location中的“/url/左側”這個URL;/images/test.jpg –> /data/imgs/images/test.jpg
alias指令:給定的路徑對應於location的“/uri/”這個URL;/images/test.jpg –> /data/imgs/test.jpg
index file …;
生效位置: http,server,location
預設首頁面,不同的location可用在不同的首頁中;
error_page code … [=[response]] uri;
根據使用者請求資源的http響應的狀態代碼重新導向錯誤頁面,也可以把多個狀態定向到某個頁面上;
error_page 404 /404.html //這是個相對位置 error_page 404 =200 /404.html //以指定的響應狀態代碼進行響應。
try_files file … uri;
try_files file … =code;
生效於server location
嘗試尋找第1至第N-1個檔案,第一個即為返回給要求者的資源;若1至N-1檔案都不存在,則跳轉至最一個uri(必須不能匹配至當前location,而應該匹配至其它location,否則會導致死迴圈);
例:
location /test {try_files test1.html test2.html test3.html xxxx} //開始匹配名字,匹配不到轉到xxxx此時的狀態代碼是404,還可以進行狀態代碼的指定。location = 50x.html {root html } //當使用者精確匹配是才會訪問 html 在root下,root為於安裝nginx的根路徑。
用戶端請求相關的配置: keepalive_timeout timeout [header_timeout];
//設定keepalive串連的逾時時間長度;0表示禁止長串連;預設為75s; keepalive_requests number;
//在keepalived串連上所允許請求的最大資源數量;預設為100; keepalive_disable none | browser …;
//指明禁止為何種瀏覽器使用keepalive功能;不用可忽略。 send_timeout #;
//發送響應報文的逾時時間長度,預設為60s。特別地,是指兩次寫操作之間的間隔時間長度; client_body_buffer_size size;
//用於接收客戶請求報文body的緩衝區大小;預設為16k;超出此指定大小時,其將被移存於磁碟上; client_body_temp_path path [level1 [level2 [level3]]];
//設定用於儲存用戶端請求body的臨時儲存路徑及子目錄結構和數量,緩衝的太多會尋找困難,設定層級;
client_body_temp_path /var/tmp/client_body 2 2; 兩個16進位數字建立一級子目錄,2個16進位建立2級子目錄; client_max_body_size= #M //使用者上傳檔案大小(還需要更改php。ini參數 )
對用戶端請求進行限制的配置 limit_excpet METHOD {…} // 對指定範圍之外的其它的方法進行存取控制;
例:
limit_except GET { //指定方法 allow 172.16.0.0/16; //可以使用所有方法的主機 deny all; //其他主機無法使用get以外的方法} limit_rate speed; // 限制用戶端每秒鐘所能夠傳輸的位元組數,預設為0表示無限制;
例:
location = /index.html { limit_rate 2048 //單位是bytes/second}
檔案操作最佳化相關的配置 aio on|off | threads[=pool]; //開啟AIO功能;使用多少線程,瞭解。.
生效於http,server,location
directio size|off; //設定直接I/O的大小,或關閉I/O.
寫請求不做緩衝,直接刷到磁碟上。 慢,可靠性高。
Enables the use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X), or the directio() function (Solaris), when reading files that are larger than or equal to the specified size.
open_file_cache off; //開啟的檔案快取。
open_file_cache max=N [inactive=time];
nginx可以緩衝以下三種資訊(檔案中繼資料):
(1) 檔案描述符、檔案大小和最近一次的修改時間;
(2) 開啟的目錄的結構;
(3) 沒有找到的或者沒有許可權操作的檔案的相關資訊;
max=N表示可快取的最大條目上限;一旦達到上限,則會使用LRU演算法從緩衝中刪除最近最少使用的快取項目;
inactive=time:在此處指定的時間長度內沒有被訪問過的快取項目是為非主動式快取項,因此直接刪除; open_file_cache_errors [on | off]; // 是否緩衝尋找時發生錯誤時的檔案相關資訊; open_file_cache_min_uses #; //快取項目在非活動期限內最少應該被訪問的次數,才可以稱為活動項; open_file_cache_valid # ; //每隔多久檢查一次緩衝中快取項目的有效性;預設為60s; 其他模組
ngx_http_access_module模組的配置(基於IP的存取控制)
應用上下文:http, server, location, limit_except
allow address | CIDR | unix: | all; deny address | CIDR | unix: | all; //規則順序重要。
ngx_http_auth_basic_module模組的配置(basic認證)
auth_basic string | off;
使用http basic認證協議對使用者進行認證;
auth_basic_user_file file;
實現使用者認證的帳號檔案;
檔案格式:
name1:password1name2:password2:comment //第三項可以為描述
密碼格式:
(1) encrypted with the crypt() function; (2) md5加密; (3) htpasswd -c -m /etc/nginx/.ngxpasswd;
例:
location /admin/ {auth_basic "Admin Area"; //直接寫的auth_basic_user_file /etc/nginx/.ngxhtpasswd;}
ngx_http_stub_status_module模組配置(超級重要):
通過指定的uri輸出nginx的基本狀態資訊 stub status;
在nginx1.8版本上,不需要加on,加了也無所謂。在1.8以前的版本高需要加on。表示開啟。
location /admin {stub_status on; /沒有on會報錯;}
Active connections: 1 server accepts handled requests //過去的16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 //現在的 Active connections:當前活動的用戶端串連數;accepts:已經接受的用戶端串連總數量;handled:已經處理完成的用戶端串連總數量;requests:用戶端的總的請求數量;Readking:正在讀取的用戶端請求的數量;Writing:正向其發送響應報文的串連數量;Waiting:等待其發出請求的空閑串連數量;
ngx_http_referer_module模組配置(基於請求報文中的Referer首部的值做存取控制)
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首部,但其沒有有效值,或其值非以http://或https://開頭;server_names:其值為一個主機名稱;arbitrary string:直接字串,可以使用*萬用字元;regular expression:以~起始的Regex;
內建變數:$invalid_referer(所有不能符合valid_referer指定定義的引用請求均為不合法引用;不能被引用匹配到的都是內建變數)
樣本:
valid_referers none blocked server_names *.magedu.com example.* www.example.org/galleries/ ~\.google\.; if ($invalid_referer) { return 403; }
nginx的https配置
使用模組ngx_http_ssl_module 編譯時間載入
ssl on|off ; //是否啟動當前主機的ssl功能。ssl_certificate FILE //當前主機使用的認證PEM格式。ssl_certficate_key FILE: //當前主機認證私密金鑰檔案。ssl_protocols[SSLv2][SSLv3][TLSv1][TLSv1.2][TLSv1.1]; //支援加密方式ssl_session_cache off |none |[builtin[:size]][share:name:size]; //指明會話緩衝機制; builtin:使用openssl內建的機制,各worker專屬。cache命中不高。 shared 由各worker共用的緩衝,name:緩衝空間的名稱 size:位元組為單位的緩衝單位空間的大小,1M可以緩衝4000個會話; //只用共用記憶體,不用builtitin。ssl_ciphers //ssl_perfer_server_ciphers //傾向於使用ssl伺服器的演算法。ssl_session_timeout time; //會話逾時時間長度。指sslsessioncache中緩衝條目的會話
http基於IP識別。SSL在TCP層。
配置認證,密鑰,server name,location
nginx訪問日誌
ngx_http_log_module模組的配置
The ngx_http_log_module module writes request logs in the specified format.//可以指定格式的日誌
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];
9:33
access_log off; //訪問記錄檔路徑,格式名稱以及緩衝大小和刷寫時間間隔;建議定義緩衝以提升效能;
log_format name string ...;
//定義日誌格式及其名稱;日誌格式一般通過調用內建變數來定義;
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off|on; //預設關閉
max最大緩衝條目;incative=time:非活動時間長度;min_uses:最少使用次數;‘valid:驗證緩衝條目有效性的條目。
nginx的url重寫
ngx_http_rewrite_module模組配置
重寫最多10次,防止死迴圈。10:10。
功能:實現了動態資源靜態化(有的動態資源申請過就不發生變化了),方便搜素引擎讀取,可以方便緩衝,提高網站安全性和專業性。
把使用者請求的URL基於regex做檢查,匹配到時將替換為replacement指定的字串;後端伺服器會處理轉換後的url rewite
在同一個location中存在的多個rewrite規則會自上而下逐個被檢查(迴圈);可以使用flag控制次迴圈功能;
如果replacement是以http://或https://開頭,則會替換結果會直接以重新導向的方式返回給用戶端;
匹配規則:
自上而下,逐條處理。處理過就不再處理。
將請求的url基於Regex進行重寫;
http –> https, domain1.tld –> domain2.tld, uri1 –> uri2, …
處理過成可能是a.jpg—>a.html 處理裡完成之後再次轉化為jpg返回給使用者。
指令:
rewrite regex replacement [flag]; //。講明白,說清楚。
regex:Regex,用於匹配使用者請求的url;例如(.*)\jpg ---> $1.html還可以跨主機。
replacement:重寫為的結果;
[flag]:控制工作過程。本來使第一條檢查完以後直接人道後端,現在要進行多次處理。下面的關鍵字直接加在關鍵字後面。
last //重寫完成之後停止對當前uri的進一步處理,改為對新url的新一輪處理匹配,(再重寫一次)類似conntine;break //重寫完成之後停止當uri的處理,轉向其後面的其它配置;//重寫後的規則C端看不到。;redirect //重寫完成之後會返回用戶端一個臨時的重新導向,由用戶端對新的url重新發起請求(臨時302)//用戶端是可以看到的;(就是在匹配規則的時候直接返回一個url(此時後端並沒有處理),瀏覽器自動用新的url訪問伺服器)。permanent //重寫完成之後會返回用戶端一個永久的重新導向(重寫後的url,用戶端會向這個url重新發起請求),由用戶端對新的url重新發起請求(永久301);
例如:
server{ location / { root mp3 ; index xxxxx rewite ^/(download/.*)/media/(.*)\.*$/mp3/$2.mp3 last; //訪問media下的MP3,被定向到MP3下的MP3 }}
PCRERegex元字元字元匹配:., [ ], [^]次數匹配:*, +, ?, {m}, {m,}, {m,n}位置錨定:^, $或者:|分組:(), 後向引用, $1, $2, ...
regwrite_log on | off //是否啟用重寫日誌,預設關閉。啟用時,日誌資訊被發送錯誤記錄檔;
調試方法:錯誤記錄檔debug; 開啟rewrite_log;
if (condition) { ... } : //條件判斷滿足條件時執行配置,引用新的配置上下文;
通常對內建變數進行判斷;
condition比較運算式:
==,!=~:模式比對,區分字元大小寫;~*:模式比對,不區分字元大小寫;!~:模式不匹配,區分字元大小寫;!~*: 模式不匹配,不區分字元大小寫;
檔案及目錄存在性判斷:
-f, !-f:是否存在且為普通檔案;-d, !-d: 是否存在且為目錄;-e, !-e:是否存在;-x, !-x:是否存在且可執行;
/看視屏11:09
return
return code [text]; return code URL;return URL;立即停止對請求的uri的處理,並返回指定的狀態代碼;
在nginx.org/en/docs/http/ngx_croe_module.html 中有很多變數。
set $variable value; //自訂變數賦值,變數在賦值和引用的時候都需要加上’$‘;
if的例子:
if ($httpd_user_agent ~ MSIIE) { rewrite ^(.*)$ /msie/$1 break; //無論請求的的是什麼,都加一個資源;}if ($http_cookie ~* "id=([^;]+)(?:;|$") { set $id $1; } //請求報文首部中COOKIE的值,設定一個變數ID,值為$1;if($request_method =POST){return 405; //拒絕405}if($slow){ limit_rate 10k; //慢的使用者分到10k速率;}if($invalid_referer){ return 403; //黑名單403,返回;}
重新導向80至443連接埠:
server{listen 80;server_name www.abc.com ;rewrite ^(.*) https://$server_name$1 permanent; //在匹配到任何規則後進行重寫,並發出permanent永久重新導向。}server{ listen 443; server_name www.abc.com; root /PATH/TO/ROOT ; ssl on ; ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/serer.key;}
nginx的壓縮傳送
ngx_http_gzip_module模組配置—-是一個過濾器,對指定的內容進行壓縮傳輸。不是所有的瀏覽器都會支援
gzip on | off; // 啟用或禁用gzip壓縮響應報文;
gzip_comp_level LEVEL; //壓縮比,1-9,預設為1;
gzip_disable regex ...; //regex是為用於匹配用戶端瀏覽器的Regex;表示對所有匹配到的瀏覽器禁不執行壓縮響應;
gzip_min_length length; //觸發壓縮功能的響應報文的最小長度;
gzip_http_version 1.0 | 1.1; //設定啟用壓縮功能時,協議的最小版本;
gzip_types mime-type ...; //指明僅對哪些類型的資源執行壓縮操作;即壓縮過濾器.預設為text/html;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; //定義對用戶端請求的具有何種請求屬性的資源啟用壓縮功能;如expired則表示對由於使用了expire首部而無法緩衝的對象啟用壓縮功能;講到緩衝再細講。
樣本:
gzip on;gzip_http_version 1.0;gzip_comp_level 6;gzip_disable msie6;gzip_min_length 2; 多大進行壓縮gzip_types text/plain text/css text/xml application/x-javascript application/xml application/json application/java-script; //這些都是靜態資源
server { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
http://www.magedu.com/download/a/b/c/media/32.wmv --> /download/a/b/c/mp3/32.mp3
location / { root html; index index.html index.htm rewtrite (.*)\.txt$$1.html}