http 核心模塊相關
性能優化
worker_processes
用於指定 worker 進程數, 定義規則 不大於CPU核心數, auto表示動態獲取.
worker_processes auto;
worker_cpu_affinity
worker 進程綁定指定的 cpu ,如果機器單跑 nginx 可以綁定,如果不是不建議綁定.可以使用 cpu mask,或者 auto.
# 例如 四個 worker 進程綁定在 四個 cpu上. worker_cpu_affinity 0001 0010 0100 1000; # 使用 ps 命令 動態觀測 watch -n.5 'PS axo comm,pid,psr | grep nginx'
worker_rlimit_nofile
定義能夠打開的文件數量上限.同時要修改 系統打開文件數上限 /etc/security/limits.conf.
默認為 65535
worker_rlimit_nofile 65535;
調試定位相關
user
定義 nginx 運行的用戶和組.
user nginx nginx;
daemon
定義 nginx 是否以守護進程方式運行,默認為 on.
daemon on;
master_process
是否以 master/worker 模式運行 Nignx,默認為 on.
master_process on|off;
error_log
定義 error 日志路徑 及級別.
error_log /var/log/nginx/error.log crit; # 日志級別 [ debug | info | notice | warn | error | crit ]
事件驅動相關
worker_connections
每個 worker 進程打開文件的上限.
最大並發數: worker_processes * worker_connection
worker_connections 10240;
use
指明連接請求的處理方法.
use epoll;
accept_mutex
處理新的連接處理方式,默認為 off.
on: 表示由各 worker 輪流處理新的請求.
off: 表示每個新的請求到達會通知所有 worker 進程,那個worker 進程搶到交由那個worker 進程處理請求.推薦.
accept_mutex off;
套接字相關
server
server 段 用來配置虛擬主機.
Context: http
server {
listen 80;
server_name www.test.com;
root /data/html;
}
listen
用來定義 虛擬主機的監聽地址及端口等信息.
Context: server
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
參數說明:
defaulr_server: 設定為默認虛擬主機.
ssl: 限制僅能夠通過ssl連接提供服務.
backlog=number: 后援隊列長度.
rcvbuf=size: 接收緩沖區的大小;
sndbuf=size: 發送緩沖區的大小;
例:
listen *:80;
server_name
用來定義虛擬主機名稱即域名; 支持*通配符,支持~起始字符做正則表達式匹配.
Context: server
匹配機制:
1) 首先是字符串的精確匹配
2) 左側*通配符;
3) 右側*通配符;
4) 正則表達式;
server_name www.text.com;
server_name ~^www\d+\.baidu.com$
tcp_nodelay
只有在保持連接長連接有效,即 keepalived 模式下有效.元數據如果很小則合並多個數據打包延遲到達.提高網絡性能.
Context:http, server, location
tcp_nodelay on;
tcp_nopush
只有使用 sendfile 時起到作用.把響應報文首部和整合文件的起始內容放到一個報文中發送,利用完整的報文發送文件,而不是分開發送,等待用戶空間打包好發送數據.
Context:http, server, location
tcp_nopush on;
sendfile
啟用 sendfile 功能.
Context:http, server, location, if in location
sendfile on;
路徑相關
root
設置 WEB 資源路徑映射,用於指明用戶請求的 uri 所對應的本地文件系統上的文檔目錄.
root /data/heml;
location
根據請求的 uri 來做訪問設置,
在一個 server 中 location 段可配置多個.從而實現從 uri 到文件系統的路徑映射,nginx 會根據用戶請求的 uri 來檢查定義的所有location 並找出一個最佳匹配,而后應用其他配置.
匹配規則:
| 符號 | 說明 |
| = | 對URI 做精確匹配 |
| ~ | 對 URI 做正則表達式匹配,區分字符大小寫. |
| ~* | 對 URI 做正則表達式匹配,不區分字符大小寫. |
| ^~ | 對 URI 的做半部分左匹配檢查,不區分字符大小寫. |
| 不帶符號 | 匹配起始於此URI 的所有URL. |
匹配優先級:
= ,^~,~/~* 不帶符號;
alias
設置別名.定義路徑別名,文檔映射的另一種機制,僅能在 location 上下文中設置.
注意:
location 中使用 root 指令和 alias 指令的意義不同
1) root 給定的路徑對應於 location中的 /url/左側的/;
2) alias 給定的路徑對應於 location 中的 /url/右側的;
location ^~ /images/ {
alias /data/img/
}
http://192.168.1.10/images/test1.jpg 相當於訪問服務器 /data/img/ 目錄下面的 test.jpg 文件
ocation ^~ /images/ {
root /data/img/
}
http://192.168.1.10/images/test1.jpg 相當於訪問服務器 /data/img/images/ 目錄下面的 test.jpg 文件
index
默認資源設置.
error_page
當客戶端訪問出錯時定義返回的頁面.
error_page 404 400 /notfound.html
location = /notfound.html {
root /data/nginx;
}
客戶端請求相關
keepalive_timeout
設置保持連接的超時時長, 0 表示禁止長連接,默認為75s.
keepalive_timeout 15s;
keepalive_requests
在一個長連接上請求的資源的最大值,默認為100;
keepalive_requests 100;
keepalive_disable
對於那種瀏覽器禁用使用長連接.
keepalive_disable msie6;
server_names_hash_bucket_size
服務器名字的hash表大小,
server_names_hash_bucket_size 128;
types_hash_max_size
為了快速尋找到相應MIME type,Nginx使用散列表來存儲MIME type與文件擴展名。types_hash_bucket_size 設置了每個散列桶占用的內存大小。
types_hash_max_size影響散列表的沖突率。types_hash_max_size越大,就會消耗更多的內存,但散列key的沖突率會降低,檢索速度就更快。types_hash_max_size越小,消耗的內存就越小,但散列key的沖突率可能上升。
types_hash_max_size 2048;
send_timeout
向客戶端發送響應報文的超時時長,此處值,兩次寫操作之間的間隔時長.
send_timeout 30s;
client_body_timeout
讀取 HTTP 包體的超時時間.默認為60秒.超時向客戶端返回408 ("Request timed out")響應。
client_header_timeout
讀取 HTTP 頭部的超時時間,默認為60秒.則認為超時,超時向客戶端返回408 ("Request timed out")響應。
reset_timeout_connection
重置超時連接項默認為 off 關閉,一般不會開啟.連接超時后將通過向客戶端發送RST包來直接重置連接。連接超時后將通過向客戶端發送RST包來直接重置連接。
client_body_buffer_size
用於接收客戶端請求報文 body 部分的緩沖區大小,默認為16k, 1k 大約可緩存 500 漢字.
如果超出此大小時將被暫存到磁盤上由 client_body_temp_path 指令定義的位置中.
client_body_temp_path
用於儲存客戶端請求發送的body 部分的臨時存儲路徑及目錄結構的數量.方便定位和路由.
client_body_buffer_size /var/tmp/client_body 1 2 2;
client_max_body_size
此指令設置NGINX能處理的最大請求主體大小。 如果請求大於指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。 如果服務器處理大文件上傳,則該指令非常重要。
client_max_body_size 1m;
client_header_buffer_size
此指令與client_body_buffer_size類似。 它為請求頭分配一個緩沖區。 如果請求頭大小大於指定的緩沖區,則使用large_client_header_buffers指令分配更大的緩沖區。
client_header_buffer_size 1m;
large_client_header_buffers
此指令規定了用於讀取大型客戶端請求頭的緩沖區的最大數量和大小。 這些緩沖區僅在缺省緩沖區不足時按需分配。 當處理請求或連接轉換到保持活動狀態時,釋放緩沖區。
large_client_header_buffers 4 8k;
客戶端限制相關
limit_rate
限制響應給客戶端的傳輸速率,單位是 bytes/cecond,0表示無限制.
limit_rate 0;
limit_execpt
限制對指定的請求方法.
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
文件操作優化
aio
異步I/O允許進程進行不受阻塞或不需要等待I/O完成的I/O操作。
aio on;
directio
在linux主機啟用O_dirECT標記,此處以為文件大於等於給定的大小時使用aio,例如 directio 4m;
directio 512;
output_buffers
設置從磁盤讀取緩沖區響應的數量和大小。如果可能,客戶端數據傳輸將被延遲,直到 Nginx 匯集到適合的數據大小。
output_buffers 132k;
open_file_cache
open_file_cache 相關配置可以緩存靜態文件的元信息,在這些靜態文件被頻繁訪問時可以顯着提升性能。
可緩存的元數據信息:
- 文件的描述符,文件大小和最近一次的修改時間.
- 打開的目錄結構.
- 沒有找到或者是沒有權限訪問的相關數據,
open_file_cache max=64 inactive=30d;
參數說明:
max: 可以緩存的緩存項上限,達到上限后會使用 LRU (最近最少使用)算法實現緩存管理.
inactive: 緩存項的非活動時長, 在此處指定的時長內未被命中的次數少於 openfile_cache_min_uses 指令所指定的次數的緩存項即為非活動項.
open_file_cache_valid
緩存項有效的檢查頻率,間隔時間,默認為 60s;
open_file_cache_errors
是否緩存查找時發生錯誤的文件一類的信息.
open_file_cache_errors on;
open_file_cache_min_user
在 open_file_cache 指令的 inactive 指定的參數的時長內, 至少應該被命中多少次訪問可被歸類為活動項,沒達到則刪除.
open_file_cache_min_uses 8;
http 常用的模塊
ngx_http_access_module
基於 IP 的訪問控制功能.
Context: http, server, location, limit_except
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
ngx_http_auth_basic_module
基於用戶訪問控制,使用 basic 機制進行用戶認證.
1. authbasic on;
2. auth_basic_user_file file;
location /admin/ {
alias /fata/nginx;
auth_basic "Admin Area"; # 提示性信息
auth_basic_user_file /etc/nginx/.ngxpasswd; # 密碼文件所在路徑
}
創建密碼文件:
yum -y install http-tools
htpasswd -c -m /etc/nginx/.ngxpasswd tom 創建訪問用戶
ngx_http_stub_status_module
用於輸出 nginx 的基本狀態信息.
輸出參數說明:
| 參數 | 說明 |
| Active connections | 活動狀態的連接數. |
| accepts | 已經接受的客戶端請求的總數. |
| handled | 已經處理完成的客戶端請求的總數, |
| requests | 客戶端發來的請求總數. |
| Reading | 處於讀取客戶端請求報文首部的連接數. |
| Writing | 處於向客戶端請求報文首部的連接數. |
| Waiting | 處於等待客戶端發出請求的空閑連接數. |
location /status/ {
stub_status;
allow 192.168.1.0/24;
deny all;
}
輸出信息如下:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
ngx_http_ssl_module
ssl 模塊
參數說明:
ssl on;
開啟ssl功能
ssl_certificate file;
當前虛擬主機使用PEM格式的證書文件/
ssl_certificate_key file;
當前虛擬主機上與其證書匹配的私鑰文件;
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl協議版本,默認后三個
ssl_session_cache off | none | [bulitin[:size]] [shared:name:size];
bulithin[:size]: 使用Openssl內奸的緩存,此緩存為每個worker 進程私有.
[shared:name:size] 在個各worker之間使用一個共享緩存, 1M 可緩存4000會話.
ssl_session_timeout time;
客戶端一側的連接可以復用 ssl session cache 中緩存的ssl參數的有效時長.
1 server { 2 listen 443 ssl; 3 server_name www.test.com; 4 access_log /var/log/nginx/test_ssl.log main; 5 6 ssl on; 7 ssl_certificate /etc/nginx/ssl/nginx.crt; 8 ssl_certificate_key /etc/nginx/ssl/nginx.key; 9 ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2; 10 ssl_session_cache shared:SSL:10m; #1M 緩存 4000 會話 11 } 12 13 創建ca證書 14 cd /etc/pki/CA 15 (umask 077;openssl genrsa -out private/cakey.pem 2048) 16 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 17 CN 18 BeiJing 19 BeiJing 20 baidu 21 devops 22 host.baidu.com 23 touch index.txt 24 echo 01 > serial 25 # 簽署 26 openssl ca -in /tmp/nginx.csr -out /etc/pki/ca/certs/nginx.crt -days 365 27 ll certs/ 28 會生成 nginx.crt 文件 29 ll newcerts 30 會生成 01.pem文件 31 scp certs/nginx.crt ip:/etc/nginx/ssl/ 32 33 34 (umask 077; openssl genrs -out nginx.key 2048) 35 openssl req -new key nginx.key -out nginx.csr 36 CN Beijing Beijing baidu devops host.baidu.com 123@123.com 37 scp nginx.csr ip/tmp/
ngx_http_log_module
nginx 訪問日志模塊.
1 log_format json '{"@timestamp":"$time_iso8601",' 2 '"host":"$server_addr",' 3 '"clientip":"$remote_addr",' 4 '"size":$body_bytes_sent,' 5 '"responsetime":$request_time,' 6 '"upstreamtime":"$upstream_response_time",' 7 '"upstreamhost":"$upstream_addr",' 8 '"http_host":"$host",' 9 '"url":"$uri",' 10 '"xff":"$http_x_forwarded_for"' 11 '"referer":"$http_referer",' 12 '"agent":"$http_user_agent",' 13 '"status":"$status"}'; 14 @timestamp: 服務器時間的ISO 8610格式 (1.3.12, 1.2.7) 15 host: 服務器端地址 16 clientip: 客戶端地址的二進制形式, 固定長度為4個字節 17 size: 傳輸給客戶端的字節數,響應頭不計算在內;這個變量和Apache的mod_log_config模塊中的“%B”參數保持兼容 18 responsetime: 處理客戶端請求使用的時間 (1.3.9, 1.2.6); 從讀取客戶端的第一個字節開始計時。 19 upstreamtime: 是指從Nginx向后端(php-cgi)建立連接開始到接受完數據然后關閉連接為止的時間。 20 upstreamhost: 保存服務器的IP地址和端口或者是UNIX域套接字的路徑。 21 http_host: 優先級如下:HTTP請求行的主機名>”HOST”請求頭字段>符合請求的服務器名 22 uri: 請求的uri 23 xff: 真實的客戶端地址 24 referer: 當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器該網頁是從哪個頁面鏈接過來的,服務器因此可以獲得一些信息用於處理。 25 agent: 獲取客戶端瀏覽器信息 26 status: 請求的狀態嗎.
配置參數:
配置階段:
log_format name string..;
string 可以使用 nginx 核心模塊及其他模塊內嵌的變量;
# 調用階段
access_log path [format] [buffer=size] [gzip=level] [flush=time] [if=condition]
access_log off;
訪問日志的文件路徑格式,及相關的緩沖區配置
buffer=size flush=time
緩存相關:
open_log_file_cache max=N [inactive=time] [min_user=N] [valid=time]
open_log_file_cache off;
對於每一條日志記錄,都將是先打開文件,再寫入日志,然后關閉。可以使用open_log_file_cache來設置日志文件緩存(默認是off),格式如下:
緩存各日志文件相關的元數據信息
max: 緩存的最大文件描述符數量;
min_uses: 在 inactive 指定的時長內訪問大於等於此值方可被當做活動項.
inactive: 非活動時長
valid: 驗證緩存中個緩存想是否為活動項的時間間隔.
open_log_file_cache max=1000 inactive=60s;
ngx_http_gzip_module
壓縮傳輸,占用 CPU 時間,解決網絡傳輸帶寬.
1) gzip on;
開啟壓縮功能.
2) gzip_buffers 16 8k;
壓縮的緩沖區大小.
3) gzip_comp_level 6;
壓縮級別,默認為1;
4) gzip_disable "MSIE [1-6]\.(?!.*SV1)";
禁止那些瀏覽器壓縮功能.
5) gzip_min_length 128;
小於128字節不壓縮
6) gzip_http_version 1.1;
只對 那些http版本進行壓縮 默認 1.1
7) gzip_proxied off | expired | no-cache | no-store | private | no_last_modifled | no_etag | auth | any....;
Nginx作為反向代理的時候啟用,根據某些請求和應答來決定是否在對代理請求的應答啟用gzip壓縮,是否壓縮取決於請求頭中的“Via”字段,指令中可以同時指定多個不同的參數,意義如下:
expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息
no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息
no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息
private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭信息
no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭信息
auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息
any - 無條件啟用壓縮
8) gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
壓縮過濾器,進隊此處設置的MIME類型的內容啟用壓縮功能,
9) gzip_vary on;
增加響應頭”Vary: Accept-Encoding”
ngx_http_rewrite_module
rewrite 地址重寫模塊, 將用戶請求的 URI 基於 regex 所描述的模式進行檢查, 然后完成替換,
rewrite
1) rewrite regex replacemen [flag]
將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的心URI;
注意:
如果在同一級配置塊中存在多個 rewrite 規則,那么會自下而下逐個檢查, 被某條件規則替換完成后,會重新一輪的替換匹配,因此隱含有循環機制;flag所表示的標志位控制此循環機制.
如果replacement是以http://或https://開頭,則替換結果會直接以重定向返回給客戶端.301 永久重定向.
[flag]
last: 重寫完成后停止對當前URI在當前location中后續的其他重寫操作,而后對新的URI啟動新一輪重新檢查,提前重新一輪循環.
break: 重寫完成后停止對當前URI在當前location 中后續的其他重寫操作,二后直接跳轉至重寫規則配置塊之后的其他配置,結束循環.
redlrect: 重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端, 由客戶端重新發起請求,不能以http://或https://開頭;
permanent: 重寫完成后以永久沖頂向方式直接返回重寫后生成新的URI給客戶端,由客戶端重新發起請求.
例:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
rewrite ^/users/(.*)$ /show?user=$1? last;
return
語法:
return code [text];
return code URL;
return URL;
Context: server, location, if
該指令一般用於對請求的客戶端直接返回響應狀態碼。在該作用域內return后面的所有nginx配置都是無效的。 可以使用在server、location以及if配置中。 除了支持跟狀態碼,還可以跟字符串或者url鏈接。
rewrite_log
是否開啟重寫日志.
rewrite_log off; Context: http, server, location, if
if
引入一個新的配置上下文,滿足條件時候,執行配置塊中的配置指令.
語法:
if (condition) { ... }
Context: server, location
condition:
比較操作符號
==
!=
~
~* 模式匹配 區分符大小寫
~! 模式匹配 不區分字符大小寫
!~* 模式不匹配 不區分字符大小寫
!~ 模式不匹配 區分字符大小寫
文件及目錄判存在性判斷;
-e,!e
-f,!f
-d, !d
-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;
}
ngx_http_referer_module
referer 模塊主要配置防盜鏈功能.
ngx_http_referer_module模塊允許攔截“Referer”請求頭中含有非法值的請求,阻止它們訪問站點。 需要注意的是偽造一個有效的“Referer”請求頭是相當容易的, 因此這個模塊的預期目的不在於徹底地阻止這些非法請求,而是為了阻止由正常瀏覽器發出的大規模此類請求。 還有一點需要注意,即使正常瀏覽器發送的合法請求,也可能沒有“Referer”請求頭。
valid_referers
定義referer 首部的合法的可用值
語法:
valid_referers none | blocked | server_names | string ...;
Context: server, location
參數說明:
none: 請求報文首部沒有referer首部.
blocked: 請求報文的referer首部沒有值.
server_name: 參數,其可以由值作為主機名或主機名模式;
arbitrary_sting: 直接字符串,但可使用* 作為通配符.
regular expression: 被指定的正則表達式匹配的字符串;要使用~開頭.例如 ~.*\.test\.com;
例:
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers blocked www.a.com;
if ($invalid_referer) {
return 403;
}
}
valid_referers none block server_names *.test.com www.test.* *~\.test\.*;
if ($valid_referers) {
return http://www.test.com;
}
