1. 程式人生 > >Nginx的幾個重要模組

Nginx的幾個重要模組

ngx_http_ssl_module

  讓Nginx可以支援HTTPS的模組,此模組下的大多數指令都應用在http,server上下文

  ①ssl on | off;

   是否開啟ssl功能

  ②ssl_certificate file;

   當前虛擬主機使用的PEM格式的證書檔案

  ③ssl_certificate_key file;

   當前虛擬主機使用的證書中與公鑰配對的私鑰檔案

  ④ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];

   ssl協議的版本,SSLv2不安全,建議使用TLS,預設使用的是TLS

  ⑤ssl_session_timeout time;

   ssl會話超時時長,指ssl會話中快取條目的有效時長,預設為5m

  ⑥ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

   指明ssl會話的快取機制,預設是關閉的

builtin  //使用openssl內建的快取機制,為worker獨有
shared  //由各worker共享的快取
         name //快取空間的名稱
         size  //快取空間的大小/單位位元組,每1MB記憶體空間可快取4000個會話

  ⑦ssl_prefer_server_ciphers on | off;

   傾向於使用伺服器端的加密演算法,預設是關閉的

ngx_http_log_module

  此模組可以基於給定的格式記錄請求於日誌中

  ①access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

   access_log off;

   用在http,server,location,if in location,limit_except上下文

   預設值是access_log logs/access.log combined;

  ②log_format name string ...;

   定義日誌格式

   用在http上下文中

  ③open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

   open_log_file_cache off;

   定義開啟日誌檔案快取功能

   用於http,server,location上下文,預設是關閉的

max //最大快取條目
inactive=time //非活動時長,預設為10s
min_uses //最少使用次數,預設為1次
valid=time //驗證快取條目有效性的時長,預設為60s

ngx_http_rewrite_module

  基於此模組實現對請求的URL進行重寫、重定向

  ①rewrite regex replacement [flag];

   用在server,location,if上下文中

複製程式碼

/*①把使用者請求的URI基於regex做檢查,匹配到時將替換為replacement指定的字串
②在同一個location中存在多個rewrite規則會自上而下逐個被檢查(最多迴圈10次),可以使用flag控制此迴圈功能
③如果replacement中有以http或https開頭,則替換結果會直接以重定向的方式返回客戶端*/

[flag]:
last  //重寫完成後停止對當前url在當前Location中的後續其他重寫操作,改為對新url的新一輪處理;
break  //重寫完成後停止對當前url在當前Location中的後續其他重寫操作;(退出rewrite中的規則)
redirect  //重寫完成後以臨時重定向方式直接返回重寫後生成的新的URL給客戶端,由客戶端對新的URL再次請求(響應碼:302)
permanent  //重寫完成後以永久重定向方式直接返回重寫後生成的新的URL給客戶端,由客戶端對新的URL再次請求(響應碼:301)

複製程式碼

  ②rewrite_log on | off;

   是否啟用重寫日誌;啟用時,日誌資訊被髮往錯誤日誌,預設是關閉的

   用在http,server,location,if上下文

  ③if (condition) { ... }

   條件判斷機制,在條件滿足時,執行配置塊中的配置,引入了一個新的配置上下文

   僅用在server,location上下文中

複製程式碼

condition:
//比較表示式:
    ==,!=
    ~  //模式匹配,區分字元大小寫
    ~*  //模式匹配,不區分字元大小寫
    !~  //模式不匹配,區分字元大小寫
    !~*  //模式不匹配,不區分字元大小寫
//檔案及目錄存在性判斷:
    -f,!-f  //檔案
    -d,!-d //目錄
    -e,!-e  //存在
    -x,!-x  //執行許可權

//示例:
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
if ($request_method = POST) {
    return 405;
}
if ($slow) {
    limit_rate 10k;
}
if ($invalid_referer) {
    return 403;
}

複製程式碼

  ④return code [text];

   return code URL;

   return URL;

   以指定的響應碼和URL迴應客戶端

   用在server,location,if上下文中

  ⑤set $variable value;

   使用者自定義變數

   用在server,location,if上下文中

ngx_http_gzip_module

  過濾器,對指定型別的資源壓縮傳輸以節約頻寬

  ①gzip on | off;

   啟用或禁用gzip壓縮響應報文

   用在http,server,location,if in location上下文中

  ②gzip_comp_level level;

   指定壓縮比(1-9),預設為1

   用在http,server,location上下文

  ③gzip_disable regex ...;

   regex是匹配客戶端瀏覽器型別的模式,表示對匹配到的瀏覽器不執行壓縮響應報文

   用在http,server,location上下文

  ④gzip_min_length length;

   觸發啟用壓縮功能的響應報文的最小長度

   用在http,server,location上下文

  ⑤gzip_http_version 1.0 | 1.1;

   設定啟用壓縮功能時,協議的最小版本,如果設定為1.1,1.0則不壓縮

   用在http,server,location上下文

  ⑥gzip_types mime-type ...;

   指定僅執行壓縮的資源內容型別,預設為text/html

   用在http,server,location上下文

  ⑦gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

   對代理的請求基於何種屬性判斷其是否應該啟用壓縮功能

   用在http,server,location上下文

ngx_http_fastcgi_module

  基於此模組實現與php-fpm結合

  ①fastcgi_pass address;

   指明後端的伺服器,address是fpm伺服器監聽的地址和埠

   用在location和if in location上下文

  ②fastcgi_index name;

   fastcgi應用的主頁名稱

   用在http,server,location上下文

  ③fastcgi_param parameter value [if_not_empty];

   傳遞給fpm伺服器的引數及其值

   用在http,server,location上下文

複製程式碼

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING    $query_string;
fastcgi_param REQUEST_METHOD  $request_method;
fastcgi_param CONTENT_TYPE    $content_type;
fastcgi_param CONTENT_LENGTH  $content_length;

//更多引數查閱fastcgi_params

複製程式碼

  ④fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

   定義fastcgi的快取相關,僅能定義在http上下文

path //檔案系統路徑,用於儲存快取的檔案資料
max_size=size //定義此路徑下的多大空間用於儲存快取資料
levels=#[:#[:#]] //快取目錄層級定義
    //如:levels=1:2
keys_zone=name:size //記憶體空間中用於快取k/v對映關係的空間名稱及大小
inactive=time //非活動時間

  ⑤fastcgi_cache zone | off;

   啟用快取功能,存於哪個zone中,依賴於上個配置中的定義

   用在http,server,location上下文

  ⑥fastcgi_cache_key string;

   定義要使用的快取鍵

   用在http,server,location上下文  

//示例
fastcgi_cache_key localhost:9000$request_uri;

  ⑦fastcgi_cache_methods GET | HEAD | POST ...;

   快取基於哪些請求方法的相關資料

   用在http,server,location上下文

  ⑧fastcgi_cache_min_uses number;

   指定時間內快取的最少使用次數

   用在http,server,location上下文

  ⑨fastcgi_cache_valid [code ...] time;

   對不同響應碼設定其可快取時長

//示例
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404      1m;

  注意:啟用快取功能時,至少應該指定的三個引數:fastcgi_cache,fastcgi_cache_key,fastcgi_cache_valid

複製程式碼

/*
Nginx快取的實現機制

分兩部分儲存快取資訊,
一部分放於記憶體中:key-value形式
    其中key是url,value是快取資訊檔案的校驗碼(md5)
另一部分是將快取資訊的檔案置於磁碟上,並基於md5校驗碼實現分級儲存,以便查詢
*/

複製程式碼

  基於此模組實現反代客戶端請求至後端伺服器

  ①proxy_pass URL;

   代理指令,後跟後端主機的URL

   用在location,if in location,limit_except上下文

複製程式碼

//①proxy_pass後面的路徑不帶uri時,會把location的uri傳遞給後端主機
location /uri/ {
    proxy_pass http://HOST;
}
//假如location中的/uri/是/bbs/,訪問的站點是www.a.com,則通過proxy_pass傳遞給後端主機的URL是:http://www.a.com/bbs/

//②proxy_pass後面路徑是一個uri時,其會將location的uri替換為proxy_pass後端主機的uri
location /uri/ {
    proxy_pass http://HOST/new_uri/;
}
//假如location中的/uri/是/bbs/,訪問的站點是www.a.com,proxy_pass後面的new_uri是/BBS/,則通過proxy_pass傳遞給後端主機的URL是:http://www.a.com/BBS/;

//③如果location定義uri時使用了正則表示式匹配機制,則proxy_pass後的路徑必須不能使用uri
location ~|~* PATTERN {
    proxy_pass http://HOST;
}

複製程式碼

  ②proxy_set_header field value;

   設定向後端主機發送的請求報文的首部及其值

   用在http,server,location上下文

proxy_set_header Real_Client $remote_addr(client addr);
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
//保留原來的值再附加新值(建議使用)

  ③proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

   定義快取路徑

   只能定義在http上下文

//示例
proxy_cache_path /var/cache levels=2:1 keys_zone=mycache:10m max_size=10m;

  ④proxy_cache zone | off;

   呼叫快取,預設為off

   用在http,server,location上下文

  ⑤proxy_cache_key string;

   定義快取鍵;

   用在http,server,location上下文

//示例
proxy_cache_key $request_uri(一般是請求uri)
proxy_cache_key $scheme$proxy_host$request_uri

  ⑥proxy_cache_valid [code ...] time;

   為不同的響應碼設定其快取的時長

   用在http,server,location上下文

//示例
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

  ⑦proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

   向後端請求不到相應資源時基於哪種響應碼或錯誤,使用過期快取響應客戶端

   用在http,server,location上下文

  ⑧proxy_connect_timeout time;

   與後端建立連線的超時時長,預設60s,最長為75s

   用在http,server,location上下文

  ⑨proxy_read_timeout time;

   等待後端主機發送響應報文的超時時長,預設為60s

   用在http,server,location上下文

  ⑨+①proxy_send_timeout time;

   向後端伺服器傳送請求報文的超時時長,預設為60s

   用在http,server,location上下文

  基於此模組在響應給客戶端的報文中新增首部

  ①add_header name value [always];

   向響應報文新增自定義首部,並賦值

   用在http,server,location,if in location上下文  

add_header X-Cache $upstream_cache_status;

//可檢視是否命中快取
//示例:
add_header x-via $server_addr(接收請求報文的伺服器地址)

  ②expires [modified] time;

   expires epoch | max | off;

   用於新增Expire及Cache-Control首部或修改其值

   用在http,server,location,if in location上下文

ngx_http_upstream_module

  基於此模組實現nginx的負載均衡:定義伺服器組,將多個後端主機定義為伺服器組,而後可由proxy_pass,fastcgi_pass,memcached_pass等呼叫

  ①upstream name { ... };

   定義後端伺服器組,引入新的上下文,只能用於http上下文

  ②server address [parameters];

   定義後端伺服器的地址和相關引數

   僅用於在upstream上下文

複製程式碼

地址格式:
    IP[:port]
    HOSTNAME[:port]
    unix:/PATH/TO/SOME_SOCK_FILE
引數:
    weight=number //伺服器排程權重
    max_fails=number //最大失敗嘗試次數
    fail_timeout=time //設定伺服器失敗(不可用)的超時時長
    backup //備用主機,相當於sorry_server
    down //手動標記其不再處理任何使用者請求

複製程式碼

  ③ip_hash;

   指定排程演算法:源地址雜湊

   僅用於在upstream上下文

  ④least_conn;

   指定排程演算法:最少連線

   僅用於在upstream上下文

  ⑤keepalive connections;

   保持連線的個數

   僅用於在upstream上下文

  ⑥health_check [parameters];

   定義後端主機的健康狀態檢測

   只能在location中使用

複製程式碼

//可用引數:
    interval=# //檢測的頻度,預設為5s
    fails=# //判定為失敗的檢測次數
    passes=# //判定為成功的檢測次數
    uri=uri //執行檢測時請求的uri,預設為主頁
    match=name //基於那個match做檢測結果為'ok'或'not ok'的判定
    port=# //向伺服器的那個埠發起檢測請求

複製程式碼

  ⑦match name {...};

   對後端主機做檢測時,定義其結果的判斷標準,nginx2.0+才支援

   僅用於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"

複製程式碼

  ⑧hash key [consistent];

   定義排程方法,可自定義基於何種資訊(key)進行繫結

   僅用於在upstream上下文

hash $remote_addr
hash $request_uri
hash $cookie_username