虛擬主機(jī)與請求分發(fā)
配置監(jiān)聽端口炫贤,中括號為可選參數(shù)(server)
listen address:port [ default | default_server | backlog=num rcvbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ]
default/default_server:把這個(gè)server快作為整個(gè)Web服務(wù)的默認(rèn)塊搜立。如果沒有設(shè)置恃泪,在nginx.conf中找到第一個(gè)server塊作為默認(rèn)server塊。當(dāng)一個(gè)請求無法匹配配置文件中所有主機(jī)域名時(shí),會(huì)選用默認(rèn)虛擬主機(jī)。
backlog=num:表示TCP中backlog等待隊(duì)列大小。默認(rèn)-1刀闷,表示不設(shè)置。
rcvbuf=size:表示監(jiān)聽句柄的SO_RCVBUF,套接字接收緩沖區(qū)大小涩赢。
sndbuf=size:表示監(jiān)聽句柄的SO_SNDBUF戈次,套接字發(fā)送緩沖區(qū)大小。
accept_filter:設(shè)置accept過濾器筒扒,只對FreeBSD操作系統(tǒng)有效怯邪。
deferred:就算TCP三次握手結(jié)束時(shí)內(nèi)核也不會(huì)分配worker處理,當(dāng)用戶發(fā)送數(shù)據(jù)時(shí)才分配worker處理花墩。
bind:綁定當(dāng)前端口/地址對悬秉,只有同時(shí)對一個(gè)端口監(jiān)聽多個(gè)地址時(shí)才會(huì)生效。
ssl:當(dāng)前監(jiān)聽端口必須使用ssl協(xié)議冰蘑。
配置主機(jī)名稱(server)
server_name name1 name2 ...;
處理請求時(shí)和泌,nginx會(huì)取出header中的Host,與每個(gè)server中的server_name進(jìn)行匹配祠肥,決定由哪個(gè)server處理這個(gè)請求武氓,優(yōu)先級如下:
字符串完全匹配
通配符在前面 *.testweb.com
通配符在后面 www.testweb.*
正則表達(dá)式 ~^\.testweb\.com$
如果所有server_name和Host都不匹配,就按照下面優(yōu)先級處理:
優(yōu)先選擇listen配置加入了default/default_server的server塊仇箱。
匹配listen端口的第一個(gè)server塊县恕。
重定向主機(jī)名的處理(http/server/location)
server_name_in_redirect on | off;(默認(rèn)為on)
on重定向時(shí)使用server_name配置的第一個(gè)主機(jī)名替換原先的host請求頭。off則使用請求本身的host頭部剂桥。
location模塊(server)
location [=|~|~*|^*|@] /uri/ {...}
location會(huì)根據(jù)用戶的uri來匹配上面的表達(dá)式忠烛,如果可以匹配則選擇該location處理。
匹配規(guī)則:
= 完全匹配
~ 大小寫敏感匹配
~* 大小寫不敏感匹配
^~ 以配置的uri開始的請求都會(huì)被匹配
@ nginx服務(wù)內(nèi)部重定向权逗,不直接處理用戶請求
location / {} 匹配所有請求
請求會(huì)被第一個(gè)匹配的location處理美尸。
文件路徑定義
root方式設(shè)置資源路徑(http/server/location/if)
root path;
location /download/ {
root /opt/web/html/;
}
匹配/download/index/test.html。返回/opt/web/html/download/index/test.html斟薇。
讀取文件路徑:root路徑+uri路徑
alias方式設(shè)置資源路徑(loction),與spring boot靜態(tài)資源映射類似
alias path;
location /download/ {
alias /opt/web/html/;
}
匹配/download/index/test.html师坎。返回/opt/web/html/index/test.html。
讀取文件路徑:alias路徑+(uri - location路徑)
首頁訪問(http/server/location)
index file1 file2 ...;
index index.html;(默認(rèn))
//訪問跟目錄返回首頁
location \ {
index index.html index.php;
}
HTTP返回碼重定向頁面
//重定向頁面堪滨,保留原來的返回碼胯陋。
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
error_page 403 http://example.com/forbidden.html; //重定向到另一個(gè)location
error_page 404 = @ fetch; //重定向到另一個(gè)location
//重定向頁面,返回新的的返回碼椿猎。
error_page 404 =200 /empty.gif;
error_page 404 =403 /forbidden.gif;
try_files
try_files path1 path2... uri
如果path都找不到惶岭,則重定向到uri寿弱。
TCP和Http內(nèi)存池分配(http/server)
request_pool_size
單次http連接時(shí)分配的內(nèi)存犯眠,http結(jié)束時(shí)銷毀request_pool_size。
單次tcp連接時(shí)分配connection_pool_size的內(nèi)存症革,http結(jié)束時(shí)銷毀connection_pool_size筐咧。
如果是keep-alive連接,單次TCP連接可以用于多次http請求。
網(wǎng)絡(luò)連接的設(shè)置
讀取http頭的超時(shí)時(shí)間(http/server/location)
client_header_timeout 60;(默認(rèn)60s)
客戶端與服務(wù)器建立連接后量蕊,開始接收http頭部的等待時(shí)間铺罢,超過這個(gè)時(shí)間沒有讀取到用戶發(fā)來的字節(jié),認(rèn)為超時(shí)残炮,向用戶返回408(request time out)韭赘。
讀取http包體的超時(shí)時(shí)間(http/server/location)
client_header_timeout 60;(默認(rèn)60s)
與請求頭類似,不過這是讀取包體(post放在body里)才有效势就。
發(fā)送相應(yīng)的超時(shí)時(shí)間(http/server/location)
send_timeout 60;(默認(rèn)60s)
nginx向客戶端發(fā)送了數(shù)據(jù)包泉瞻,但是客戶端沒有接收,過了這個(gè)超時(shí)時(shí)間苞冯,nginx會(huì)主動(dòng)關(guān)閉這個(gè)連接袖牙。
發(fā)送相應(yīng)的超時(shí)時(shí)間(http/server/location)
reset_timeout_connection on | off;
reset_timeout_connection off;(默認(rèn))
開啟時(shí),連接超時(shí)后不走四次揮手而是向客戶端發(fā)送RST重置連接舅锄,釋放套接字資源(例如滑動(dòng)窗口)鞭达。RST關(guān)閉連接可能會(huì)帶來一些問題。
關(guān)閉用戶連接的方式(http/server/location)
lingering_close off | on |always
lingering_close on;(默認(rèn))
always:關(guān)閉連接前必須無條件處理連接上的所有用戶發(fā)送的數(shù)據(jù)皇忿。
off:關(guān)閉連接前不理會(huì)連接上是否有準(zhǔn)備就緒的來自用戶發(fā)送的數(shù)據(jù)畴蹭。
on:一般來說關(guān)閉連接前會(huì)處理連接上用戶發(fā)送的數(shù)據(jù)。除了有些情況下業(yè)務(wù)認(rèn)定之后數(shù)據(jù)是不需要的禁添。
關(guān)閉前的超時(shí)時(shí)間(http/server/location)
lingering_timeout 5s;(默認(rèn))
在關(guān)閉前等待lingering_timeout 時(shí)間撮胧,如果沒有數(shù)據(jù)可讀,直接關(guān)閉連接老翘。如果有芹啥,則在讀取完連接緩存區(qū)的數(shù)據(jù)并丟棄后關(guān)閉連接。
lingering_time(http/server/location)
lingering_time 30;(默認(rèn))
用戶請求的content-length大于max_client_body_size配置時(shí)铺峭,nginx會(huì)返回413(request entity too large)響應(yīng)墓怀。但是很多客戶端不理會(huì),仍然會(huì)繼續(xù)上傳卫键,這時(shí)經(jīng)過lingering_time時(shí)間后傀履,此時(shí)nginx不管用戶是否在上傳都會(huì)把連接關(guān)掉。
禁用keepalive(http/server/location)
keepalive_disable [ msie6 | safari | none ]...
keepalive_disable msie6 safari;(默認(rèn))
keepalive功能是為了讓多個(gè)請求復(fù)用一個(gè)http長連接莉炉,這個(gè)功能對服務(wù)器性能提升有幫助钓账。但是例如IE6和safari,它們使用keepalive時(shí)發(fā)送post請求處理有性能問題絮宁。所以默認(rèn)IE6和safari禁止keepalive梆暮。
keepalive超時(shí)時(shí)間
MIME類型設(shè)置(http/server/location)
設(shè)置mime type到文件擴(kuò)展名的映射。多個(gè)擴(kuò)展名可以映射到同一個(gè)MIME type绍昂。
types {
text/html html;
text/html conf;
image/gif gif;
image/jpeg jpeg jpg;
}
按照請求方式限制客戶端的請求(location)
參數(shù)取值包括:GET啦粹、HEAD偿荷、POST、PUT唠椭、DELETE跳纳、MKCOL、COPY贪嫂、MOVE寺庄、OPTIONS、PROPFIND力崇、PROPPATCH铣揉、LOCK、UNLOCK或PATCH餐曹。
limit_except GET POST {
allow 192.168.1.0/32;
deny all;
}
limit_except表示允許(限制除了)逛拱,后面配置的請求方式,限制其他的方式台猴。注意朽合,允許GET將自動(dòng)允許HEAD,反過來也一樣饱狂。
HTTP包體請求最大值(http/server/location)
client_max_body_size size;
client_max_body_size 1m;
瀏覽器發(fā)送含有較大HTTP包體的請求時(shí)曹步,頭部會(huì)有一個(gè)content-length字段,client_max_body_size是用來限制content-length表示的值的大小休讳,當(dāng)用戶上傳大文件時(shí)讲婚,nginx收完請求頭發(fā)現(xiàn)content-length大于限制的大小就直接返回413(request entity too large),而不用等接收完整個(gè)包體俊柔。
對請求限速(http/server/location/if)
表示限制服務(wù)器響應(yīng)客戶端時(shí)每秒發(fā)送的字節(jié)數(shù)筹麸,可用于下載限速。
limit_rate speed;
limit_rate 0;(默認(rèn)雏婶,0為不限速)
可以針對不同客戶端限速
server {
if ($slow) {
set $limit_rate 400k;
}
}
超過指定大小才開始限速(http/server/location/if)
limit_rate_after 1m;
limit_rate_after 100k;
響應(yīng)長度超過limit_rate_after后才開始限速物赶。
文件操作優(yōu)化
開啟sendfile(http/server/location)
sendfile on | off;(默認(rèn)off)
可以啟用Linux上的sendfile系統(tǒng)調(diào)用來發(fā)送文件,減少了用戶態(tài)和內(nèi)核態(tài)的兩次內(nèi)存復(fù)制留晚。這樣從磁盤讀取文件后直接在內(nèi)核態(tài)發(fā)送到網(wǎng)卡設(shè)備酵紫,提高發(fā)送效率。
打開文件緩存(http/server/location)
文件緩存會(huì)保存以下三種信息:
1错维、文件句柄奖地、文件大小和上次修改事件。
2赋焕、已經(jīng)打開過的目錄結(jié)構(gòu)参歹。
3、沒有找到的或沒有權(quán)限的文件信息宏邮。
這樣通過讀取緩存可以減少對磁盤的操作泽示。
open_file_cache off;(默認(rèn)關(guān)閉)
open_file_cache max=1000 inactive=20s;
max:當(dāng)內(nèi)存中存儲(chǔ)的元素到達(dá)1000時(shí),采用LRU(least recently used)算法蜜氨,移除最近最少使用的元素來保存新元素械筛。
inactive:20s沒有被訪問過的元素會(huì)被淘汰。默認(rèn)60s飒炎。
是否緩存打開文件錯(cuò)誤的信息(http/server/location)
open_file_cache_errors on| off;
表示是否緩存打開文件時(shí)出現(xiàn)找不到路徑或沒有權(quán)限的等錯(cuò)誤埋哟。
不被淘汰的最小訪問次數(shù)(http/server/location)
open_file_cache_min_uses 1;
在inactive時(shí)間內(nèi)被訪問大于或等于open_file_cache_min_uses次的紀(jì)錄不會(huì)被淘汰。
文件緩存檢查頻率
open_file_cache_valid 60s;
默認(rèn)60s檢查一次緩存中元素是否有效郎汪。
客戶端請求的特殊處理
忽略不合法的http頭部(http/server)
ignore_invalid_headers on| off;
ignore_invalid_headers on;(默認(rèn))
off:出現(xiàn)不合法頭部時(shí)赤赊,nginx會(huì)拒絕服務(wù),并響應(yīng)400(bad request)錯(cuò)誤煞赢。
on:則會(huì)忽略此HTTP頭部抛计。
http頭是否允許下劃線(http/server)
underscores_in_headers off | on;
默認(rèn)為off,不允許頭部名稱中帶"_"(下劃線)
If-Modified-Since處理策略(http/server/location)
if_modified_since [off | exact | before];
if_modified_since exact;(默認(rèn))
if_modified_since代表瀏覽器本地緩存文件時(shí)的時(shí)間照筑。
off:忽略該頭部吹截,每次返回最新文件。
exact:將if-modified-since與文件上次修改時(shí)間做精確對比凝危,如果沒有匹配上則返回文件最新內(nèi)容波俄,如果匹配上了則返回304(not modified),表示客戶端文件是最新的蛾默,客戶端收到讀取本地緩存懦铺,沒必要浪費(fèi)寬帶。
before:只要文件上次修改時(shí)間早于或等于if-modified-since時(shí)間就返回304給客戶端支鸡。
合并多個(gè)/符號(http/server/location)
merge_slashes on | off;
merge_slashes on;(默認(rèn))
url中多個(gè)/符號相鄰出現(xiàn)時(shí)合并為一個(gè)冬念。
DNS地址解析(http/server/location)
resolver address....;
resolver 127.0.0.1 192.168.1.1;
設(shè)置dns服務(wù)解析地址
DNS地址解析超時(shí)時(shí)間(http/server/location)
resolver_timeout time;
resolver_timeout 30s;(默認(rèn))
返回錯(cuò)誤頁時(shí)是否標(biāo)明nginx版本(http/server/location)
server_tokens on | off;
server_tokens on;(默認(rèn))
處理請求時(shí)出錯(cuò),是否在響應(yīng)的server頭部中表明nginx版本牧挣。
負(fù)載均衡配置
集群配置(http)
upstream name {....}
upstream定義了一個(gè)上有服務(wù)器集群刘急,便于反向代理的proxy_pass使用。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location /backend {
proxy_pass http://backend;
}
}
server配置(upstream)
server name [parameters];
集群中單臺機(jī)器的配置浸踩。
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=30s fail_timeout=30s;
server unix:/tmp/backend3;
}
name可以是域名叔汁,ip:port,unix句柄等检碗。其后面的參數(shù)如下:
weight:設(shè)置服務(wù)器權(quán)重据块,默認(rèn)1。
max_fails:默認(rèn)1折剃,表示fail_timeout時(shí)間段內(nèi)另假,如果向上游服務(wù)器轉(zhuǎn)發(fā)失敗次數(shù)超過max_fails配置次數(shù),則認(rèn)為在fail_timeout時(shí)間段內(nèi)服務(wù)器不可用怕犁。
fail_timeout:默認(rèn)10s边篮,表示在此時(shí)間段內(nèi)轉(zhuǎn)發(fā)失敗次數(shù)超過max_fails次己莺,則這段時(shí)間上有服務(wù)器不可用。
down:表示這臺服務(wù)器永久下線戈轿。只有在使用ip_hash配置項(xiàng)才有用凌受。
backup:在使用ip_hash配置時(shí)是無效的。表示只有其他上有服務(wù)器都不可用時(shí)才轉(zhuǎn)發(fā)給它思杯。
ip_hash配置(upstream)
ip_hash與權(quán)重不可以同時(shí)使用胜蛉。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com down;
}
通過對用戶ip進(jìn)行hash,讓同一個(gè)用戶每次請求同一個(gè)上游服務(wù)器色乾。如果有一臺服務(wù)器暫時(shí)不可用誊册,不能直接刪除,而是使用down參數(shù)進(jìn)行標(biāo)識暖璧,確保轉(zhuǎn)發(fā)策略的一致性案怯。
反向代理配置
proxy_pass配置(location/if)
proxy_pass url;
將當(dāng)前請求反向代理到URL參數(shù)指定的服務(wù)器上。
proxy_pass http://localhost:8080/uri/;(常見url)
proxy_pass http://unix:/path/to/backend.socket:/uri/;(unix句柄)
proxy_pass http://backend;(upstream塊)
默認(rèn)反向代理不會(huì)轉(zhuǎn)發(fā)Host頭部澎办,如果需要轉(zhuǎn)發(fā)殴泰,加上配置:
proxy_set_header Host $host;
代理轉(zhuǎn)發(fā)時(shí)請求方式配置(http/server/location)
proxy_method POST;
轉(zhuǎn)發(fā)時(shí)客戶端get請求也會(huì)改為post請求。
禁止轉(zhuǎn)發(fā)響應(yīng)頭配置(http/server/location)
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;
在轉(zhuǎn)發(fā)響應(yīng)給客戶端時(shí)浮驳,配置在proxy_hide_header后面的響應(yīng)頭都會(huì)被忽略悍汛。
允許轉(zhuǎn)發(fā)響應(yīng)頭配置(http/server/location)
proxy_pass_header Cache-Control;
proxy_pass_header MicrosoftOfficeWebServer;
在轉(zhuǎn)發(fā)響應(yīng)給客戶端時(shí),配置在proxy_pass_header后面的響應(yīng)頭都會(huì)被轉(zhuǎn)發(fā)至会。
proxy_redirect(http/server/location)
proxy_redirect [ default | off | redirect replacement]
proxy_redirect default;(默認(rèn))
當(dāng)上有服務(wù)器返回的是重定向或者刷新請求時(shí)(301/302)离咐,proxy_redirect可以重設(shè)頭部的location或refresh字段,
off:關(guān)閉location的修改奉件。
default:按照proxy_pass配置項(xiàng)宵蛀,和所屬的location配置項(xiàng)重組發(fā)送給客戶端的location。
以下配置效果相同:
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}