詳解Nginx 靜態(tài)文件服務(wù)配置及優(yōu)化
根目錄和索引文件
root 指令指定將用于搜索文件的根目錄。 為了獲取所請(qǐng)求文件的路徑,NGINX 將請(qǐng)求 URI 附加到 root 指令指定的路徑。該指令可以放在 http {} , server {} 或 location {} 上下文中的任何級(jí)別。在下面的示例中,為虛擬服務(wù)器定義了 root 指令。 它適用于未包含根指令的所有 location {} 塊,以顯式重新定義根:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
在這里,NGINX 針對(duì) /images/ 開頭的 URI 將在文件系統(tǒng)的 /www/ data/images/ 目錄中搜索相應(yīng)文件。 如果 URI 以 .mp3 或 .mp4 擴(kuò)展名結(jié)尾,則 NGINX 會(huì)在 /www/media/ 目錄中搜索該文件,因?yàn)樗窃谄ヅ涞奈恢脡K中定義的。
如果請(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 錯(cuò)誤(未找到)。要配置 NGINX 以返回自動(dòng)生成的目錄列表,請(qǐng)?jiān)?autoindex 指令中包含 on 參數(shù):
location /images/ { autoindex on; }
你可以在 index 指令中列出多個(gè)文件名。 NGINX按指定的順序搜索文件并返回它找到的第一個(gè)文件。
location / { index index.$geo.html index.htm index.html; }
這里使用的 $geo 變量是通過 geo 指令設(shè)置的自定義變量。變量的值取決于客戶端的 IP 地址。
要返回索引文件,NGINX 會(huì)檢查它是否存在,然后對(duì)通過將索引文件的名稱附加到基礎(chǔ) URI 上獲得的新 URI 進(jìn)行內(nèi)部重定向。內(nèi)部重定向?qū)е聦?duì)位置的新搜索,并且可能最終位于另一個(gè)位置,如以下示例所示:
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è)位置。結(jié)果,請(qǐng)求被代理。
嘗試幾種選擇
try_files 指令可用于檢查指定的文件或目錄是否存在; NGINX 會(huì)進(jìn)行內(nèi)部重定向,如果沒有,則返回指定的狀態(tài)代碼。例如,要檢查對(duì)應(yīng)于請(qǐng)求 URI 的文件是否存在,請(qǐng)使用 try_files 指令和 $uri 變量,如下所示:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
該文件以 URI 的形式指定,使用在當(dāng)前位置或虛擬服務(wù)器的上下文中設(shè)置的根或別名指令進(jìn)行處理。在這種情況下,如果對(duì)應(yīng)于原始 URI 的文件不存在,NGINX 會(huì)將內(nèi)部重定向到最后一個(gè)參數(shù)指定的 URI,并返回 /www/data/images/default.gif 。
最后一個(gè)參數(shù)也可以是狀態(tài)代碼(直接以等號(hào)開頭)或位置名稱。 在以下示例中,如果 try_files 指令的所有參數(shù)都不會(huì)解析為現(xiàn)有文件或目錄,則會(huì)返回 404 錯(cuò)誤。
location / { try_files $uri $uri/ $uri.html =404; }
在下一個(gè)示例中,如果原始 URI 和帶有附加尾部斜杠的 URI 都不會(huì)解析為現(xiàn)有文件或目錄,則會(huì)將請(qǐng)求重定向到指定位置,并將其傳遞給代理服務(wù)器。
location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; }
有關(guān)更多信息,請(qǐng)觀看 內(nèi)容緩存 網(wǎng)絡(luò)研討會(huì),了解如何顯著提高網(wǎng)站性能,并深入了解 NGINX 的緩存功能。
優(yōu)化服務(wù)內(nèi)容的性能
加載速度是提供任何內(nèi)容的關(guān)鍵因素。 對(duì) NGINX 配置進(jìn)行微小優(yōu)化可以提高生產(chǎn)力并幫助實(shí)現(xiàn)最佳性能。
啟用 sendfile
默認(rèn)情況下,NGINX 會(huì)自行處理文件傳輸,并在發(fā)送之前將文件復(fù)制到緩沖區(qū)中。 啟用 sendfile 指令消除了將數(shù)據(jù)復(fù)制到緩沖區(qū)的步驟,并允許將數(shù)據(jù)從一個(gè)文件描述符直接復(fù)制到另一個(gè)文件描述符?;蛘?,為了防止一個(gè)快速連接完全占用工作進(jìn)程,可以使用 sendfile_max_chunk 指令限制單個(gè) sendfile() 調(diào)用中傳輸?shù)臄?shù)據(jù)量(在本例中為1 MB):
location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
啟用 tcp_nopush
將 tcp_nopush 指令與 sendfile on; 指令一起使用。這使得 NGINX 可以在 sendfile() 獲取數(shù)據(jù)塊之后立即在一個(gè)數(shù)據(jù)包中發(fā)送 HTTP 響應(yīng)頭。
location /mp3 { sendfile on; tcp_nopush on; #... }
啟用 tcp_nodelay
tcp_nodelay 指令允許覆蓋 Nagle 的算法 ,該算法最初設(shè)計(jì)用于解決慢速網(wǎng)絡(luò)中小數(shù)據(jù)包的問題。該算法將許多小數(shù)據(jù)包合并為一個(gè)較大的數(shù)據(jù)包,并以 200 毫秒的延遲發(fā)送數(shù)據(jù)包。如今,在提供大型靜態(tài)文件時(shí),無(wú)論數(shù)據(jù)包大小如何,都可以立即發(fā)送數(shù)據(jù)。延遲也會(huì)影響在線應(yīng)用程序(ssh,在線游戲,在線交易等)。默認(rèn)情況下, tcp_nodelay 指令設(shè)置為 on,這意味著禁用了 Nagle的算法。此指令僅用于 keepalive 連接:
location /mp3 { tcp_nodelay on; keepalive_timeout 65; #... }
優(yōu)化積壓隊(duì)列
其中一個(gè)重要因素是 NGINX 可以多快地處理傳入連接。一般規(guī)則是在建立連接時(shí),將其放入偵聽套接字的 "listen" (監(jiān)聽)隊(duì)列中。在正常負(fù)載下,隊(duì)列很小或根本沒有隊(duì)列。但是在高負(fù)載下,隊(duì)列會(huì)急劇增長(zhǎng),導(dǎo)致性能不均勻,連接中斷,延遲增加。
顯示積壓隊(duì)列使用命令 netstat -Lan 來(lái)顯示當(dāng)前監(jiān)聽隊(duì)列。輸出可能如下所示,它顯示在端口 80上的監(jiān)聽隊(duì)列中,有 10 個(gè)未接受的連接,這些連接針對(duì)配置的最多 128 個(gè)排隊(duì)連接。這種情況很正常。
Current listen queue sizes (qlen/incqlen/maxqlen) Listen Local Address 0/0/128 *.12345 10/0/128 *.80 0/0/128 *.8080
相反,在以下命令中,未接受的連接數(shù)(192)超過了 128 的限制。當(dāng)網(wǎng)站流量很大時(shí),這種情況很常見。要獲得最佳性能,需要在操作系統(tǒng)和 NGINX 配置中增加可以排隊(duì)等待 NGINX 接受的最大連接數(shù)。
Current listen queue sizes (qlen/incqlen/maxqlen) Listen Local Address 0/0/128 *.12345 192/0/128 *.80 0/0/128 *.8080
調(diào)整操作系統(tǒng)
將 net.core.somaxconn 內(nèi)核參數(shù)的值從其默認(rèn)值(128)增加到足以容納大量流量的值。在這個(gè)例子中,它增加到 4096。
- FreeBSD 的命令為 sudo sysctl kern.ipc.somaxconn=4096
- Linux 的命令為 1. sudo sysctl -w net.core.somaxconn=4096 2. 將 net.core.somaxconn = 4096 加入到 /etc/sysctl.conf 文件中。
調(diào)整 NGINX
如果將 somaxconn 內(nèi)核參數(shù)設(shè)置為大于 512 的值,請(qǐng)將 backlog 參數(shù)增加在 NGINX listen 指令以匹配修改:
server { listen 80 backlog=4096; # ... }
© 文章翻譯自Nginx Serving Static Content ,部分做了語(yǔ)義調(diào)整。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
LNMP 解決Access Denied錯(cuò)誤詳細(xì)介紹
這篇文章主要介紹了LNMP 解決Access Denied錯(cuò)誤詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10Debian系統(tǒng)下為PHP程序配置Nginx服務(wù)器的基本教程
這篇文章主要介紹了Debian系統(tǒng)下為PHP程序配置Nginx服務(wù)器的基本教程,這里使用到了FastCGI和php-fpm,需要的朋友可以參考下2015-12-12Nginx中IF、AND、OR語(yǔ)句用法實(shí)例
這篇文章主要介紹了Nginx中IF、AND、OR語(yǔ)句用法實(shí)例,本文講解的是Ningx中的邏輯判斷語(yǔ)句用法,需要的朋友可以參考下2015-02-02Nginx默認(rèn)location?index設(shè)置網(wǎng)站的默認(rèn)首頁(yè)方法詳解
我們都知道index后面可以跟多個(gè)設(shè)置,如果訪問的時(shí)候沒有指定具體訪問的資源,則會(huì)依次進(jìn)行查找,找到第一個(gè)為止,這篇文章主要給大家介紹了關(guān)于Nginx默認(rèn)location?index設(shè)置網(wǎng)站的默認(rèn)首頁(yè)的相關(guān)資料,需要的朋友可以參考下2023-12-12Nginx代理axios請(qǐng)求以及注意事項(xiàng)詳解
這篇文章主要給大家介紹了關(guān)于Nginx代理axios請(qǐng)求以及注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Nginx配置PATHINFO隱藏thinkphp index.php
這篇文章主要介紹了Nginx配置PATHINFO隱藏thinkphp index.php,本文直接給出配置示例,需要的朋友可以參考下2015-07-07修改nginx站點(diǎn)根目錄總結(jié)經(jīng)驗(yàn)(小結(jié))
這篇文章主要介紹了修改nginx站點(diǎn)根目錄總結(jié)經(jīng)驗(yàn)(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-06-06