在本節(jié)中,我們將討論如何配置 Nginx 靜態(tài)內(nèi)容。
root 指令用于定義將用于搜索文件的根目錄。為了獲得請(qǐng)求文件的路徑,NGINX 將請(qǐng)求的 URI 附加到由 root 指令定義的路徑。該指令可以放置在服務(wù)器 {}、http {} 或位置 {} 上下文中的任何級(jí)別。
讓我們看一個(gè)例子;在這里,為虛擬服務(wù)器指定了 root 指令。它適用于所有沒(méi)有添加 root 指令來(lái)顯式重新定義 root 的 location {} 塊:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
如果請(qǐng)求后綴帶有斜杠,NGINX 會(huì)將其視為對(duì)目錄的請(qǐng)求,并嘗試在該目錄中查找索引文件并返回。index 指令指定索引文件的名稱(chēng)(默認(rèn)值為 index.html)。繼續(xù)這個(gè)例子,如果請(qǐng)求 URI 是/images/some/path/,NGINX 傳送文件/www/data/images/some/path/index.html如果它存在。如果沒(méi)有,則默認(rèn)情況下 NGINX 返回 HTTP 代碼 404(未找到)。要將 NGINX 配置為返回自動(dòng)生成的目錄列表,請(qǐng)將“on”參數(shù)添加到自動(dòng)索引指令中:
location /images/ { autoindex on; }
我們可以在 index 指令中列出多個(gè)文件名。NGINX 按指定順序查找文件并返回它找到的第一個(gè)文件。
location / { index index.$geo.html index.htm index.html; }
這里使用的 $geo 變量是通過(guò) geo 指令設(shè)置的自定義變量。該變量的值取決于客戶(hù)端的 IP 地址。
為了返回索引文件,NGINX 檢查文件是否存在,然后通過(guò)將索引文件的名稱(chēng)附加到基本 URI 來(lái)進(jìn)行內(nèi)部重定向到 URI。這個(gè)內(nèi)部重定向產(chǎn)生一個(gè)新的 location 搜索匹配過(guò)程,如下例所示:
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 存在,則內(nèi)部重定向到 /path/index.php ,然后新的匹配到第二個(gè) location ~ \.php { } ,請(qǐng)求被代理。
try_files 指令可用于檢查定義的文件或目錄是否存在;如果有,NGINX 會(huì)進(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)或命名 location 之前。在下面的示例中,如果 try_files 指令的任何參數(shù)都沒(méi)有解析為現(xiàn)有文件或目錄,則會(huì)返回 404 錯(cuò)誤。
location / { try_files $uri $uri/ $uri.html =404; }
加載速度是提供任何內(nèi)容的關(guān)鍵因素。對(duì)我們的 NGINX 配置進(jìn)行小幅優(yōu)化可能會(huì)提高生產(chǎn)力并有助于達(dá)到最佳性能。
啟用發(fā)送文件
默認(rèn)情況下,NGINX 自己控制文件傳輸,并在發(fā)送之前將文件復(fù)制到緩沖區(qū)中。當(dāng)我們啟用 sendfile 指令時(shí),它將消除將數(shù)據(jù)復(fù)制到緩沖區(qū)的步驟,并允許將數(shù)據(jù)從一個(gè)文件描述符直接復(fù)制到另一個(gè)文件描述符?;蛘?,為了阻止快速連接完全占用工作進(jìn)程,我們可以使用 sendfile_max_chunk 指令來(lái)限制在單個(gè) sendfile() 調(diào)用中傳輸?shù)臄?shù)據(jù)量(在本例中為 1 MB):
location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
啟用 tcp_nopush
將 tcp_nopush 指令與指令中的 sendfile 一起添加。這使 NGINX 能夠在從 sendfile() 獲取數(shù)據(jù)塊后立即在一個(gè)數(shù)據(jù)包中發(fā)送 HTTP 響應(yīng)標(biāo)頭。
location /mp3 { sendfile on; tcp_nopush on; #... }