您好,登錄后才能下訂單哦!
這篇文章主要介紹了Nginx靜態文件服務如何配置及優化的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Nginx靜態文件服務如何配置及優化文章都會有所收獲,下面我們一起來看看吧。
根目錄和索引文件
root 指令指定將用于搜索文件的根目錄。 為了獲取所請求文件的路徑,nginx 將請求 uri 附加到 root 指令指定的路徑。該指令可以放在 http {} , server {} 或 location {} 上下文中的任何級別。在下面的示例中,為虛擬服務器定義了 root 指令。 它適用于未包含根指令的所有 location {} 塊,以顯式重新定義根:
server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
在這里,nginx 針對 /images/ 開頭的 uri 將在文件系統的 /www/ data/images/ 目錄中搜索相應文件。 如果 uri 以 .mp3 或 .mp4 擴展名結尾,則 nginx 會在 /www/media/ 目錄中搜索該文件,因為它是在匹配的位置塊中定義的。
如果請求以 / 結尾,則 nginx 將其視為對目錄的請求,并嘗試在目錄中查找索引文件。 index 指令定義索引文件的名稱(默認值為 index.html)。要繼續該示例,如果請求 uri 是 /images/some/path/ ,則 nginx 會返回文件 /www/data/images/some/path/index.html (如果存在)。如果沒有,nginx 默認返回 http 404 錯誤(未找到)。要配置 nginx 以返回自動生成的目錄列表,請在 autoindex 指令中包含 on 參數:
location /images/ { autoindex on; }
你可以在 index 指令中列出多個文件名。 nginx按指定的順序搜索文件并返回它找到的第一個文件。
location / { index index.$geo.html index.htm index.html; }
這里使用的 $geo 變量是通過 geo 指令設置的自定義變量。變量的值取決于客戶端的 ip 地址。
要返回索引文件,nginx 會檢查它是否存在,然后對通過將索引文件的名稱附加到基礎 uri 上獲得的新 uri 進行內部重定向。內部重定向導致對位置的新搜索,并且可能最終位于另一個位置,如以下示例所示:
location / { root /data; index index.html index.php; } location ~ \.php { fastcgi_pass localhost:8000; #... }
這里,如果請求中的 uri 是 /path/ ,并且 /data/path/index.html 不存在但 /data/path/index.php 存在,則內部重定向到 /path/index.php 將映射到第二個位置。結果,請求被代理。
嘗試幾種選擇
try_files 指令可用于檢查指定的文件或目錄是否存在; nginx 會進行內部重定向,如果沒有,則返回指定的狀態代碼。例如,要檢查對應于請求 uri 的文件是否存在,請使用 try_files 指令和 $uri 變量,如下所示:
server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
該文件以 uri 的形式指定,使用在當前位置或虛擬服務器的上下文中設置的根或別名指令進行處理。在這種情況下,如果對應于原始 uri 的文件不存在,nginx 會將內部重定向到最后一個參數指定的 uri,并返回 /www/data/images/default.gif 。
最后一個參數也可以是狀態代碼(直接以等號開頭)或位置名稱。 在以下示例中,如果 try_files 指令的所有參數都不會解析為現有文件或目錄,則會返回 404 錯誤。
location / { try_files $uri $uri/ $uri.html =404; }
在下一個示例中,如果原始 uri 和帶有附加尾部斜杠的 uri 都不會解析為現有文件或目錄,則會將請求重定向到指定位置,并將其傳遞給代理服務器。
location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; }
優化服務內容的性能
加載速度是提供任何內容的關鍵因素。 對 nginx 配置進行微小優化可以提高生產力并幫助實現最佳性能。
啟用 sendfile
默認情況下,nginx 會自行處理文件傳輸,并在發送之前將文件復制到緩沖區中。 啟用 sendfile 指令消除了將數據復制到緩沖區的步驟,并允許將數據從一個文件描述符直接復制到另一個文件描述符。或者,為了防止一個快速連接完全占用工作進程,可以使用 sendfile_max_chunk 指令限制單個 sendfile() 調用中傳輸的數據量(在本例中為1 mb):
location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
啟用 tcp_nopush
將 tcp_nopush 指令與 sendfile on; 指令一起使用。這使得 nginx 可以在 sendfile() 獲取數據塊之后立即在一個數據包中發送 http 響應頭。
location /mp3 { sendfile on; tcp_nopush on; #... }
啟用 tcp_nodelay
tcp_nodelay 指令允許覆蓋 nagle 的算法 ,該算法最初設計用于解決慢速網絡中小數據包的問題。該算法將許多小數據包合并為一個較大的數據包,并以 200 毫秒的延遲發送數據包。如今,在提供大型靜態文件時,無論數據包大小如何,都可以立即發送數據。延遲也會影響在線應用程序(ssh,在線游戲,在線交易等)。默認情況下, tcp_nodelay 指令設置為 on,這意味著禁用了 nagle的算法。此指令僅用于 keepalive 連接:
location /mp3 { tcp_nodelay on; keepalive_timeout 65; #... }
優化積壓隊列
其中一個重要因素是 nginx 可以多快地處理傳入連接。一般規則是在建立連接時,將其放入偵聽套接字的 "listen" (監聽)隊列中。在正常負載下,隊列很小或根本沒有隊列。但是在高負載下,隊列會急劇增長,導致性能不均勻,連接中斷,延遲增加。
顯示積壓隊列使用命令 netstat -lan 來顯示當前監聽隊列。輸出可能如下所示,它顯示在端口 80上的監聽隊列中,有 10 個未接受的連接,這些連接針對配置的最多 128 個排隊連接。這種情況很正常。
current listen queue sizes (qlen/incqlen/maxqlen) listen local address 0/0/128 *.12345 10/0/128 *.80 0/0/128 *.8080
相反,在以下命令中,未接受的連接數(192)超過了 128 的限制。當網站流量很大時,這種情況很常見。要獲得最佳性能,需要在操作系統和 nginx 配置中增加可以排隊等待 nginx 接受的最大連接數。
current listen queue sizes (qlen/incqlen/maxqlen) listen local address 0/0/128 *.12345 192/0/128 *.80 0/0/128 *.8080
調整操作系統
將 net.core.somaxconn 內核參數的值從其默認值(128)增加到足以容納大量流量的值。在這個例子中,它增加到 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 文件中。
調整 nginx
如果將 somaxconn 內核參數設置為大于 512 的值,請將 backlog 參數增加在 nginx listen 指令以匹配修改:
server { listen 80 backlog=4096; # ... }
關于“Nginx靜態文件服務如何配置及優化”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Nginx靜態文件服務如何配置及優化”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。