1. 程式人生 > 實用技巧 >Nginx 配置總結

Nginx 配置總結

基本配置

注意:下面的nginx版本是1.10,安裝是在CentOS 7中通過epel源進行安裝的nginx預設配置檔案。

# egrep -v "(^$)|(^#)|#" /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

下面是基於上面的配置檔案進行初步的優化:

# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log logs/error.log notice;
pid /var/run/nginx.pid;
worker_	rlimit_nofile 20480;
worker_cpu_affinity auto;
events {
accept_mutex on;  #不建議開啟
use epoll;  #預設會使用最有效的方法
multi_accept on;
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
sendfile on
server_tokens off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
	server {
	listen 80;
	server_name localhost;
	charset utf-8;
		location / {
		root html;
		index index.html;
		}
	error_page 500 502 503 504 /50x.html;
		location = /50x/html {
		root html;
		}
	}
}

常用配置

虛擬主機與靜態站點

靜態站點配置

1.listen:設定nginx監聽的IP地址和埠,如果不指定IP地址則監聽在該機器的所有IP地址上,同時可以使用default_server來設定預設虛擬主機, ssl用於限制只能通過ssl連線提供服務。
2.server_name:設定虛擬主機的名,其後可以跟一個或者多個主機名,主機名稱可以使用萬用字元和正則表示式。在匹配時首先是精確匹配,其次是左側通配,然後死右側通配,最後是正則。
3.index:定義預設主頁的格式。
4.root:設定請求的根目錄。
5.error_page:定義錯誤提示頁面。

 server {
        listen       80 default_server;
        #listen       [::]:80 default_server;
        server_name  www.study.com;
        access_log   /var/log/nginx/study_access.log main;

        location / {
        index        index.html index.htm;
        root         /data/website/study;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

測試

[root@study html]# tree /data/website/
/data/website/
└── study
    ├── 404.html
    ├── 50x.html
    └── index.html

1 directory, 3 files
# curl www.study.com 
study.com

alias

定義指定位置的替換。路徑值可以包含變數,$document_root和$ realpath_root除外。如果在使用正則表示式定義的位置內使用別名,則此類正則表示式應包含捕獲,並且別名應引用這些捕獲。
舉例

location /test {
  root /data/website;
}

# curl http://www.a.com/test/
/data/website/test/

root指令:給定的路徑對應於location的“/”這個URL;
/test/index.html --> /data/website/test/index.html
alias指令:給定的路徑對應於location的“/uri/"這個URL;
/test/index.html --> /data/website/index.html

error_page

根據http狀態碼重定向錯誤頁面。
舉例

location / {
  root /data/website;
}
error_page  404              /404.html
# echo 404.page >/data/website/404.html
# curl http://www.a.com/aaaaa
404.page
# curl http://www.a.com/aaaaa -I
HTTP/1.1 404 Not Found
Server: nginx/1.10.1
Date: Sat, 11 Feb 2017 16:39:24 GMT
Content-Type: text/html
Content-Length: 9
Connection: keep-alive
ETag: "589f3e1d-9"

try_files

嘗試查詢第1至第N-1個檔案,第一個即為返回給請求者的資源;若1至N-1檔案都不存在,則跳轉至最一個uri(必須不能匹配至當前location,而應該匹配至其它location,否則會導致死迴圈);
舉例

  root /data/website;
       location /test {
  try_files /test/1.html /test/2.html /test/3.html @abc;
}
     location @abc {
      rewrite ^/(.*)$ http://baidu.com;
}
# ls /data/website/test/
3.html
# curl http://www.a.com/test/1.html
33333

location資源匹配

location  = / {
  # 精確匹配 / ,主機名後面不能帶任何字串
  [ configuration A ]
}
location  / {
  # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
  # 但是正則和最長字串會優先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋
  # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 開頭的地址,匹配符合以後,還要繼續往下搜尋
  # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條
  [ configuration CC ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜尋正則,採用這一條。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 結尾的請求
  # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則
  [ configuration E ]
}
location /images/ {
  # 字元匹配到 /images/,繼續往下,會發現 ^~ 存在
  [ configuration F ]
}
location /images/abc {
  # 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在
  # F與G的放置順序是沒有關係的
  [ configuration G ]
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜尋,匹配到這一條正則,採用
    [ configuration H ]
}

1.=開頭表示精確匹配,如 A 中只匹配根目錄結尾的請求,後面不能帶任何字串。
2.^~ 開頭表示uri以某個常規字串開頭,不是正則匹配。
3.~ 開頭表示區分大小寫的正則匹配;
4.~* 開頭表示不區分大小寫的正則匹配
5./ 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

順序 no優先順序:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (/)

上面的匹配結果
按照上面的location寫法,以下的匹配示例成立:

/ -> config A
精確完全匹配,即使/index.html也匹配不了
/downloads/download.html -> config B
匹配B以後,往下沒有任何匹配,採用B
/images/1.gif -> configuration D
匹配到F,往下匹配到D,停止往下
/images/abc/def -> config D
最長匹配到G,往下匹配D,停止往下
你可以看到 任何以/images/開頭的都會匹配到D並停止,FG寫在這裡是沒有任何意義的,H是永遠輪不到的,這裡只是為了說明匹配順序
/documents/document.html -> config C
匹配到C,往下沒有任何匹配,採用C
/documents/1.jpg -> configuration E
匹配到C,往下正則匹配到E
/documents/Abc.jpg -> config CC
最長匹配到C,往下正則順序匹配到CC,不會往下到E

http://seanlook.com/2015/05/17/nginx-location-rewrite/

MIME型別相關的配置

1.default_type:定義響應的預設MIME型別。可以使用types指令來將副檔名對映到MIME型別。
2.types:將副檔名對映到MIME型別的響應。副檔名不區分大小寫。在nginx配置檔案中有個mime.types檔案是nginx預設的對映表。要使用特定位置發出所有請求的“application/octet-stream”MIEM型別,可以使用如下配置:

location /download/ {
    types        { }
    default_type application/octet-stream;
}

3.types_hash_bucket_size:設定型別雜湊表的儲存bucket大小。
4.types_hash_max_size:設定型別雜湊表的最大大小。

防盜鏈

1.referer_hash_bucket_size:設定有效的查閱器雜湊表的bucket大小。
2.referer_hash_max_size:設定有效的查閱器雜湊表最大大小。
3.valid_referers:指定“Referer”請求欄位值,這將導致嵌入的$invalid_referer變數設定為空字串。搜尋匹配不區分大小寫。

valid_referers選項
1.none:請求頭中缺少“Referer”欄位;
2.blocked:“請求”欄位存在於請求標頭中,但其值已被防火牆或代理伺服器刪除; 這樣的值是不以“http://”“https://”開頭的字串;
3.server_names:“Referer”請求頭欄位包含伺服器名稱之一;
4.arbitrary string:定義伺服器名稱和可選的URI字首。 伺服器名稱的開頭或結尾可以有“*”。 在檢查期間,“Referer”欄位中的伺服器埠被忽略;
5.regular expression:第一個符號應該是一個“〜”。 應當注意,表示式將與在“http://”“https://”之後開始的文字匹配。

舉例

location ~* \.(gif|png|jpg|bmp)$ {
        valid_referers none blockd *.study.com;
        if ($invalid_referer) {
           rewrite ^/ http://www.study.com/fuck.html;
          }
       }

headers模組

1.add_header:如果響應碼等於200、201、204、206、301、302、303、304或307,則將指定的欄位新增到響應頭中。這裡需要注意:在使用此指令時只能新增報頭而不能重寫報頭。
2.expires:如果響應程式碼等於200,201,204,206,301,302,303,304或307,則啟用或禁用新增或修改“Expires”和“Cache-Control”響應頭欄位

舉例

        location / {
        add_header   X-Via $server_addr;
        index        index.html index.htm;
        root         /data/website/study;
        }
        location ~* \.(gif|png|jpg|bmp)$ {
          expires 30d;
       }

ssl

1.ssl:為指定的虛擬主機啟用HTTPS協議。建議使用listen指令的ssl引數。
2.ssl_buffer_size:設定用於傳送資料的緩衝區大小。
3.ssl_certificate:指定開啟HTTPS協議主機的PEM格式證書檔案。從版本1.11.0開始,可以多次指定此偽指令來載入不同型別的證書,只有OpenSSL 1.0.2或更高版本支援不同證書的單獨證書鏈。 對於舊版本,只能使用一個證書鏈。由於HTTPS協議的限制,虛擬伺服器應該在不同的IP地址上偵聽,否則將為第二個站點發出第一個伺服器的證書。
4.ssl_certifirate_key:指定具有給定虛擬伺服器的PEM格式的金鑰的檔案。
5.ssl_ciphers:指定啟用的密碼。 密碼以OpenSSL庫理解的格式指定。
6.ssl_protocols:啟用指定的協議。 僅當使用版本1.0.1或更高版本的OpenSSL庫時,TLSv1.1和TLSv1.2引數才起作用。從版本1.1.13和1.0.12開始支援TLSv1.1和TLSv1.2引數,因此,當舊版nginx版本使用OpenSSL版本1.0.1或更高版本時,這些協議可以正常工作,但不能禁用。
7.ssl_session_cache:設定儲存會話引數的快取記憶體的型別和大小。
8.ssl_session_timeout:客戶端可以重用會話快取中ssl引數的過期時間。
9.ssl_prefer_server_ciphers:設定協商加密演算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件。

ssl_session_cache選項說明
1.off:嚴格禁止使用會話快取:nginx顯式告訴客戶端會話可能不會被重用。
2.none:緩慢地禁止使用會話快取:nginx告訴客戶端會話可以被重用,但實際上不在快取記憶體中儲存會話引數。
3.builtin:一個內建在OpenSSL中的快取; 僅由一個工作程序使用。 快取大小在會話中指定。 如果未指定大小,則等於20480個會話。 使用內建快取可能會導致記憶體碎片。
4.shared:在所有工作程序之間共享的快取記憶體。 快取大小以位元組為單位指定; 一兆位元組可以儲存約4000個會話。 每個共享快取應該有一個任意名稱。 具有相同名稱的快取可用於多個虛擬伺服器。

兩種快取型別可以同時使用,例如:

ssl_session_cache builtin:1000 shared:SSL:10m;

但是隻使用沒有內建快取的共享快取應該更有效。
舉例

server {
        listen 443 ssl;
        server_name ssl.study.com;
        ssl_certificate "/etc/nginx/ssl/study.crt";
        ssl_certificate_key "/etc/nginx/ssl/study.key";
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        location / {
          root /data/website/study/ssl;
          index index.html index.htm;
         }
}

擴充套件學習
1.自籤ssl證書時有時會遇到如下問題:

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The organizationName field needed to be the same in the
CA certificate (ca.com) and the request (study.com)

具體解決方法我是將/etc/pki/tls/openssl.cnf檔案中countryName = optionalstateOrProvinceName = optionalorganizationName = optional這個三個引數修改。
2.由於使用HTTPS會非常消耗CPU資源,這裡建議開啟keepalive、ssl_session_cache和ssl_session_timeout功能提升效能。其中1M 的會話快取大概包含 4000 個會話,而預設的ssl_session_timeout為5m,我們可以設定增加時間。
3.可是使用 HSTS 策略強制瀏覽器使用 HTTPS 連線,這個需要做好全站HTTPS才能申請。但是加入後清除比較麻煩,這個需要注意。
4.nginx在1.1.13和1.0.12版本後預設是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。

https://luckymrwang.github.io/2015/10/09/Nginx-SSL-效能優化/
https://aotu.io/notes/2016/08/16/nginx-https/
http://seanlook.com/2015/05/28/nginx-ssl/

log

1.log_not_found:啟用或者禁用將未找到的檔案記錄到error_log中。預設開啟。
2.log_subrequest:啟用或者禁用將子請求記錄到access_log中。預設關閉。
3.access_log:設定緩衝日誌寫入的路徑,格式和配置。
4.log_format:指定日誌格式。
5.open_log_file_cache:定義一個快取,用於儲存其名稱包含變數的常用日誌的檔案描述符。預設關閉。
6.rewrite_log:啟用或禁用將ngx_http_rewrite_module模組偽指令的處理結果記錄到通知級別的error_log。預設關閉。
7.error_log:配置錯誤日誌。第一個引數定義將儲存日誌的檔案。第二個引數確定日誌記錄的級別,可以是以下之一:debug,info,notice,warn,error,crit,alert或emerg。 以上的日誌級別按嚴重性遞增的順序列出。

access_log引數
1.gzip壓縮等級。
2.buffer設定記憶體快取區大小。
3.flush儲存在快取區中的最長時間。
4.off不記錄日誌。

比如,設定 buffer,buffer 滿 32k 才刷盤;假如 buffer 不滿 5s 鍾強制刷盤的配置如下:

access_log /var/log/nginx/access.log buffer=32k flush=5s;

log_format日誌格式

變數含義
$remote_addr client address
$remote_user 使用者名稱提供基本認證
$time_local 公共日誌格式中的本地時間
$request 記錄請求的URL和HTTP協議
$status response status
$body_bytes_sent 傳送到客戶端的位元組數,不計數響應頭
$http_referer url跳轉來源
$http_user_agent 使用者端瀏覽器資訊
$http_x_forwarded_for 記錄客戶端IP地址
$bytes_sent 傳送到客戶端的位元組數
$connection 連線序列號
$connection_requests 通過連線發出的當前請求數
$msec 日誌寫入時間。單位為秒,精度是毫秒。
$pipe 如果請求是通過HTTP流水線(pipelined)傳送,pipe值為“p”,否則為“.”。
$request_length 請求的長度(包括請求行,請求頭和請求正文)。
$request_time 請求處理時間,單位為秒,精度毫秒; 從讀入客戶端的第一個位元組開始,直到把最後一個字元傳送給客戶端後進行日誌寫入為止。

open_log_file_cache引數
1.max:設定快取中的最大檔案描述符數量,如果快取被佔滿,採用LRU演算法將描述符關閉。
2.inactive:設定存活時間,預設是10s
3.min_uses:設定在inactive時間段內,日誌檔案最少使用多少次後,該日誌檔案描述符記入快取中,預設是1次
4.valid:設定檢查頻率,預設60s

rewrite

1.break:停止處理當前的ngx_http_rewrite_module偽指令集。
2.if:評估指定的條件。 如果為true,那麼在大括號中指定的模組指令將被執行,並且請求被分配在if指令內部的配置。 if指令內的配置繼承自先前的配置級別。
3.return:停止處理並將指定的程式碼返回給客戶端。
4.rewrite:如果指定的正則表示式匹配請求URI,那麼將按照替換字串中指定的方式更改URI。 重寫指令按照它們在配置檔案中的出現順序執行。 可以使用標誌來終止指令的進一步處理。 如果替換字串以“http://”“https://”“$ scheme”開頭,則處理停止,並將重定向返回給客戶端。
5.set:設定指定變數的值。 該值可以包含文字,變數及其組合。
6.uninitialized_variable_warn:控制是否記錄警告未初始化的變數。

if使用

1.變數名;如果變數的值為空字串或“0”,則為false;在版本1.0.1之前,以“0”開頭的任何字串被視為false值。
2.使用“=”和“!=”運算子將變數與字串進行比較;
3.~:模式匹配,區分字元大小寫;~*:模式匹配,不區分字元大小寫;!~:模式不匹配,區分字元大小寫;!~*: 模式不匹配,不區分字元大小寫;
4.使用“-f”和“!-f”運算子檢查檔案存在;
5.使用“-d”和“!-d”運算子檢查目錄存在;
6.使用“-e”和“!-e”運算子檢查檔案,目錄或符號連結是否存在;
7.使用“-x”和“!-x”運算子檢查可執行檔案。

rewrite使用

1.last:停止處理當前的ngx_http_rewrite_module指令集,並開始搜尋與更改的URI匹配的新位置;
2.break:停止處理當前的ngx_http_rewrite_module指令集,如同break指令一樣;
3.redirect:返回具有302程式碼的臨時重定向; 如果替換字串不以“http://”“https://”“$ scheme”開頭,則使用;
4.permanent:返回301程式碼的永久重定向。

舉例
多目錄轉成引數:
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)\.domain\.com) {
set $sub_name $1;   
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}

目錄對換
/123456/xxxx -> /xxxx?id=123456

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

例如下面設定nginx在使用者使用ie的使用重定向到/nginx-ie目錄下:

if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}

目錄自動加“/”

if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}

將多級目錄下的檔案轉成一個檔案,增強seo效果
/job-123-456-789.html 指向/job/123/456/789.html

rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

https://xuexb.com/html/nginx-url-rewrite.html
http://www.tiyee.net/post/122
http://blog.c1gstudio.com/archives/434

fastcgi

1.fastcgi_pass:設定FastCGI伺服器的地址。 地址可以指定為域名或IP地址和埠:fastcgi_pass localhost:9000。如果域名解析為多個地址,則所有這些地址都將以迴圈方式使用。 此外,可以將地址指定為伺服器組。
2.fastcgi_index:在$ fastcgi_script_name變數的值中設定將附加在以斜槓結尾的URI後面的檔名。 例如,使用這些設定和“/page.php”請求,SCRIPT_FILENAME引數將等於“/home/www/scripts/php/page.php”,對於“/”請求,它將等於“/home/www/scripts/php/index.php“
3.fastcgi_param:設定應傳遞到FastCGI伺服器的引數。 該值可以包含文字,變數及其組合。 當且僅當沒有在當前級別上定義fastcgi_param偽指令時,這些偽指令才繼承自上一級。
4.fastcgi_cache_path:設定快取的路徑和其他引數。 快取資料儲存在檔案中。 快取記憶體中的金鑰和檔名都是將MD5函式應用於代理URL的結果。 levels引數定義快取的層次結構級別:從1到3,每個級別接受值1或2.例如,在以下配置中:fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;快取中的檔名將如下所示:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
5.fastcgi_cache:定義用於快取的共享記憶體區域。 同一區域可以在幾個地方使用。 引數值可以包含變數(1.7.9)。 off引數禁用從先前配置級別繼承的快取。
6.fastcgi_cache_key:定義用於快取的鍵。
7.fastcgi_cache_methods:如果客戶端請求方法列在此指令中,那麼響應將被快取。 “GET”和“HEAD”方法總是新增到列表中,但建議明確指定它們。
8.fastcgi_cache_min_uses:設定在其後響應將被快取的請求數。
9.fastcgi_cache_use_stable:確定在與FastCGI伺服器通訊期間發生錯誤時,可以使用過時快取響應的情況。預設禁用。
10.fastcgi_cache_valid:設定不同響應程式碼的快取時間。
11.fastcgi_connect_timeout:定義與FastCGI伺服器建立連線的超時。 應該注意,該超時通常不能超過75秒。
12.fastcgi_send_timeout:設定將請求傳送到FastCGI伺服器的超時。 超時僅在兩個連續的寫操作之間設定,而不是用於傳輸整個請求。 如果FastCGI伺服器在此時間內未收到任何內容,則連線將關閉。
13.fastcgi_read_timeout:定義從FastCGI伺服器讀取響應的超時。 超時僅在兩個連續讀取操作之間設定,而不是用於傳輸整個響應。 如果FastCGI伺服器在此時間內未傳輸任何內容,則連線將關閉。
14.fastcgi_buffer_size:設定用於讀取從FastCGI伺服器接收的響應的第一部分的緩衝區大小。 這部分通常包含一個小的響應報文header。 預設情況下,緩衝區大小等於一個記憶體頁。是4K或8K,取決於平臺。 然而,它可以做得更小。
15.fastcgi_buffers:設定用於從FastCGI伺服器讀取單個連線的響應的緩衝區的數量和大小。 預設情況下,緩衝區大小等於一個記憶體頁。 是4K或8K,取決於平臺。
16.fastcgi_busy_buffers_size:當啟用來自FastCGI伺服器的響應緩衝時,限制可能響應報文尚未完全讀取而忙於向客戶端傳送響應的緩衝區的總大小。 同時,其餘緩衝區可用於讀取響應,並且如果需要,緩衝對臨時檔案的響應的一部分。 預設情況下,大小受限於由fastcgi_buffer_size和fastcgi_buffers指令設定的兩個緩衝區的大小。
17.fastcgi_buffering:啟用或禁用來自FastCGI伺服器的響應報文緩衝。
18.fastcgi_temp_file_write_size:當啟用從FastCGI伺服器到臨時檔案的響應緩衝時,限制寫入臨時檔案的資料大小。 預設情況下,大小受限於由fastcgi_buffer_size和fastcgi_buffers指令設定的兩個緩衝區。 臨時檔案的最大大小由fastcgi_max_temp_file_size指令設定。
19.fastcgi_max_temp_file_size:當啟用來自FastCGI伺服器的響應緩衝,並且整個響應不適合由fastcgi_buffer_size和fastcgi_buffers指令設定的緩衝區時,響應的一部分可以儲存到臨時檔案。 此偽指令設定臨時檔案的最大大小。 一次寫入臨時檔案的資料大小由fastcgi_temp_file_write_size指令設定。
20.fastcgi_temp_path:定義用於儲存具有從FastCGI伺服器接收的資料的臨時檔案的目錄。 最多可以在指定目錄下使用三級子目錄層次結構。

舉例

http {
    include       mime.types;
    default_type  application/octet-stream;
	sendfile        on;
	keepalive_timeout  65;
	fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgicache:10m;
	server {
        listen       80;
        server_name  www.a.com;
		location / {
		root html;
		index  index.html index.htm;
		}
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_cache  fcgicache;
            fastcgi_cache_key $request_uri;
            fastcgi_cache_valid 200 302 10m;
            fastcgi_cache_valid 301      1h;
            fastcgi_cache_valid any      1m;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
沒有啟用快取的測試:
# ab -c 100 -n 1000 http://www.a.com/info.php
···
Requests per second:    1299.63 [#/sec] (mean)
Time per request:       76.945 [ms] (mean)
Time per request:       0.769 [ms] (mean, across all concurrent requests)
Transfer rate:          48288.03 [Kbytes/sec] received
···
啟用快取的測試:
# ab -c 100 -n 1000 http://www.a.com/info.php
...
Requests per second:    7686.87 [#/sec] (mean)
Time per request:       13.009 [ms] (mean)
Time per request:       0.130 [ms] (mean, across all concurrent requests)
Transfer rate:          285607.67 [Kbytes/sec] received
...

注意
1.建立快取最少需要定義四個指令:fastcgi_cache_path、fastcgi_cache_key、fastcgi_cache_valid、fastcgi_cache。
2.快取定義的目錄需要手動建立。

反向代理

1.proxy_pass:設定代理伺服器的協議和地址以及應對映位置的可選URI。 作為協議,可以指定“http”或“https”。
2.proxy_set_header:用於proxy server向backend server發請求報文時,將某請求首部重新賦值,或在原有值後面新增一個新的值; 也可以新增自定義首部;
3.proxy_cache_path:設定快取的路徑和其他引數。 快取資料儲存在檔案中。 快取記憶體中的檔名是將MD5函式應用於快取記憶體金鑰的結果。 levels引數定義快取的層次結構級別:從1到3,每個級別接受值1或2.
4.proxy_cache_key:定義用於快取的鍵。
5.proxy_cache_valid:設定不同響應程式碼的快取時間。
6.proxy_connect_timeout:定義與代理伺服器建立連線的超時。 應該注意,該超時通常不能超過75秒。
7.proxy_send_timeout:設定將請求傳輸到代理伺服器的超時。 超時僅在兩個連續的寫操作之間設定,而不是用於傳輸整個請求。 如果代理伺服器在此時間內未收到任何內容,則連線將關閉。
8.proxy_read_timeout:定義從代理伺服器讀取響應的超時。 超時僅在兩個連續讀取操作之間設定,而不是用於傳輸整個響應。 如果代理伺服器在此時間內未傳送任何內容,則連線將關閉。
9.proxy_buffer_size:設定用於讀取從代理伺服器接收的響應的第一部分的緩衝區大小。 這部分通常包含一個小的響應頭。 預設情況下,緩衝區大小等於一個記憶體頁。 這是4K或8K,取決於平臺。 然而,它可以做得更小。
10.proxy_buffering:啟用或者禁用proxy 緩衝。
11.proxy_buffers:設定用於從代理伺服器讀取單個連線的響應的緩衝區的數量和大小。 預設情況下,緩衝區大小等於一個記憶體頁。 這是4K或8K,取決於平臺。
12.proxy_busy_buffers_size:當啟用來自代理伺服器的響應緩衝時,限制可能忙於向客戶端傳送響應的緩衝區的總大小,而響應尚未完全讀取。 同時,其餘緩衝區可用於讀取響應,並且如果需要,緩衝對臨時檔案的響應的一部分。 預設情況下,大小受由proxy_buffer_size和proxy_buffers指令設定的兩個緩衝區的大小的限制。
13.proxy_cache_methods:如果客戶端請求方法列在此指令中,那麼響應將被快取。 “GET”和“HEAD”方法總是新增到列表中,但建議明確指定它們。 另請參見proxy_no_cache指令。
14.proxy_no_cache:定義響應不會儲存到快取的條件。 如果字串引數的至少一個值不為空,並且不等於“0”,則不會儲存響應。
15.proxy_cache_min_uses:設定在其後響應將被快取的請求數。

舉例
proxy_pass後面的路徑不帶uri時,其會將location的uri傳遞給後端的主機;下面的示例會將/uri/傳遞給backend伺服器;

location  /uri/ {
	proxy_pass http://hostname;
}

proxy_pass後面的路徑是一個uri時,其會將location的uri替換為後端主機自己的uri;

location  /uri/ {
	proxy_pass http://hostname/new_uri/;
}

如果location定義其uri時使用的正則表示式模式匹配,則proxy_pass後的路徑不能夠使用uri;

location  ~*  \.(jpg|gif|jpeg)$  {
	proxy_pass  http://HOSTNAME;
}

此處的http://HOSTNAME後面不能有任何uri,哪怕只有/也不可以;

關於快取相關的配置:

proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=proxycache:10m;
location / {
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;
proxy_cache_valid any      1m;
proxy_pass http://192.168.0.201/bbs/;
index  index.html index.htm;
}
中間重新載入配置在訪問頁面進行快取。
# ll /var/cache/nginx/proxy/
總用量 0
drwx------ 4 nginx nginx 24 2月  20 00:12 9

負載均衡

1.server:定義伺服器的地址和其他引數。 可以將地址指定為域名或IP地址,具有可選埠或作為在“unix:”字首後指定的UNIX域套接字路徑。 如果未指定埠,則使用埠80。 解析為多個IP地址的域名會一次定義多個伺服器。
2.hash:指定伺服器組的負載平衡方法,其中客戶端 - 伺服器對映基於雜湊鍵值。 鍵可以包含文字,變數及其組合。 請注意,從組中新增或刪除伺服器可能會導致將大多數金鑰重新對映到不同的伺服器。
3.ip_hash:指定組應使用負載平衡方法,其中請求根據客戶端IP地址分佈在伺服器之間。 客戶端IPv4地址的前三個八位位元組或整個IPv6地址用作雜湊金鑰。 該方法確保來自同一客戶端的請求將始終傳遞到同一伺服器,除非此伺服器不可用。 在後一種情況下,客戶端請求將被傳遞到另一個伺服器。 最可能的是,它將始終是相同的伺服器。
4.keepalive:啟用與上游伺服器的連線的快取。connections引數設定儲存在每個工作程序的快取中的上游伺服器的空閒keepalive連線的最大數量。 當超過此數量時,最近使用的最少連線將關閉。應該特別注意的是,keepalive偽指令不限制nginx工作程序可以開啟的到上游伺服器的連線的總數。 連線引數應設定為足夠小,以允許上游伺服器處理新的傳入連線。

server引數
1.weight=number:設定伺服器的權重,預設為1。
2.max_fails=number:設定應在fail_timeout引數設定的持續時間內與伺服器通訊的失敗嘗試次數,以考慮伺服器在fail_timeout引數設定的持續時間內不可用。 預設情況下,失敗嘗試次數設定為1.零值禁用嘗試計數。
3.fail_timeout=time:與伺服器通訊的指定次數的失敗嘗試發生在考慮伺服器不可用的時間。以及伺服器將被視為不可用的時間段。預設情況下,引數設定為10秒。
4.backup:將伺服器標記為備份伺服器。 當主伺服器不可用時,將傳遞請求。
5.down將伺服器標記為永久不可用。

訪問控制

1.limit_conn:設定共享記憶體區域和給定鍵值的最大允許連線數。 當超出此限制時,伺服器將返回503(服務臨時不可用)錯誤以回覆請求。
2.limit_conn_log_level:設定伺服器限制連線數時所需的日誌記錄級別。
3.limit_conn_status:設定要響應拒絕的請求返回的狀態程式碼。
4.limit_conn_zone:設定將保持各種鍵的狀態的共享記憶體區域的引數。特別地,該狀態包括當前連線數。鍵可以包含文字,變數及其組合。不計入具有空鍵值的請求。
5.limit_req:設定共享記憶體區域和請求的最大突發大小。 如果請求速率超過為區域配置的速率,則它們的處理被延遲,使得以定義的速率處理請求。 過多的請求被延遲,直到它們的數量超過最大突發大小,在這種情況下,請求以錯誤503(服務臨時不可用)結束。 預設情況下,最大突發大小等於零。
6.limit_req_log_level:為伺服器由於速率超過或拒絕請求處理而拒絕處理請求的情況設定所需的日誌記錄級別。 延遲的日誌級別比拒絕的日誌級別低一個點; 例如,如果指定了“limit_req_log_level notice”,則會使用資訊級別記錄延遲。
7.limit_req_status:設定要響應拒絕的請求返回的狀態程式碼。
8.limit_req_zone:設定將保持各種鍵的狀態的共享記憶體區域的引數。 特別地,該狀態儲存當前的過多請求數。 鍵可以包含文字,變數及其組合。 不計入具有空鍵值的請求。
9.limit_except:對指定範圍之外的其它的方法進行訪問控制; 方法引數可以是以下之一:GET,HEAD,POST,PUT,DELETE,MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK或PATCH。
10.limit_rate:限制客戶端每秒鐘所能夠傳輸的位元組數,預設為0表示無限制; 速率以位元組/秒指定。這是對每個請求設定限制,因此如果客戶端同時開啟兩個連線,則總速率將是指定限制的兩倍。
11.limit_rate_after:設定初始量,在此之後,對客戶端的響應的進一步傳輸將受到速率限制。
12.internal:指定給定位置只能用於內部請求。 * 對於外部請求,返回客戶端錯誤404(找不到)。

舉例

客戶端請求限制

location /download {
limit_except GET {
  allow 192.168.0.220;
  deny all;
}
}

下載速度限制

location /download {
limit_rate 20480;
}
# wget http://www.a.com/download/test.img
--2017-02-12 01:19:55--  http://www.a.com/download/test.img
正在解析主機 www.a.com (www.a.com)... 192.168.0.220
正在連線 www.a.com (www.a.com)|192.168.0.220|:80... 已連線。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:209715200 (200M) [application/octet-stream]
正在儲存至: “test.img”

 0% [                                                                                                                                                    ] 245,760     20.0KB/s 剩餘 2h 50m

請求連線數限制
以下配置將限制每個客戶端IP與伺服器的連線數,同時限制與虛擬伺服器的連線總數:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

請求速率限制
以下配置將限制來自單個IP地址的請求的處理速率,同時限制虛擬伺服器的請求處理速率:

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}

速率在每秒請求數(r/s)中指定。如果需要每秒小於一個請求的速率,則在每分鐘請求中指定(r/m)。例如,每秒半請求為30r/m。

如果不希望在請求受限時延遲過多的請求,則應使用引數nodelay。

快取

1.open_file_cache:配置nginx儲存下面內容的快取 檔案描述符、檔案大小和最近一次的修改時間;開啟的目錄結構;沒有找到的或者沒有許可權操作的檔案資訊。
2.open_file_cache_errors:是否快取找不到路徑的檔案,或者沒有許可權訪問的檔案相關資訊。
3.open_file_cache_min_uses:設定由open_file_cache指令的inactive引數配置的時間段內檔案訪問的最小數量。
4.open_file_cache_valid:每隔多久檢查一次快取項的有效性。
舉例

open_file_cache max=100000 inactive=20s;  
open_file_cache_valid 30s;  
open_file_cache_min_uses 2;  
open_file_cache_errors on;  

引數說明:
1.max:表示可以快取的最大條目上限,一旦達到則會使用LRU演算法清除最近最少使用的快取項。
2.inactive:在指定的時長內沒有被訪問過的快取項為非活動快取項,直接刪除。
3.off:禁用快取。

gzip壓縮

1.gzip:啟用或者停用gzip壓縮響應。
2.gzip_buffers:設定用於壓縮響應的緩衝區數量和大小。
3.gzip_comp_level:設定gzip壓縮級別。接受的的值為1~9之間。
4.gzip_disable:為指定的客戶端禁用gzip功能。我們設定成IE6或者更低版本以使我們的方案能夠廣泛相容。
5.gzip_min_length:設定gzip壓縮的最小長度。長度僅根據“Content-Length”響應頭欄位確定。
6.gzip_http_version:設定壓縮響應所需的請求的最小HTTP版本。
7.gzip_proxied:根據請求和響應啟用或者禁用代理請求響應的gzip壓縮。
8.gzip_types:除了“text/html”之外,還允許為指定的MIME型別使用gzip壓縮。
9.gzip_vary:如果指令gzip,gzip_static或gunzip處於活動狀態,則啟用或禁用插入“Vary:Accept-Encoding”響應頭欄位。

舉例

    gzip               on;
    gzip_buffers       32 8k;
    gzip_comp_level     6;
    gzip_disable       "msie6";
    gzip_min_length    1k;
    gzip_http_version  1.1;
    gzip_proxied       any;
    gzip_types         text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_vary          on;

關於gzip_proxied指令的引數說明:
1.off:禁用所有代理請求的壓縮,忽略其他引數;
2.expired:如果響應頭包括具有禁用快取的值的“Expires”欄位,則啟用壓縮;
3.no-cache:如果響應頭包括具有“no-cache”引數的“Cache-Control”欄位,則啟用壓縮;
4.no-store:如果響應頭包括具有“no-store”引數的“Cache-Control”欄位,則啟用壓縮;
5.private:如果響應頭包括具有“private”引數的“Cache-Control”欄位,則啟用壓縮;
6.no_last_modified:如果響應頭不包括“Last-Modified”欄位,則啟用壓縮;
7.no_etag:如果響應報頭不包括“ETag”欄位,則啟用壓縮;
8.auth:如果請求頭包括“授權”欄位則啟用壓縮;
9.any:啟用對所有代理請求的壓縮。

auth_basic、stub_status模組

1.auth_basic:啟用使用“HTTP Basic Authentication”協議驗證使用者名稱和密碼。
2.auth_basic_user_file:指定驗證的使用者名稱和密碼。一般是用htpasswd生成使用者和密碼。
3.stub_status:顯示nginx基本狀態資訊。
各狀態說明
1.Active connections:當前客戶端連線數,包括等待連線。
2.accepts:接受的客戶端連線的總數。
3.handled:處理的連線的總數。 通常,引數值與accept相同,除非已達到某些資源限制(例如,worker_connections限制)。
4.requests:客戶端請求的總數。
5.Reading:nginx正在讀取請求頭的當前連線數。
6.Writing:nginx正在將響應寫回客戶端的當前連線數。
7.Waiting:等待請求的空閒客戶端連線的當前數量。

舉例

        location /nginx_status {
        auth_basic   nginx_status;
        auth_basic_user_file .nginx_user;
        stub_status;
        }
# cat /etc/nginx/.nginx_user 
bols:$apr1$nD1i394h$QZYXyYD1AO5wUgakx9N7X.		
# curl -u bols:bols http://www.study.com/nginx_status
Active connections: 1 
server accepts handled requests
 19 19 34 
Reading: 0 Writing: 1 Waiting: 0 		

優化

main段

1.worker_cpu_affinity:針對多核CPU設定將nginx的worker程序繫結在指定的cpu上。繫結的CPU還是會執行別的程序,如果想要將CPU的核心只執行nginx的worker程序,需要使用taskset命令進行設定。在新版本的1.10中此選項可以使用auto讓其自動繫結。
2.worker_priority:定義worker程序的優先順序,負數意味著級別高,一般是在-20~19之間選擇。一般不建議設定此選項。
3.worker_processes:worker程序的數量,一般是CPU核心數量減1,在新版本1.10可以設定成auto實現自行設定。
4.worker_rlimit_nofile:指定一個worker程序開啟的最多檔案控制代碼數。

event段

1.accept_mutex:worker接收請求時的負載均衡鎖,啟用時可以讓worker程序輪流、序列化的接受請求。否則則向所有worker程序通知請求。使用此選項可以避免出現驚群現象,但是如果worker程序比較少則可以不開啟此選項。
2.accept_mutex_delay:如果啟用accept_mutex選項則此選項是指定如果另一個worker程序接受連線的最長時間。
3.multi_accept:如果禁用此選項則worker程序會一次接受一個連線,否則worker程序將接受所有新連線。
4.use:指定使用處理連線的方法。一般不指定有nginx自己選擇。
5.worker_connections:一個worker程序所能夠響應的最大請求數量。則設定此選項是還需要考慮worker_rlimit_nofile選項的限制。

網路連線

1.keepalive_disable:指定禁用那種瀏覽器使用keepalive功能。設定成msie6則在收到POST請求時時禁用,設定成safari則禁用OS x系統的Safari瀏覽器的保持功能。
2.keepalive_requests:在keepalive連線上所允許請求的最大資源數。
3.keepalive_timeout:設定keepalive連線的 超時時間。
4.tcp_nodelay:nginx不要快取資料,而是一段一段的傳送。當需要及時傳送資料時就應該設定這個選項,這樣傳送一個小資料塊資訊時就不能立即得到返回值。
5.tcp_nopush:在一個數據包中傳送所有標頭檔案,而不是一個接一個的傳送。
6.client_body_timeout:定義讀取客戶端請求報文body的超時時間。超時時間僅設定在兩個連續讀取操作之間的時間,而不是用於傳輸整個請求體。如果客戶端在此時間內未傳送任何內容,則會將408(請求超時)錯誤返回給客戶端。
7.send_time:傳送響應報文的超時時長。僅在兩個連續的寫操作之間設定,而不是用於傳輸整個響應。如果客戶端在此時間內未收到任何內容,則連線關閉。
8.clent_header_timeout:定義讀取客戶端請求報文header的超時。 如果客戶端在此時間內未傳輸整個頭,則會向客戶端返回408(請求超時)錯誤。
9.reset_timeout_connection:啟用或禁用重置超時連線。 復位如下進行。 在關閉套接字之前,將對其設定SO_LINGER選項,其超時值為0.當套接字關閉時,TCP RST將傳送到客戶端,並釋放此套接字佔用的所有記憶體。 這有助於避免使已填充緩衝區的已關閉套接字長時間處於FIN_WAIT1狀態。應注意,超時keep-alive 連線正常應該關閉。

記憶體和磁碟資源分配

1.client_body_buffer_size:設定用於讀取客戶端請求報文body的緩衝區大小。當請求報文body大於緩衝區大小整個整個主體部分寫入到臨時檔案中。32位系統預設是8k,在64位系統中是16k。
2.client_body_in_file_only:指定是否將客戶端的請求報文儲存到檔案中,該指令一般是在除錯中使用。
3.clinet_body_in_single_buffer:指定是否將客戶端的請求報文儲存在單個緩衝區中。
4.client_body_temp_path:指定客戶端請求報文的臨時存放目錄。目錄可以使用三級子目錄形式。
5.client_header_buffer_size:指定客戶端請求報文的header的緩衝區大小。大多數情況下預設的1k已經足夠使用,如果請求包括長cookie或者來自WAP客戶端就需要進行調整。如果請求報文中不適合則由large_client_header_buffers指令進行配置緩衝區大小。
6.client_max_body_size:設定在客戶端的請求報文的body中“Content-Length”欄位的最大允許大小。如果請求大小超過此大小則會報413錯誤。設定為0將禁用對客戶機請求正文大小的檢查。
7.large_client_header_buffers:設定客戶端請求報文header的緩衝區最大數量和大小。請求行不能超過一個緩衝區的大小,超過則會顯示414(Request-URI Too Large)錯誤返回到客戶端。 請求報文header欄位也不能超過一個緩衝區的大小,超過則會顯示400(Bad Request)錯誤返回到客戶端。

檔案傳輸

1.aio:啟用或者禁用非同步檔案I/O。如果啟用aio則還需要設定directio。
2.directio:讀取大於或者等於指定大小的檔案是允許使用directio方式傳輸。
3.sendfile:啟用或者禁用sendfile()傳輸檔案。
4.sendfile_max_chunk:當設定為非0時限制單個sendfile()呼叫中傳輸的資料量。
5.output_buffers:設定用於從磁碟讀取響應報文的緩衝區數量和大小。

sendfile工作說明

在傳統的檔案傳輸read()、write()中其具體工作流程如下:呼叫read()把檔案資料copy到內容緩衝區中-->read()將資料從核心緩衝區copy到使用者緩衝區中-->write()將檔案資料從使用者的緩衝區中copy到核心與socket相關的緩衝區中-->檔案資料從socket緩衝封裝好報文響應併發送。

上面的流程可以簡化成如下:
硬碟-->核心buf-->使用者buf-->核心socket相關緩衝區-->協議引擎

而使用sendfile()進行傳輸則不會在把資料copy到使用者空間,而是直接從核心緩衝區進行操作,具體工作流程如下:
sendfile()系統呼叫,檔案資料copy到核心緩衝區-->資料從核心緩衝區到socket相關的緩衝區-->最後從socket相關的緩衝區copy到協議引擎

sendfile、aio使用說明

在使用AIO時需要設定directio選項,並且aio生效則sendfile就不會使用。在Linux中要麼使用aio讀取到緩衝區,要麼用sendfile直接傳送兩者不可同時使用。
在配置directio時是針對每個請求檔案大小而決定是否開啟directio。例如我們設定成:directio 5m;。此選項說明如果檔案小於5m則使用sendfile進行傳輸,而directio則會禁用從而aio也不會使用。如果傳輸的檔案大於或者等於5m那麼將啟用directio,從而aio生效,而sendfile並不生效。
這種設計貌似剛好把linux下aio和sendfile兩種機制的優點很好的結合起來使用。對於大檔案採用aio,節省cpu,而對於小檔案,採用sendfile,減少拷貝;並且對於大檔案aio採用directio,避免擠佔檔案系統快取,讓檔案系統快取更多的小檔案。 從理論上來看,這種配置比較適合系統記憶體有限、小檔案請求比較多、間隔有幾個大檔案請求的Web環境;如果記憶體足夠大,那麼應該充分利用檔案系統快取,而directio使得aio無法使用快取是衡量最終是否需要採用aio的一個需要仔細考慮的因素;

header過濾

1.ignore_invalid_headers:控制是否應忽略具有無效名稱的header欄位。 有效名稱由英文字母,數字,連字元以及可能的下劃線組成(由underscores_in_headers指令控制)。如果在伺服器級別指定了偽指令,那麼只有在伺服器是預設值時才使用該值。 指定的值也適用於偵聽相同地址和埠的所有虛擬伺服器。
2.underscores_in_headers:啟用或禁用在客戶端請求報文header欄位中使用下劃線。 當禁用下劃線的使用時,其名稱包含下劃線的請求標題欄位將被標記為無效,並受到ignore_invalid_headers指令的約束。如果在伺服器級別指定了偽指令,那麼只有在伺服器是預設值時才使用該值。 指定的值也適用於監聽相同地址和埠的所有虛擬伺服器。

HTTP頭是可以包含英文字母([A-Za-z])、數字([0-9])、連線號(-)hyphens, 也可義是下劃線(_)。在使用nginx的時候應該避免使用包含下劃線的HTTP頭。主要的原因有以下2點。
1.預設的情況下nginx引用header變數時不能使用帶下劃線的變數。要解決這樣的問題只能單獨配置underscores_in_headers on。
2.預設的情況下會忽略掉帶下劃線的變數。要解決這個需要配置ignore_invalid_headers off。

當然,nginx設定變數的時候是沒有任何這樣的限制的,可以直接設定帶下劃線的header。但是最好不要這樣做。在使用nginx做多級代理的時候,也需要注意一些header不要重複設定。比如用來儲存使用者IP的這個header只在最上層的nginx裡配置就行,後面的nginx不要重複設定導致覆蓋。

安全

1.disable_symlinks:確定開啟檔案時應該如何處理符號連結。

  • off:路徑名中的符號連結是允許的,不檢查。這是預設行為。
  • on:如果路徑名的任何元件是符號連結,則拒絕對檔案的訪問。
  • if_not_owner:如果路徑名的任何元件是符號連結,並且連結指向的連結和物件具有不同的所有者,則拒絕對檔案的訪問。
  • from=part:當檢查符號連結(引數on和if_not_owner)時,通常會檢查路徑名的所有元件。通過另外指定from = part引數可以避免檢查路徑名的初始部分中的符號連結。在這種情況下,只從指定的初始部分後面的路徑名元件檢查符號連結。如果值不是選中的路徑名的初始部分,則將檢查整個路徑名,如同完全未指定此引數一樣。如果值與整個檔名匹配,則不檢查符號連結。引數值可以包含變數。

2.server_token:啟用或禁用在錯誤訊息和“Server”響應頭欄位中發出nginx版本。

https://segmentfault.com/a/1190000007897976
https://my.oschina.net/wmy596/blog/693898
http://www.cnblogs.com/leezhxing/p/4374035.html
http://pmghong.blog.51cto.com/3221425/1178836
https://github.com/qiwsir/ITArticles/blob/master/Nginx/配置效能優化的方法.md
https://www.zybuluo.com/ty4z2008/note/290139
http://www.z-dig.com/nginx-optimization-25.html
https://mos.meituan.com/library/30/how-to-optimize-nginx/