天天看點

nginx 基礎總結

解決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

&lt;?php

phpinfo();

?&gt;

<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,如需轉載請自行聯系原作者

下一篇: gpg

繼續閱讀