解決C10k的問題;能支援較大并發的伺服器程式,突破了1萬個請求。
nginx功能:
可以當做靜态的web伺服器;
core子產品實作http功能;
支援虛拟主機(基于port、hostname、ip方式);
keepalived保持會話
通路日志
url rewrite重寫
路徑别名
基于ip通路控制
速率限制及并發數量限制等;
可作為(http的)反代伺服器及負載均衡器;
proxy子產品實作反代
upstream子產品實作負載均衡
支援fastcgi使用FastCGI子產品與php通信
基于子產品化,,可以與後端的不同應用通信;需要哪種功能就把哪種功能的子產品編譯進來即可;
Nginx子產品一般可分為三類:核心子產品、标準子產品(http和郵件)、第三方子產品(各種應用);
每個子產品都有相應的配置指令和内置變量;
Nginx是子產品化設計,包括核心子產品、标準子產品(http标準子產品、http可選子產品、mail子產品)、3rd(第三方)子產品
Nginx配置檔案結構:
nginx.conf:主配置檔案
main block:全局配置(對http及mail子產品均有效);
event {
...
}:事件驅動的相關配置;
http{
}:http協定的相關配置;
mail {
}:mail相關配置;
http相關的配置:
http {
...
server { 每個用來定義一個虛拟主機,但隻能有一個虛拟主機使用https;
servr_name 目前主機名
root 根文檔路徑
alias 别名
location /uri/{ 定義類似于别名的映射;
...
if
}
}
server {
}
配置指令的類别:3類
正常運作必備的配置;
優化性能的配置;
用于調試、定位問題的配置;
正常運作必備的配置:
1、user USERNAME [GROUPNAME];
指定用于運作worker程序的使用者群組;組可省略;
例如:
user nginx nginx;
2、pid /PATH/TO/PID_FILE;
指定nginx程序的pid檔案路徑;
pid /var/run/nginx.pid;
3、worker_rlimit_nofile number;
單個worker程序所能打開的最大檔案數,預設1024個;
性能優化相關的配置:
1、worker_processes number | auto;
指明worker的程序數,通常為CPU的核心數減1;
worker_processes 4;
2、綁定nginx使用固定哪顆cpu
worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
CPUMASK:掩碼,隻能有一位置1,代表固定的cpu顆數;
0000 0001 第0号cpu,即第1顆cpu
0000 0010 第1号cpu,即第2顆cpu
0000 0100 第2号cpu,即第3顆cpu
......
worker_cpu_affinity 0001
工作在第1顆cpu上,但是cpu編号是從0開始;
3、worker_priority nice;
工作程序優先級,nice:[-20,19],對應優先級:[100-139],nice值越小,優先級越高;
worker_priority -5;
調試、定位問題:
1、daemon on|off;
是否以守護程序方式啟動nginx程序;隻有調試時才關閉,為off;
2、master_proces on|off;
是否以master/worker模型啟動nginx程序;隻有調試時才關閉,為off;
3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
錯誤日志檔案的記錄方式及其日志級别;其中debug,依賴于編譯時--with-debug選項;
error_log /var/log/nginx/error.log warn;
file /PATH/TO/SOME_LOG_FILE; 指定日志檔案路徑,也可以使用syslog記錄日志;
stderr:發送到錯誤輸出
syslog:server=address[,parameter=value]:發送給syslog伺服器;要指明伺服器IP或參數;
memory:size 記錄到記憶體中;性能好,斷電會消失,磁盤IO壓力大;一般打開日志緩沖,緩解IO壓力;
日志級别(列出的選項):debug依賴于configure時的--with-debug選項;
events配置段
1、worker_connections numbers;
每個worker程序所能夠并發打開的最大連接配接數;受限于(worker_rlimit_nofile設定)它所能夠打開的檔案數量的;
目前主機所能響應的最大并發連接配接數=worker_processes*worker_connections
2、use method;
指明并發連接配接請求處理時使用的方法;支援的方法有:select、poll、kqueue、epoll、/dev/poll、eventport
3、accept_mutex on|off;
是否打開負載均衡鎖,啟用時,表示用于讓多個worker程序輪流地、序列化的響應新請求;
4、lock_file file;
指明鎖檔案路徑且需要自定義;nginx使用鎖機制實作互斥功能,并且序列化的讓各worker通路這段共享記憶體;
http配置段:ngx_http_core_module子產品
定義套接字相關功能:
1、server {
listen PORT;
server_name HOSTNAME;
root /PATH/TO/DOCUMENTROOT;
注意:
(1)基于port的虛拟主機:
listen指令需要使用不同的端口;
(2)基于HOSTNAME的虛拟主機:
server_name指令指向不同的主機名;
(3)基于IP的虛拟主機;
listen IP:por
ip要使用不同的位址;
例如:基于端口的虛拟主機
server {
listen 80;
server_name webserver;
root /usr/share/nginx/html;
index index.html;
listen 808;
root /var/www/html;
例如:基于主機名的虛拟主機
index index.html;
sendfile on;
server_name www1.stu11.com;
例如:基于ip的虛拟主機
listen 172.18.11.11:80;
listen 172.18.11.12:80;
2、listen(定義方法有3種):
(1)listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
指明位址,預設端口為80;
(2)listen port [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
指定端口的所有位址,即本機所有可用位址的端口;
(3)listen unix:path [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
使用unix socket套接字檔案實作通信,用戶端和服務端都是本機程序,使用本地回環接口進行通信,特點就是不會經由協定棧發送資料;
default_server:設定預設虛拟主機;
ssl:限制隻能通過ssl連接配接提供服務;端口要為443;
backlog:後援隊列的長度;
rcvbuf:接收緩沖區大小;
sndbuf:發送緩沖區大小;
3、server_name name ...;
為虛拟主機指明目前server的主機名;後可跟一個或空白字元分隔的多個主機名;支援使用*通配任意長度的任意字元;~起始的正規表達式模式字元串;
主機名比對應用政策:(優先級)由高到底:
(1)首先精确比對;
(2)左側*通配符比對;
(3)右側*通配符比對;
(4)正規表達式模式比對;
4、tcp_nodelay on|off;
預設為on,隻對keepalived模式下的連接配接是否啟用此功能,用戶端請求有小資料時,服務端不延遲等待多個小資料之後再響應給用戶端,而是立即發送給用戶端;
5、sendfile on|off;
是否啟用sendfile功能,即在核心中直接封裝響應封包響應使用者的請求;預設是關閉的,需要手動啟用;
定義路徑相關配置:
6、root path;
設定web資源的路徑映射;用于指明使用者請求的url所對應的本地檔案系統上的文檔所在目錄路徑;
可用的上下文:
http:表示對所有server都生效;
server:表示隻對目前一個server生效;
location:表示隻對location中的URL生效;
if:表示僅對條件判斷生效;
7、location(有2種方式):
根據使用者請求的URI來比對定義的多個location,比對到時,此請求将被相應的location塊中的配置指令所處理;
(1)location [ = | ~ | ~* | ^~ ] uri { ... }
(2)location @name {...}
比對優先級:=、^~、~/~*、不帶符号;
=:URI精确比對;使用者給定的URI與location中的完成一樣;
^~:對URI左半部分做比對檢查,不區分字元大小寫;
~:做正規表達式模式比對,區分字元大小寫;
~*:做正規表達式模式比對,不區分字元大小寫;
8、alias path;
定義路徑别名,也是文檔映射的一種機制,隻能用在location上下文;
root指令:給定的路徑對應于location中/uri/左側的/;
alias指令:給定的路徑對應于location中的/uri/右側的/(這個url),而不包含uri本身;
檔案路徑:/web/forum/a.jpg
location /bbs/ {
alias /web/forum/;
相當于通路的是:/web/forum/a.jpg;
root /web/forum/;
相當于通路的是:/web/forum/bbs/a.jpg
9、index file ...;
設定預設首頁;在不同的location可指定不同的首頁;
10、error_page code...[=[response]] url;
自定義錯誤頁面,根據使用者請求的資源的http響應的狀态碼實作錯誤頁重定向;
]# vim /etc/nginx/nginx.conf
root /web;
location /www/ {
root /web/var/;
index page.html;
location / {
error_page 404 /index.html;
]# vim /var/www/html/index.html
<h1>Error_Page</h1>
顯示:Error_Page
用錯誤頁面響應時,響應碼是404;
也可以定義響應碼,例如讓用戶端顯示錯誤頁面時的響應碼為200,則:
]# vim /etc/nginx/nginx.conf
error_page 404 =200 /404.html;
11、try_files
實驗失敗!
定義用戶端請求的相關配置:
12、keepalive_timeout timeout [header_timeout];
設定保持連接配接的逾時時長,0表示禁止使用長連接配接,預設為75秒;
13、keepalive_requests number;
在一次長連接配接上所允許請求的資源的最大數量,預設100個;
14、keepalive_disable none|browser...;
對哪種浏覽器禁用長連接配接;none表示不禁用;
15、send_timeout time;
向用戶端發送響應封包的逾時時長,預設60秒;特别地,是指兩次寫操作之間的間隔時長;
16、client_body_buffer_size size;
用于接收用戶端請求封包的body部分的緩沖區大小,預設為16k,超出此大小時,其将被暫存到磁盤上;
17、client_body_tmp_path path[level1 [level2 [level3]]];
設定用于存儲用戶端請求封包的body部分的臨時存儲路徑及子目錄結構和數量;
client_body_tmp_path /var/tmp/body 2 1 2;
表示在/var/tmp/body目錄下用2個十六進制數建立一級子目錄,即可建立256個(2個十六進制數的變化範圍)一級子目錄;然後在每個一級子目錄下又用1個十六進制數建立二級子目錄,即可建立16個(1個十六進制數的變化範圍)二級子目錄;最後在每個二級子目錄下又可建立256個(2個十六進制數的變化範圍)三級子目錄;
對用戶端請求進行限制的相關配置:
18、limiti_rate rate;
限制伺服器端每秒鐘響應給用戶端的傳輸速率,機關是位元組/秒,bytes/second,0表示無限制;
location /download/ {
limit_rate 20480;
root /web/host1;
]# mkdir /web/host1/download
]# dd if=/dev/zero of=/web/host1/download/test.img bs=1M count=50
]# nginx -s reload
]# vim /web/host1/download/index.html
<h1>download</h1>
在本機測試:
顯示:下載下傳對話框;速度非常慢;
19、limit_except method... {...};
限制對指定的請求方法之外的其它方法的使用用戶端;
limit_except GET POST{
allow 172.17.0.0/16;
deny all;
表示除了GET(自動包含HEAD)和POST之外的其它方法僅允許172.18.0.0/16中的主機使用;
檔案操作優化的配置:
20、aio on|off|threads[=pool];
是否啟用aio功能;預設關閉;指明使用多少個線程;不指定就是用多少啟用多少線程;可用在http, server, location;
21、directio size|off;
是否啟用直接IO;啟用多大的IO空間;
直接IO就是寫請求的時候,資料不在記憶體中緩存而是直接刷到磁盤上去,這就是直接IO;對性能有影響,對資料可靠性比較高;
22、緩存啟用
open_file_cache off;
對打開的檔案是否緩存下來,nginx緩存的是檔案的中繼資料;off:表示不緩存;
nginx可以緩存以下三種資訊:
(1)檔案的描述符、檔案大小和最近一次的修改時間;
(2)打開的目錄結構;
(3)沒有找到的或沒有權限通路的檔案的相關資訊;
open_file_cache max=N[inactive=time];
max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實作緩存管理;
inactive=time:緩存項的逾時時長,在此處指定的時長内未被命中的緩存項即為非活動項;
23、open_file_cache_errors on|off;
是否緩存查找時發生錯誤的檔案一類的資訊;open_file_cache的功能是否有效,取決于此處指令;
24、open_file_cache_min_uses number;
緩存項在非活動期限内,最少應該被通路的次數;
非活動項是在open_file_cache中指定的時長内至少要通路多少次,才認為是活動項,少于此處指定的次數才認為是非活動項;
25、open_file_cache_valid time;
緩存項有效性的檢查頻率;預設為60秒;
ngx_http_access_module子產品:通路控制子產品
實作基于用戶端ip的通路控制功能;
26、allow address|CIDR|unix:|all;
27、deny address|CIDR|unix:|all;
ngx_http_auth_basic_module子產品;基于使用者認證的子產品
28、auth_basic string|off;
使用basic機制進行使用者認證;使用者為虛拟使用者,要指明賬号、密碼的位置;
location / {
allow 172.18.11.0/24;
deny all;
29、auth_basic_user_file file;
認證用的賬号密碼檔案;
檔案格式:
name:password:comment
密碼格式:
htpasswd指令
location /www/ {
auth_basic "Admin page";
auth_basic_user_file /web/var/.passwd;
]# htpasswd -c -m /etc/nginx/.nginxpasswd tom
輸入:tom的密碼
<a href="http://s2.51cto.com/wyfs02/M00/80/F9/wKiom1dFlHnhEJWlAAEo5wl_MYM844.png" target="_blank"></a>
ngx_http_stub_status_module子產品;用于輸出nginx的基本狀态資訊
30、stub_status;
顯示狀态資訊:
Active connections: 2
server accepts handled requests
19 19 44
Reading: 0 Writing: 1 Waiting: 1
表示意義:
Active connecttions:處于活動狀态的用戶端連接配接的數量;(包括等待用戶端發來請求、開始建立連接配接的用戶端但已經處于等待用戶端發請求、或正在處理用戶端請求、正在給用戶端發響應封包)
accepts:伺服器已經接受用戶端請求的總數;(包括已經處理完、正在處理)
handled:已經處理完成的用戶端請求的總數;(接收的大于處理完成的數量;)
requests:用戶端已經發來的請求總數;(包含拒絕的請求)
Reading:正處于讀取用戶端請求封包首部的連接配接數量;
Writing:正處于向用戶端發送響應封包過程中的連接配接數;
Waiting:正處于等待用戶端送出請求的空閑連接配接數;如果啟用保持連接配接功能,用戶端請求資源後沒再請求就處于空閑狀态;如果waiting狀态數量很多,表示大量用戶端處于空閑狀态,有可能是keep allive timeout設定時間太長所導緻;
location /status {
stub_status;
<a href="http://s1.51cto.com/wyfs02/M00/80/F9/wKiom1dFiyizD3OTAABRCuXPNio561.png" target="_blank"></a>
ngx_http_referer_module子產品;基于引用做通路控制;表示從哪個連結跳轉到目前頁面;
31、valid_refers none|blocked|server_names|string...;
定義合法的referer資料;可實作防盜鍊拒絕通路,拒絕來自某連結到本網頁等功能;
none:請求封包首部沒有referer首部;
blocked:請求封包的referer首部沒有值;
server_names:其值是主機名;一般是自己的域名;
string:有2種
arbitrary string:直接字元串,可以使用*通配符;
regular expression:被指定的正規表達式模式比對到的字元串,要使用~開頭;
ngx_http_ssl_module子產品;
32、ssl on|off;
是否啟用目前虛拟主機的ssl;手動測試時,可臨時關閉;
33、ssl_certificate file;
目前虛拟主機使用的PEM格式的證書檔案;
34、ssl_certificate_key file;
指明私鑰檔案;目前虛拟主機使用的證書檔案中的公鑰配對兒的私鑰檔案路徑,PEM格式;
35、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
指明使用的ssl協定版本;最好使用TLSv1以上的版本;
36、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
指明ssl會話的緩存機制;
off:禁止使用會話;堅決禁止;
none:禁止使用會話;溫和禁止;告訴用戶端會話有可能被重用,但并不保證;
builtin:使用openssl(加密的庫)内建的緩存機制,此為各worker獨占;
shared:相對于builtin而言,ssl緩存是由各worker共享的緩存;緩存空間需要定義name,size等;
name:緩存空間的名稱;
size:位元組為機關的緩存空間的大小,每1MB記憶體空間可緩存4000個會話;10M空間就可緩存4萬個會話;
37、
ssl_verify_client on | off | optional | optional_no_ca;
是否驗證用戶端證書;一般不會驗證用戶端證書;
ssl_ciphers ciphers;
加密算法,必須是Openssl所支援的加密算法才可以;
38、ssl_session_timeout;
ssl會話逾時時長,指ssl會話緩存中緩存條目的有效時長(即非活動期限的有效時長);預設是5分鐘;
39、ssl_prefer_server_ciphers on | off;
當使用SSLv3和TLS協定時,優先使用伺服器端的加密算法;
<a href="http://s1.51cto.com/wyfs02/M00/80/F7/wKioL1dFlYWxT6m4AABl7uDcajY573.png" target="_blank"></a>
<a href="http://s1.51cto.com/wyfs02/M01/80/F7/wKioL1dFlYXzMGyiAABw7yhTw5s589.png" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/80/F9/wKiom1dFlJHCftnFAABFmOxWeC8106.png" target="_blank"></a>
ngx_http_log_module子產品;用于實作以指定格式記錄使用者請求日志;
40、access_log path[format[buffer=size[flush=time]][if=condition]];
path:可指明日志檔案路徑;
format:日志格式;
buffer=size日志緩存大小;
flush=time:多長時間從記憶體刷寫至磁盤上一次;
41、
access_log path format gzip[=leve][buffer=size][flush=time][if=condition];
指明日志檔案壓縮存放時的gzip壓縮比
access_log syslog:server=address[,parameter=value] [format[if=condition]];
向指定的日志伺服器發送日志;
access_log off;
關閉通路日志;
42、log_format name string...;
定義日志格式,指明名稱和字元串;與httpd定義略有差別,在httpd中使用%u等宏定義,而對nginx則使用内建的變量來定義格式;
nginx的内置變量:在ngx_http_core_module子產品文檔中可檢視到;
$bytes_sent:發送的位元組數;the number of bytes sent to a client
$connection:連接配接的序列号;
$connection_requests:連接配接請求;
$msec:毫秒;
$pipe:p表示基于管道,.表示otherwise;
$request_length:請求封包的長度;
$request_time:請求時間;
$status:響應碼;
$time_iso8601:時間格式;
$time_local:本地時間;
43、
open_log_file_cache max=N[inactive=time][min_uses=N][valid=time];
定義緩存空間,用來存儲檔案描述符;
open_log_file_cace off;
關閉此功能
max=N:最大緩存條數,預設10個;
inactive=time:非活動時長;緩存下來在指定時間沒有用過,或者使用次數少于設定的次數,預設為10秒鐘,就認為是非活動狀态,可基于LRU算法換出;
min_uses=N:最少使用次數;緩存下來後在指定時間内預設10秒,最少使用多少次,預設1次;即如果預設在10秒,使用少于1次就标記為非活動狀态;判斷非活動除了使用時長還有使用次數;
valid:驗證緩存條目有效性的頻率;檢查緩存檔案的路徑有效性,預設60秒;
ngx_http_rewrite_module子產品;
用于實作将使用者請求的URI基于正則式轉換為其它URI機制;并且以重定向方式預設傳回給用戶端,讓用戶端對新的URI重新再次發起請求;
44、rewrit regex replacement[flag];
用于實作重寫操作;
把使用者請求的URI基于regex做檢查,比對到時,這個URI将替換為replacement指定的字元串;
在同一location中存在多個rewrite規則會自上而下逐個被檢查(循環);可使用flag控制此循環功能;
如果replacement是以http://或https://開頭,則替換結果會直接以重定向方式傳回給用戶端;
[flag]: 标志位,用來查找替換工作過程
last:重寫完成後,停止對目前URI在目前location中的後續其它重寫操作,改為對新URI的新一輪處理;類似于提前結束本輪循環,進入下一輪;了解為continue;重新比對可能比對到其它location中;
break:重寫完成後,停止對目前URI在目前location中的後續其它重寫操作;
redirect:重寫完成後以臨時重定向方式直接傳回重寫後生成的新URL給用戶端,由用戶端對新URL進行請求;(重定向響應碼302)
permanent:重寫完成後以永久重定向方式直接傳回重寫後生成的新URL給用戶端,由用戶端對新URL進行請求;(重定向響應碼301)
root /web/var/www;
index index.html;
rewrite (.*)\.jpg$ $1.html redirect;
表示:通路為字首.jpg的資源,就重定至/web/var/www/目錄下的資源為字首.html;
45、rewrite_log on | off;
是否啟用重寫日志;啟用時,日志資訊被發往錯誤日志;
46、if(condition){...}
條件判斷機制,在條件滿足時,執行配置塊中的配置;引入了一個新的配置上下文;通常對nginx的變量做判斷;
condition:條件比較表達式:等值比較和不等值比較: ==,!=
~:模式比對,左側字元串是否能被右側模式比對,區分字母大小寫;
~*:模式比對,左側字元串是否能被右側模式比對,不區分字元大小寫;
!~:模式不比對,左側字元串是否不能被右側模式比對,區分字元大小寫;
!~*:模式不比對,左側字元串是否不能被右側模式比對,不區分字元大小寫;
檔案及目錄存在性判斷:
-f|!-f:存在且類型為檔案,歎号表示取反;
-d|!d:判斷為目錄;
-e|!-e:判斷存在;
-x|!-x:判斷執行權限;
47、return:傳回用戶端,停止處理,直接用傳回響應碼給用戶端;
return code [text]; 隻傳回響應狀态碼+一個文本
return code URL; 傳回響應狀态碼+一個URL
return URL; 隻傳回一個URL
48、set $variable value;
使用者自定義變量;在nginx中變量無論在定義還是引用都要使用$符号;
ngx_http_gzip_module子產品;
過濾器,對指定類型的資源壓縮傳輸以節約帶寬;但消耗了cpu資源;
49、gzip on|off;
是否啟用gzip壓縮響應封包;不是所有浏覽器都支援壓縮機制;
50、gzip_comp_level level;
指定壓縮比,1-9,預設為1;數越大壓縮比越大;
51、gzip_disable regex ...;
regex是比對用戶端浏覽器類型的模式,表示對所有比對到的浏覽器不執行壓縮響應;因為有些浏覽器類型不支援壓縮;
52、gzip_min_length length;
觸發啟用壓縮功能的響應封包的最小長度;
53、gzip_http_version 1.0|1.1;
設定啟用壓縮響應功能時,協定的最小版本;向下相容原則;
54、gzip_types mime-type ...;
指定僅執行壓縮的資源内容類型;預設為text/html;
55、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
對代理的請求基于哪種屬性判斷其是否應該啟用壓縮功能;
off:所有代理請求都壓縮;
expired:如果響應封包首部包含expired字段并有值,其值即是有有效期的但過期了,因為禁用了緩存機制,則啟用壓縮;
其餘幾項後面介紹;
ngx_http_fastcgi_module子產品
nginx基于Fastcgi方式與php-fpm通信;nginx編譯時隻支援fastcgi子產品,是以php也隻能使用php-fpm機制;
56、fastcgi_pass address;
指明後端php-fpm伺服器的address;是fpm伺服器監聽的位址和端口;
57、fastcgi_index name;
定義fastcgi應用的首頁名稱;可以是多個;
58、fastcgi_param parameter value [if_not_empty];
指明向後端傳遞的參數,傳遞給fpm伺服器的參數及其值;有可能調用的nginx變量的值;
nginx主機:172.18.11.111
在php主機:172.18.11.112
在php主機提供php測試頁并設定php-fpm:
]# mkdir /php
]# vim /php/index.php
<?php
phpinfo();
?>
<a href="http://s2.51cto.com/wyfs02/M00/80/F7/wKioL1dFjGKTZC5UAADvHK7xj8c108.png" target="_blank"></a>
在nginx上配置:
<a href="http://s3.51cto.com/wyfs02/M01/80/F7/wKioL1dFjH6gKFTtAACaleT3jc4489.png" target="_blank"></a>
浏覽器測試:
<a href="http://s1.51cto.com/wyfs02/M02/80/F7/wKioL1dFjN6wFXmPAAFbtifny1o268.png" target="_blank"></a>
59、fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
定義緩存空間的名稱;
path:檔案系統路徑,用于存放緩存的檔案資料;在此目錄下分多級目錄;
max_size=size:定義此路徑下多大空間用于存儲緩存資料;
levels=#[:#[:#]]:緩存目錄的層級定義;一般為1或2;
keys_zone=name:size:定義記憶體中用于緩存k/v映射關系的空間名稱及大小;
inactive=time:定義非活動時間;
60、fastcgi_cache zone|off;
是否啟用cache功能,如果啟用,要提前定義緩存空間的名字,此處調用;預設為off不緩存;
61、fastcgi_cache_key string;
定義要使用的緩存鍵;
62、fastcgi_cache_methods GET | HEAD | POST ...;
緩存哪些類型的請求的相關資料;是請求方法;
63、fastcgi_cache_min_uses number;
緩存最少使用次數;在指定時長内,如果小于此值就為非活動;
64、fastcgi_cache_valid [code ...] time;
緩存資料時,對不同響應碼設定其可緩存的時長;
注意:調用緩存時,至少應該制定3個參數
fastcgi_cache
fastcgi_cache_key
fastcgi_cache_valid
nginx配置緩存:
<a href="http://s1.51cto.com/wyfs02/M01/80/F7/wKioL1dFjWfjPO2MAAA14bII6Eo227.png" target="_blank"></a>
浏覽器網頁重新整理後,可檢視緩存檔案已經生成:
<a href="http://s3.51cto.com/wyfs02/M00/80/F7/wKioL1dFjbDRFFCNAAApyKLckvM947.png" target="_blank"></a>
ngx_http_proxy_module反代子產品
用于反代使用者請求到後端主機,同時又支援緩存功能;工作方式同fastcgi使用fastcgi_pass指令一樣;
65、proxy_pass URL;
可實作動靜分離;
能夠實作将請求發給後端URL指定的主機位址,這裡之是以使用URL可以完成URL映射;例如前端的url為bbs,後端url可以是forum;
應用在location, if in location, limit_except的上下文;
這個uri可以不帶,如果後面沒有url時,proxy_pass會将location的url傳遞給後端主機;proxy_pass後面的路徑不帶uri時,其會将location的uri傳遞給後端主機;proxy_pass後面的路徑是一個uri時,其會将location的uri替換為proxy_pass後端主機的uri;如果location定義其uri時使用了正則式表達模式比對機制,則proxy_pass後的路徑必須不能使用uri;否則有文法錯誤;
例如:location /uri/ {
注意:HOST決不能帶/;
則:
# root /usr/share/nginx/html;
index index.html index.htm;
location ~* \.php$ {
例如:nginx當反代伺服器
後端主機172.18.11.112:為php伺服器
後端主機172.18.211.113:為web伺服器
分别提供好相應的測驗頁。
nginx配置:
<a href="http://s5.51cto.com/wyfs02/M02/80/F7/wKioL1dFj_uxQgVRAACp4IC9DcM678.png" target="_blank"></a>
設定反代緩存時,方法類似nginx本地緩存;也必須在http上下文中定義,且也是先定義緩存名稱,然後在location中調用,建立緩存目錄等步驟;
<a href="http://s3.51cto.com/wyfs02/M00/80/F7/wKioL1dFkD2iHh03AAAeNDWjZ6c384.png" target="_blank"></a>
在後端web主機172.18.11.113上,設定日志格式,調用在nginx中設定的頭部資訊:
在浏覽器重新整理測試後,可檢視web主機日志:
記錄了用戶端主機和代理主機的ip位址;
<a href="http://s5.51cto.com/wyfs02/M02/80/F7/wKioL1dFkMaBh8dkAAFl4H9bgEU818.png" target="_blank"></a>
通路php頁面被傳到後端php伺服器響應:
<a href="http://s3.51cto.com/wyfs02/M01/80/F7/wKioL1dFkOrBHI_jAADPPDwJreE536.png" target="_blank"></a>
通路html頁面傳到後端web伺服器響應:
<a href="http://s4.51cto.com/wyfs02/M02/80/F9/wKiom1dFkBPgJyIbAABuYBMECOQ611.png" target="_blank"></a>
nginx使用這種為後端伺服器做代理方式,可實作動靜資源分離;
内置變量的調用,向用戶端展示緩存命中與否;
add_header X-Cache $upstream_cache_status;
66、proxy_set_header field value;
設定向後端主機發送的請求封包的首部及其值;或是在原有首部後添加新值;用在http, server, location上下文; 能抓取終端使用者IP位址,field可自定義;預設為$proxy_host代理主機的IP位址;可以設定任何首部的值;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwared_for;
67、proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size];
跟nginx緩存相關的選項(緩存要先定義,後調用),隻能用于http上下文;
可選項:
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]
keys_zone=name:size 指明記憶體空間名稱和大小;
path 磁盤上緩存的檔案系統路徑;
levels=levels 緩存目錄層級,最多有3級,每級最多2個字元(目錄);
use_temp_path=on|off 是否啟用臨時檔案路徑;
inactive=time 緩存中緩存項(k/v資料)的非活動時間;預設10分鐘;
max_size=size 緩存檔案系統路徑的大小;一旦存滿了基于LRU(最近最少使用)算法做清理;
68、proxy_cache zone | off;
調用緩存,預設為off;
69、proxy_cache_key string;
定義緩存鍵;
proxy_cache_key $request_uri
proxy_cache_key $scheme$proxy_host$request_uri
多個變量的值作為一個字元串使用,這樣,即便通路的是同一url,如果使用的協定不同,對應的緩存項也不一樣;是以,key就決定了兩個緩存項是否為同一個;
70、proxy_cache_valid [code ...] time;
為不同的響應碼設定其緩存的時長;
proxy_cache_valid 200 303 10m;
proxy_cache_valid 404 1m;
響應碼沒定義的表示不緩存;
71、proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
指明在什麼情況下是否使用過期緩存;當代理伺服器後後端主機通信發生錯誤時,在哪種錯誤情況下可以使用緩存中的内容,直接響應給用戶端;
其實代理可使用的選項非常多:
proxy_cache_min_uses 最少使用次數;
proxy_cache_methods 為哪些請求方法緩存,預設隻為get緩存;
proxy_cache_bypass 繞過緩存;
proxy_cache_purge 對緩存進行修剪
72、 proxy_cache_revalidate 重新校驗;
跟nginx連接配接相關的指令
73、proxy_connect_timeout time;
與後端伺服器建立連接配接的逾時時長,預設為60秒,最長為75秒;
74、proxy_read_timeout time;
等待後端主機發送響應封包的逾時時長,預設為60秒;此處定義的時長指的是連續兩次響應封包等待之間的時長;很有可能需要調整;兩個等待後端響應封包的時長;
75、proxy_send_timeout time;
向後端伺服器發送請求封包的逾時時長,預設為60秒,指的是連續兩次請求封包(寫操作)之間的時長,不是整個請求本身;兩個請求封包發送後端的時長;
ngx_http_headers_module子產品
用于在響應給用戶端的封包中添加首部值;
76、add_header name value [always];
向響應給用戶端的封包添加自定義首部,并指派;
add_header X-Via $server_addr;
77、expires [modified] time;
expires epoch | max | off;
控制與緩存相關的首部;用于添加Expire及Cache-Control首部或修改首部的值;後面講到緩存服務時具體講緩存細節,這裡不做過多介紹;當響應碼為200, 201, 204, 206, 301, 302, 303, 304, or 307添加一個首部,或修改一個值;就是控制如何緩存,包括緩存時間;
Module ngx_http_upstream_module子產品
将多個後端主機定義為伺服器組,而後可由proxy_pass,fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass等進行引用;用于定義伺服器組,用一組伺服器可由代理伺服器向外釋出服務接收、請求;這組伺服器可基于某種方式定義排程算法(如ip_hash,least_conn),來實作所謂的負載均衡排程;
此子產品才是真正能把nginx當做反向代理負載均衡器的子產品,定義成組不光能被proxy_pass使用,還可被fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass使用;
78、upstream name { ... }
定義後端伺服器組;隻需指定組名,引入新的上下文,上下文就叫upstream上下文;隻能用于http上下文;
79、server address [parameters];
添加伺服器,定義伺服器的位址和相關參數;預設為80端口;
address位址格式:
IP[:port] 指定後端主機IP位址和端口
HOSTNAME[:port] 指定後端主機的某虛拟主機,要在前端代理的hosts檔案中定義代理的虛拟主機名對應的ip位址是什麼,避免dns挂了不能被通路;
unix://PATH/TO/SOME_SOCK_FILE 開頭是unix的路徑;
parameters參數:
weight=number 伺服器主機的權重值;在最少連接配接和輪詢排程時,預設的意義是權重輪詢或權重最少連接配接;
max_fails=number 最大失敗嘗試次數(與後端伺服器連接配接最大不成功嘗試次數)
fail_timeout=time 設定伺服器被識别為不可用的逾時時長;
backup 備用主機,相當于定義為sorry server;所有後端主機都不可用時才生效;
down 手動标記為下線(不再處理任何使用者請求),維護時使用;
例如後端如果是商城程式的應用程式伺服器時,當要進行新版本程式釋出,一般在晚上進行,設定要應用此設定;在摘除前確定本伺服器沒有會話保持,可用session伺服器做會話保持,這樣即便摘除,客戶通路時再次重新整理會重新排程到線上伺服器上;
就在前端代理伺服器對應的server上添加down,标記為下線,就可摘除後端伺服器進行更新等操作,完成後再接入系統中,把down标記删除即可;觀察一段時間後沒有問題,就可以此方法,對其它伺服器進行更新操作,這種機制就稱灰階釋出模型;數量多時可一批一批進行,有能力會寫腳本自動完成;但是腳本完成比較麻煩,可使用python程式完成;
一般先标記為down,然後重載nginx,就不會有新的請求進來,但是老的請求還在,因為是平滑摘除的;一個請求對伺服器最長不能超過5秒鐘;5秒鐘以後,就可把後端服務停掉了
80、ip_hash;
原位址哈希排程算法;隻能用于upstream上下文;能夠使來自于同一個用戶端請求始終到同一個RS;哈希的是用戶端ip,相當于lvs中的sh算法,哈希表中的key是用戶端ip,位于同一個nat伺服器後面的所有用戶端(内網使用者),會始終被排程到一個伺服器響應,排程粒度過于粗糙;
81、least_conn;
如果weight有值且不相同,就相當于權重最少連接配接排程算法;隻能用于upstream上下文;考慮後端伺服器目前負載進行排程;計算方法跟lvs中很相似,活動數連接配接/權重;有可能結果不是很對稱,這跟逾時時間有關;
82、keepalive connections;
設定保持連接配接個數;可節約套接字和端口;激活後端伺服器組緩存,主要設定保持連接配接時長(實際是連接配接個數);超出連接配接的個數時,最近最少使用的連接配接LRU被關閉;通常,在前端反代伺服器與後端伺服器間打開保持連接配接功能,可節約前端反代伺服器的端口(套接字);
83、health_check [parameters];
定義後端主機的健康狀态檢測機制;隻能用于location上下文;如果不定義此處,預設在定義server時也會有最大失敗嘗試次數,失敗的逾時時長等,已經有一定意義的健康狀态檢測機制;要使用match判斷比對健康機制;
parameters可用參數:
interval=time 檢測的頻度,預設為5秒;
fails=number 判定為失敗的檢測次數;判斷伺服器不可用的檢測次數;預設1次,盡量使用3次;
passes=number 判定為成功的檢測次數;判斷伺服器為可用的檢測次數;預設1次;
uri=uri 執行健康狀态檢測時試圖請求的uri;不指明預設為首頁/;表明在請求這個url時,其響應結果必須是在match中比對的
match=name 基于哪個match做檢測結果為成功或失敗的判定;用誰進行評估檢測結果;指明調用哪個macth(做健康檢測判斷)判斷成功或失敗;
port=number 指明向伺服器的哪個端口發起健康狀态檢測請求;
伺服器可監聽在2個端口,例如用8080端口用來接收健康狀态檢測,80端口向外提供服務;這樣可以把8080端口做一個虛拟主機,而後對這個内容不記錄在通路日志中;是以作為健康狀态檢測,有可能對于後端主機要關閉日志功能;
84、match name{...}
隻用于http上下文,對後端主機做健康狀态檢測時,定義其結果判斷标準;
專用指令:
status:期望的響應碼:
status CODE
status ! CODE
status CODE-CODE
header:基于響應首部進行判斷
header HEADER=VALUE
header HEADER!=VALUE
header [!]HEADER
header HEADER ~ VALUE
body:期望的響應封包的主體部分應該有的内容;
body ~ "CONTENT"
body !~ "CONTENT"
85、sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path];
啟用session綁定,基于cookie(會話)的綁定機制;隻用于upstream上下文;比ip_hash更為精細的精細會話保持綁定;
參數選項:
cookie name 定義server id
expires=time 定義cookie有效時長,即會話綁定時長;
domain=domain 定義cookie應用在哪個域上;
httponly 定義cookie僅用在http協定上;
secure 給cookie添加安全首部
path=path 指定某個域中的某個路徑下哪些内容做cookie綁定
86、hash key [consistent];
定義排程方法,可自定義基于何種資訊(key)進行綁定;如nginx可基于cookie、使用者請求的host首部、使用者請求的uri綁定;
hash $remote_addr 基于請求的用戶端位址進行綁定;相當于ip_hash;
hash $request_uri 用戶端請求的url
hash $cookie_username 來自同一使用者賬号進行綁定
其中内置變量:
$upstream_addr upstream伺服器自己的位址
$upstream_cache_status 緩存命中與否,引用後可知道是從緩存中響應的,還是從後端伺服器響應的;
注意:隻要能進行哈希的值都可作為綁定對象;
補充:内置變量的調用,向用戶端展示緩存命中與否;
注意:nginx也可實作更進階的基于方法的分離,get,put叫讀寫分離等;
nginx作為nginx作為前端排程器,反代負載均衡後端伺服器:
web伺服器主機組:
RS1:172.18.11.11
RS2:172.18.11.12
php伺服器主組:
RS1:172.18.11.111
RS2:172.18.11.113
在server上下文配置:
<a href="http://s1.51cto.com/wyfs02/M00/80/F7/wKioL1dFkTyjsfc6AAC5uCSXLlE742.png" target="_blank"></a>
在http上下文配置:
<a href="http://s3.51cto.com/wyfs02/M00/80/F9/wKiom1dFkGPQoV3PAADczuec8V8367.png" target="_blank"></a>
本文轉自 crystaleone 51CTO部落格,原文連結:http://blog.51cto.com/linsj/1783171,如需轉載請自行聯系原作者