3.5 nginx常用模塊
1 Module ngx_http_gzip_module
該ngx_http_gzip_module模塊是一個使用“gzip”方法壓縮響應的過濾器。這通常有助于將傳輸數據的大小減少一半甚至更多。
使用SSL / TLS協議時,壓縮的響應可能會受到 BREACH攻擊。
在實際的應用中我們發現壓縮的比率往往在 3 到 10 倍,也就是本來 50k 大小的頁面,采用壓縮后實際傳輸的內容大小只有 5 至 15k 大小,這可以大大節省服務器的網絡帶寬,同時如果應用程序的響應足夠快時,網站的速度瓶頸就轉到了網絡的傳輸速度上,因此內容壓縮后就可以大大的提升頁面的瀏覽速度。
1.1 Example Configuration
gzip on;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
gzip_min_length 1000;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json image/jpeg image/gif image/png image/jpg;
1.2 Directives
gzip
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
啟用或禁用gzipping響應。
gzip_buffers
Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location
設置用于壓縮響應的緩沖區*number*和*size*。默認情況下,緩沖區大小等于一個內存頁面。這是4K或8K,具體取決于平臺。
gzip_comp_level
Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location
設置level響應的gzip壓縮。可接受的值范圍為1到9。
推薦6壓縮級別(級別越高,壓的越小,越浪費CPU計算資源)
gzip_disable
Syntax: gzip_disable regex ...;
Default: —
Context: http, server, location
對具有與任何指定正則表達式匹配的“User-Agent”標頭字段的請求禁用gzipping響應。
特殊掩碼“ msie6”(0.7.12)對應于正則表達式“ MSIE [4-6]\.”,但效果更快。
gzip_http_version
Syntax: gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;
Context: http, server, location
設置壓縮響應所需的最低HTTP請求版本。
99.99%的瀏覽器基本上都支持gzip解壓了,所以可以不用設這個值,保持系統默認即可。
gzip_min_length
Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location
設置將被gzip壓縮的響應的最小長度。長度僅由“Content-Length”響應頭字段確定。
gzip_proxied
Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
Default: gzip_proxied off;
Context: http, server, location
根據請求和響應啟用或禁用對代理請求的響應的gzipping。請求被代理的事實由“Via”請求頭字段的存在確定。該指令接受多個參數:
off:禁用所有代理請求的壓縮,忽略其他參數;expired:如果響應頭包含“Expires”字段,其值為禁用緩存,則啟用壓縮;no-cache:如果響應頭包含帶有“no-cache”參數的“Cache-Control”字段,則啟用壓縮;no-store:如果響應頭包含帶有“no-store”參數的“Cache-Control”字段,則啟用壓縮;private:如果響應頭包含帶有“private”參數的“Cache-Control”字段,則啟用壓縮;no_last_modified:如果響應頭不包含“Last-Modified”字段,則啟用壓縮;no_etag:如果響應頭不包含“ETag”字段,則啟用壓縮;auth:如果請求標頭包含“授權”字段,則啟用壓縮;any:為所有代理請求啟用壓縮。
gzip_types
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
除了“ text/html” 之外,還允許對指定的MIME類型進行gzipping響應。特殊值“ *”匹配任何MIME類型。
圖片類型的文件壓縮比例很小,可以不忽略不計,所以圖片不建議壓縮
gzip_vary
Syntax: gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location
如果指令gzip, gzip_static或gunzip 處于活動狀態, 則啟用或禁用插入“Vary:Accept-Encoding”響應頭字段 。
1.3 常見問題
調用接口時,返回json亂碼的問題
原因:
gzip是nginx的壓縮格式。(gzip是瀏覽器可接受的壓縮格式) 但是我們調用接口并沒有通過瀏覽器。所以沒有辦法對返回的結果進行解壓。
解決辦法:
- 在響應的
location中關閉gzip - 或者讓后端改代碼,增加判斷,然后用gzip流的方式進行解壓讀取
2 Module ngx_http_log_module
2.1 Example Configuration
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;
2.2 access_log指令
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
2.3 log_format指令
Syntax: log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http
3 Rewrite模塊
3.1 return指令
Syntax: return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if
返回狀態碼
- nginx自定義
- 444:關閉連接
- HTTP1.0標準
- 301:http1.0永久重定向
- 302:臨時重定向,禁止被緩存
- HTTP1.1標準
- 303:臨時重定向,允許改變方法,禁止被緩存
- 307:臨時重定向,不允許改變方式,禁止被緩存
- 308:永久重定向,不允許改變方法
示例
server {
server_name wiki.clay-wangzhi.com;
listen 8080;
root html/;
error_page 404/403.html;
return 403;
location / {
return 404 "find nothing!";
}
}
return指令與errror_page

3.2 rewrite指令
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
功能
-
將regex指定的url替換成replacement這個新的url
可以使用正則表達式及變量提取
-
當replacement以http://或者https://或者$schema開頭,則直接返回302重定向
-
替換后的url根據flag指定的方式進行處理
如果在同一級配置塊中存在多個rewrite規則,那么會自下而下逐個檢查;被某條件規則替換完成后,會重新一輪的替換檢查,因此,隱含有循環機制;[flag]所表示的標志位用于控制此循環機制;
-
last:
- 瀏覽器地址欄URL地址不變
- 用replacement這個URI進行新的location匹配,重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后對新的URI啟動新一輪重寫檢查;提前重啟新一輪循環;
-
beak:
- 瀏覽器地址欄URL地址不變
- break指令停止當前腳本指令的執行,等價于獨立的break指令,重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環;
-
redirect:
- 瀏覽器地址會顯示跳轉后的URL地址
- 返回302臨時重定向,
-
permanent:
- 瀏覽器地址會顯示跳轉后的URL地址
- 返回301永久重定向
-
功能一句話概括為:使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標志位實現url重寫以及重定向。
示例1
root html/;
location /first {
rewrite /first(.*) /second$1 last;
return 200 'first!';
}
location /second {
rewrite /second(.*) /third$1 break;
return 200 'second!';
}
location /third {
return 200 'third!';
}
訪問/first/1.txt的結果為:html/third/1.txt的內容
訪問/second/1.txt的結果為:html/third/1.txt的內容
訪問/third/1.txt的結果為:third的內容
示例2
# http://www.test.com/test/abc/1.html ? http://www.test.com/ccc/bbb/2.html
location /test {
rewrite .* /ccc/bbb/2.html permanent;
}
# http://www.test.com/2015/ccc/bbb/2.html ==> http://www.test.com/2014/ccc/bbb/2.html
location /2015 {
rewrite ^/2015/(.*)$ /2014/$1 permanent;
}
# http://www.test.com/2015/ccc/bbb/2.html ==> http://jd.com/index.php
location /2015 {
if ($host ~* test.com) {
rewrite .* http://www.jd.com/index.php permanent;
}
}
# http://www.test.com/kkk/1.html ==> http://jd.com/kkk/1.html
location / {
root html;
index index.html index.htm;
if ($host ~* test.com) {
rewrite .* http://www.jd.com/$request_uri permanent;
}
}
# 有時候在訪問一個二級子目錄時會出現目錄后的/無法補齊,如:
# elinks --dump www.test.com/www 無法訪問
# elinks --dump www.test.com/www/可以訪問
if (-d $request_filename) {
rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
}
# ^/(.*)([^/])$表示以/符號開始并緊跟著任何字符,同時不是以/為結束的字符串,在我的url中,(.*)表示的ww,([^/])表示的w
# http://www.test.com/login/robin.html ==> http://www.test.com/reg/login.php?user=robin
location /login {
rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1 permanent;
}
# http://www.test.com/uplook/10-10-10.html ==> http://www.test.com/uplook/10/10/10.html
location /uplook {
rewrite ^/uplook/([0-9]+)-([0-9]+)-([0-9]+)\.html$ /uplook/$1/$2/$3.html permanent;
}
# set 指令是用于定義一個變量,并且賦值。應用于server,location,if環境。
# http://robin.test.com ==> http://www.test.com/robin
# http://zorro.test.com ==> http://www.test.com/zorro
if ($host ~* "^www.test.com$") {
break;
}
if ($host ~* "^(.*)\.test\.com$") {
set $user $1;
rewrite .* http://www.test.com/$user permanent;
}
last 一般寫在server和if中,而break一般使用在location中
3.3 if指令
Syntax: if (condition) { ... }
Default: —
Context: server, location
規則:條件condition為真,則執行大括號內的指令;遵循值指令的繼承規則
if指令的條件表達式
- 檢查變量為空或者值是否為0,直接使用
- 當表達式只是一個變量時,如果值為空或任何以 0 開頭的字符串都會當做 false
- 將變量與字符串做匹配,使用=或者!=
- 將變量與正則表達式做匹配
- 大小寫敏感,~或者!~
- 大小寫不敏感,~*或者!~*
- 檢查文件是否存在,使用-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 ($repuest_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
3.4 rewrite_log指令
Syntax: rewrite_log on | off;
Default: rewrite_log off;
Context: http, server, location, if
4 realip模塊
- 默認不會編譯進Nginx,通過
--with-http_reaip_module啟用功能 - 功能:修改客戶端地址
- 指令:set_real_ip_from、real_ip_header、real_ip_recursive
- 變量:reaip_remote_addr、reaip_remote_port
4.1 Directives

5 limit_conn模塊
生效階段:NGX_HTTP_PREACCESS_PHASE階段
生效范圍:全部worker進程(基于共享內存),進入preaccess階段前不生效,限制的有效性取決于key的設計:依賴postread階段的realip模塊取到真實ip
5.1 指令


6 limit_req模塊


6.1 指令


限制發生時向客戶端返回的錯誤碼
Syntax: limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location
limit_req 與 limit_conn 配置同時生效時, limit_req有效
6.2 Example
http {
geo $limit {
default 1;
10.0.0.0/8 0;
192.168.0.0/64 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
server {
location / {
limit_req zone=req_zone burst=10 nodelay;
}
}
}
這個例子同時使用了geo和map指令。geo塊將給在白名單中的IP地址對應的$limit變量分配一個值0,給其它不在白名單中的分配一個值1。然后我們使用一個映射將這些值轉為key,如下:
如果$limit變量的值是0,$limit_key變量將被賦值為空字符串
如果$limit變量的值是1,$limit_key變量將被賦值為客戶端二進制形式的IP地址
兩個指令配合使用,白名單內IP地址的$limit_key變量被賦值為空字符串,不在白名單內的被賦值為客戶端的IP地址。當limit_req_zone后的第一個參數是空字符串時,不會應用“流量限制”,所以白名單內的IP地址(10.0.0.0/8和192.168.0.0/24 網段內)不會被限制。其它所有IP地址都會被限制到每秒5個請求。
limit_req指令將限制應用到**/**的location塊,允許在配置的限制上最多超過10個數據包的突發,并且不會延遲轉發。

浙公網安備 33010602011771號