本節(jié)介紹如何使用NGINX來(lái)提供靜態(tài)內(nèi)容服務(wù),定義搜索路徑以查找請(qǐng)求的文件的方法,以及如何設(shè)置索引文件。
在這個(gè)部分,我們主要涉及以下幾個(gè)方面的內(nèi)容:
root指令指定將用于搜索文件的根目錄。 要獲取請(qǐng)求文件的路徑,NGINX將請(qǐng)求URI附加到root
指令指定的路徑。 該指令可以放置在http
,server
或location
上下文中的任何級(jí)別上。 在下面的示例中,為虛擬服務(wù)器定義了root
指令。 它適用于不包括root
指令的所有location
塊以顯式重新定義根:
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ \.(mp3|mp4) {
root /www/media;
}
}
這里,NGINX在文件系統(tǒng)的/www/data/images/
目錄中搜索以/images/
開頭的URI。 但是,如果URI以.mp3
或.mp4
擴(kuò)展名結(jié)尾,則NGINX會(huì)在/www/media/
目錄中搜索.mp3
或.mp4
文件,因?yàn)樗谄ヅ涞?code>location塊中定義。
如果請(qǐng)求以斜杠結(jié)尾,則NGINX將其視為對(duì)目錄的請(qǐng)求,并嘗試在目錄中找到索引文件。index
指令定義索引文件的名稱(默認(rèn)值為index.html
)。繼續(xù)示例,如果請(qǐng)求URI為/images/some/path/
,則NGINX會(huì)傳遞文件/www/data/images/some/path/index.html
(如果存在)。 如果不存在文件,NGINX默認(rèn)返回HTTP代碼404
(未找到)。 要配置NGINX以返回自動(dòng)生成的目錄列表,請(qǐng)將on
參數(shù)添加到autoindex
指令中:
location /images/ {
autoindex on;
}
可以在索引指令中列出多個(gè)文件名。 NGINX以指定的順序搜索文件,并返回它找到的第一個(gè)文件。
location / {
index index.$geo.html index.html index.html;
}
這里使用的$geo
變量是通過(guò)geo指令設(shè)置的自定義變量。 變量的值取決于客戶端的IP地址。
要返回索引文件,NGINX檢查其是否存在,然后通過(guò)將索引文件的名稱附加到基本URI來(lái)對(duì)通過(guò)URI獲取的內(nèi)部重定向。內(nèi)部重定向會(huì)導(dǎo)致對(duì)某個(gè)位置(location
)的新搜索,并且可能會(huì)在另一個(gè)位置(location
)中結(jié)束,如以下示例所示:
location / {
root /data;
index index.html index.php;
}
location ~ \.php {
fastcgi_pass localhost:8000;
...
}
在這里,如果請(qǐng)求中的URI是/path/
,并且/data/path/index.html
不存在,但是/data/path/index.php
存在,則將/path/index.php
內(nèi)部重定向映射到第二個(gè)位置(location
)。 因此,請(qǐng)求被代理。
try_files指令可用于檢查指定的文件或目錄是否存在并進(jìn)行內(nèi)部重定向,如果沒(méi)有指定的文件或目錄,則返回特定的狀態(tài)代碼。 例如,要檢查與請(qǐng)求URI相對(duì)應(yīng)的文件的存在,請(qǐng)使用try_files
指令和$uri
變量,如下所示:
server {
root /www/data;
location /images/ {
try_files $uri /images/default.gif;
}
}
該文件以URI的形式指定,它使用在當(dāng)前位置或虛擬服務(wù)器的上下文中設(shè)置的 root
或 alias
偽指令進(jìn)行處理。 在這種情況下,如果與原始URI相對(duì)應(yīng)的文件不存在,則NGINX將內(nèi)部重定向到最后一個(gè)參數(shù)中指定的URI,也就是返回/www/data/images/default.gif
。
最后一個(gè)參數(shù)也可以是一個(gè)狀態(tài)代碼(直接在前面的等號(hào))或位置的名稱。 在以下示例中,如果try_files
指令的任何參數(shù)都不會(huì)解析為現(xiàn)有文件或目錄,則會(huì)返回404錯(cuò)誤。
location / {
try_files $uri $uri/ $uri.html =404;
}
在下一個(gè)示例中,如果原始URI和帶有附加尾部斜線的URI都不能解析為現(xiàn)有文件或目錄,則將請(qǐng)求重定向到將其傳遞給代理服務(wù)器的命名位置(location
)。
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://backend.example.com;
}
加載速度是服務(wù)任何內(nèi)容的關(guān)鍵因素。 對(duì)您的NGINX配置進(jìn)行小幅優(yōu)化可能會(huì)提高生產(chǎn)力并幫助實(shí)現(xiàn)最佳性能。
默認(rèn)情況下,NGINX會(huì)自動(dòng)處理文件傳輸,并在發(fā)送文件之前將其復(fù)制到緩沖區(qū)中。 啟用sendfile指令將消除將數(shù)據(jù)復(fù)制到緩沖區(qū)中的步驟,并允許將數(shù)據(jù)從一個(gè)文件描述符直接復(fù)制到另一個(gè)文件描述符。 或者,為了防止一個(gè)快速連接完全占用工作進(jìn)程,您可以通過(guò)定義sendfile_max_chunk指令來(lái)限制在單個(gè)sendfile()
調(diào)用中傳輸?shù)臄?shù)據(jù)量:
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
...
}
將tcp_nopush選項(xiàng)與sendfile
一起使用。 該選項(xiàng)將使NGINX能夠通過(guò)sendfile
獲取數(shù)據(jù)塊之后,在一個(gè)數(shù)據(jù)包中發(fā)送HTTP響應(yīng)頭
location /mp3 {
sendfile on;
tcp_nopush on;
...
}
tcp_nodelay選項(xiàng)可以覆蓋Nagle的算法,最初是為了解決慢網(wǎng)絡(luò)中的小數(shù)據(jù)包問(wèn)題而設(shè)計(jì)的。 該算法將大量小數(shù)據(jù)包整合到較大的數(shù)據(jù)包中,并以200 ms
的延遲發(fā)送數(shù)據(jù)包。
如今,當(dāng)服務(wù)大型靜態(tài)文件時(shí),無(wú)論數(shù)據(jù)包大小如何,都可以立即發(fā)送數(shù)據(jù)。 延遲也會(huì)影響在線應(yīng)用程序(ssh,在線游戲,網(wǎng)上交易)。 默認(rèn)情況下,tcp_nodelay
指令設(shè)置為on
,表示Nagle的算法被禁用。 該選項(xiàng)僅用于Keepalive
連接:
location /mp3 {
tcp_nodelay on;
keepalive_timeout 65;
...
}
其中一個(gè)重要因素是NGINX可以處理傳入連接的速度。 一般規(guī)則是建立連接時(shí),將其放入監(jiān)聽套接字的“偵聽”隊(duì)列中。 在正常負(fù)載下,有一個(gè)低隊(duì)列,或根本沒(méi)有隊(duì)列。 但是在高負(fù)載下,隊(duì)列可能會(huì)急劇增長(zhǎng),這可能會(huì)導(dǎo)致性能不均衡,連接丟失和延遲。
測(cè)量偵聽隊(duì)列
讓我們來(lái)查看當(dāng)前的偵聽隊(duì)列。 運(yùn)行命令:
netstat -Lan
命令輸出可能如下所示:
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
0/0/128 *.12345
10/0/128 *.80
0/0/128 *.8080
命令輸出顯示端口80
的監(jiān)聽隊(duì)列中有10
個(gè)不接受的連接,而連接限制為128
個(gè)連接,這種情況是正常的。
但是,命令輸出可能如下所示:
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
0/0/128 *.12345
192/0/128 *.80
0/0/128 *.8080
命令輸出顯示超過(guò)128個(gè)連接限制的192個(gè)不可接受的連接。 當(dāng)網(wǎng)站的流量很大時(shí),這是很常見的。 為了達(dá)到最佳性能,您需要增加NGINX在操作系統(tǒng)和NGINX配置中排隊(duì)等待接收的最大連接數(shù)。
調(diào)整操作系統(tǒng)
將net.core.somaxconn
鍵的值從其默認(rèn)值(128
)增加到足夠高的值以能夠處理高突發(fā)流量:
對(duì)于FreeBSD,運(yùn)行命令:
sudo sysctl kern.ipc.somaxconn=4096
對(duì)于FreeBSD,運(yùn)行命令:
sudo sysctl -w net.core.somaxconn=4096
打開文件:/etc/sysctl.conf
,將下面一行添加到文件并保存文件:
net.core.somaxconn = 4096
調(diào)整NGINX
如果將somaxconn
鍵設(shè)置為大于512
的值,請(qǐng)更改NGINX listen指令的backlog
參數(shù)以匹配:
server {
listen 80 backlog 4096;
# The rest of server configuration
}