提供靜態內容
配置 NGINX 和 NGINX Plus 以提供靜態內容,使用類型特定的根目錄,檢查文件存在性,并進行性能優化。
本節介紹如何配置 NGINX 和 NGINX Plus 以提供靜態內容,如何定義搜索請求文件的路徑,如何設置索引文件,以及如何調整 NGINX 和 NGINX Plus 以及內核以實現最佳性能。
根目錄和索引文件
root 指令指定將用于搜索文件的根目錄。為了獲得請求文件的路徑,NGINX 將請求 URI 追加到 root 指令指定的路徑中。該指令可以放置在 http {}、server {} 或 location {} 上下文中的任何級別。在下面的示例中,root 指令為虛擬服務器定義了根目錄。它適用于所有未在 location {} 塊中明確重新定義根目錄的地方:
server {root /www/data;location / {}location /images/ {}location ~ \.(mp3|mp4) {root /www/media;}
}
在這里,NGINX 在文件系統中的 /www/data/images/ 目錄中搜索以 /images/ 開頭的 URI。但是,如果 URI 以 .mp3 或 .mp4 擴展名結尾,NGINX 將在匹配的 location 塊中定義的 /www/media/ 目錄中搜索文件。
如果請求以斜杠結尾,則 NGINX 將其視為對目錄的請求,并嘗試在目錄中查找索引文件。index 指令定義了索引文件的名稱(默認值為 index.html)。繼續上面的示例,如果請求 URI 是 /images/some/path/,并且如果存在 /www/data/images/some/path/index.html,則 NGINX 將返回該文件。如果不存在,則 NGINX 默認返回 HTTP 404(未找到)。要配置 NGINX 返回自動生成的目錄列表,可以將 on 參數包含在 autoindex 指令中:
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 的形式指定,使用當前位置或虛擬服務器上下文中設置的 root 或 alias 指令進行處理。在這種情況下,如果原始 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 的緩存功能。
優化性能以提供內容
加載速度是提供任何內容的關鍵因素。對 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 指令設置為開啟,這意味著 Nagle 算法已禁用。僅對保持活動的連接使用此指令:
location /mp3 {tcp_nodelay on;keepalive_timeout 65;#...
}
優化后臺隊列
重要因素之一是 NGINX 處理傳入連接的速度。一般規則是,當建立連接時,它被放入“監聽”套接字的“監聽”隊列中。在正常負載下,要么隊列很小,要么根本沒有隊列。但在高負載下,隊列可能會急劇增長,導致性能不均勻、連接丟失和延遲增加。
顯示監聽隊列
要顯示當前的監聽隊列,請運行以下命令:
netstat -Lan
輸出可能如下,其中顯示在端口 80 的監聽隊列中有 10 個未接受的連接,而配置的最大值為 128 個排隊連接。這種情況是正常的。
當前的監聽隊列大小(qlen/incqlen/maxqlen)
監聽 本地地址
0/0/128 *.12345
10/0/128 *.80
0/0/128 *.8080
相比之下,在以下命令中,未接受的連接數量(192)超過了 128 的限制。當網站經歷大量流量時,這種情況很常見。為了達到最佳性能,您需要增加可以排隊等待 NGINX 接受的連接的最大數量,方法是在操作系統和 NGINX 配置中都增加此值。
當前的監聽隊列大小(qlen/incqlen/maxqlen)
監聽 本地地址
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:
運行以下命令:
sudo sysctl -w net.core.somaxconn=4096
使用文本編輯器將以下行添加到 /etc/sysctl.conf:
net.core.somaxconn = 4096
調整 NGINX
如果將 somaxconn 內核參數設置為大于 512 的值,請將 backlog 參數更改為 NGINX listen 指令以匹配:
server {listen 80 backlog=4096;# ...
}
nginx 系列
Nginx-01-聊一聊 nginx
Nginx-01-Nginx 是什么
Nginx-02-為什么使用 Nginx
Nginx-02-Nginx Ubuntu 安裝 + windows10 + WSL ubuntu 安裝 nginx 實戰筆記
Nginx-02-基本使用
Nginx-03-Nginx 項目架構
Nginx-04-Docker Nginx
Nginx-05-nginx 反向代理是什么?windows 下如何配置使用 nginx
Nginx-06-nginx 匯總入門介紹
Nginx R31 doc 官方文檔-01-nginx 如何安裝
Nginx R31 doc-02-nginx 基本功能
Nginx R31 doc-03-HTTP Load Balancing HTTP 負載均衡
Nginx R31 doc-04-HTTP Health Checks
Nginx R31 doc-05-Dynamic Configuration of Upstreams with the NGINX Plus API 使用 NGINX Plus API 動態配置上游服務器
Nginx R31 doc-06-Accepting the PROXY Protocol
Nginx R31 doc-07-內容緩存
Nginx R31 doc-08-Configuring NGINX and NGINX Plus as a Web Server 配置 NGINX 和 NGINX Plus 作為 Web 服務器
Nginx R31 doc-09-Serving Static Content 靜態內容
Nginx R31 doc-10-NGINX Reverse Proxy 反向代理
Nginx R31 doc-11-Compression and Decompression 壓縮與解壓縮
Nginx R31 doc-12-NGINX SSL Termination 安全加密
Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 訪問限流
Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 動態拒絕IP地址
Nginx R31 doc-15-Live Activity Monitoring 實時活動監控
Nginx R31 doc-16-logging 配置日志
Nginx R31 doc-17-debugging 調試
Nginx R31 doc-18-High Availability Support for NGINX Plus in On-Premises Deployments
Nginx 實戰-01-nginx ubuntu 安裝筆記
Nginx 實戰-01-nginx windows 安裝筆記
Nginx 實戰-02-nginx proxy_pass 服務代理訪問 使用筆記 ubuntu nodejs
Nginx 實戰-03-nginx 負載均衡
Nginx 實戰-04-nginx 不同的地址訪問不同的服務
Nginx 實戰-05-nginx 反向代理實現域名到指定的 ip