文章目錄
1. 根目錄和索引文件
root指令明確了用於查找文件的根目錄。爲了得到請求文件的路徑,NGINX將請求URI追加到root指令指定的路徑後。指令可以放在任何級別的http{},server{}或location{}上下文中。在下面的示例中,root指令被虛擬服務器定義,它應用到所有沒有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會在/www/media/目錄中搜索文件,因爲它在匹配的location塊中定義。
如果請求以斜槓結尾,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的新搜索,並可能最終到達另一個location,如以下示例所示:
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 內部重定向映射到第二個location。結果,該請求被代理。
2. 嘗試幾個選項
try_files指令被用於檢測指定的文件或目錄是否存在。如果存在,NGINX進行內部重定向;反之,返回狀態碼。例如,要檢查是否存在與請求URI相對應的文件,請使用try_files指令和$uri變量,如下所示:
server {
root /www/data;
location /images/ {
try_files $uri /images/default.gif;
}
}
文件由URI的格式確定,該URI使用在當前location或虛擬服務器的上下文中設置的root或alias指令進行處理。在這種情況下,如果不存在與原始URI對應的文件,NGINX將內部重定向到由最後一個參數指定的URI,返回/www/data/images/default.gif。
最後一個參數也可以是狀態代碼(直接在等號後)或location名稱。以下示例中,如果try_files指令的任何參數都無法解析到現有文件或目錄,則將返回404錯誤。
location / {
try_files $uri $uri/ $uri.html =404;
}
在下一個示例中,如果原始URI或帶有尾隨斜槓的URI都無法解析到現有文件或目錄中,則該請求將被重定向到指定的location,該location會將其傳遞給代理服務器。
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://backend.example.com;
}
3. 優化性能以提供內容
加載速度是提供任何內容的關鍵因素。對NGINX配置進行小的優化可能會提高生產率並幫助達到最佳性能。
3.1 啓用 sendfile
默認情況下,NGINX自行處理文件傳輸,並在發送文件之前將文件複製到緩衝區中。啓用sendfile指令可以消除將數據複製到緩衝區的步驟,並可以將數據從一個文件描述符直接複製到另一個文件描述符。另外,爲防止一個快速連接完全佔用工作進程,您可以使用sendfile_max_chunk指令限制單個sendfile()調用中傳輸的數據量(本例中爲1M):
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
#...
}
3.2 啓用 tcp_nopush
將tcp_nopush指令與sendfile on指令一起使用。這樣一來,這使NGINX能夠在 sendfile() 獲得數據塊後立即在一個數據包中發送HTTP響應頭。
location /mp3 {
sendfile on;
tcp_nopush on;
#...
}
3.3 啓用 tcp_nodelay
tcp_nodelay指令允許覆蓋Nagle算法,該算法最初旨在解決速度較慢的網絡中的小數據包問題。該算法將多個小數據包合併爲一個較大的數據包,並以200ms的延遲發送數據包。如今,在處理大型靜態文件時,無論數據包大小如何,都可以立即發送數據。延遲還會影響在線應用程序(SSH,在線遊戲,在線交易等)。默認情況下,tcp_nodelay指令設置爲on,意味着Nagle算法被禁用。僅對需要保持的連接使用此指令:
location /mp3 {
tcp_nodelay on;
keepalive_timeout 65;
#...
}
3.4 優化積壓隊列
重要的因素之一是NGINX可以處理傳入連接的速度。一般規則是,建立連接後,將其放入listen套接字的監聽隊列中。在正常負載下,隊列很小或根本沒有隊列。但是在高負載下,隊列會急劇增長,從而導致性能不均勻,連接斷開和延遲增加。
3.4.1 顯示監聽隊列
要顯示當前監聽隊列,請運行以下命令(FreeBSD系統下):
netstat -Lan
輸出可能類似於以下內容,該結果表明在80端口上的偵聽隊列中, 在已配置的最大128隊列連接數中,存在10個不可接受的連接。這種情況是正常的。
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配置中的最大連接數。
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
0/0/128 *.12345
192/0/128 *.80
0/0/128 *.8080
3.4.2 調整操作系統
將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
3.4.5 調優NGINX
如果將somaxconn內核參數設置爲大於的值512,請修改NGINX listen指令的backlog參數來匹配:
server {
listen 80 backlog=4096;
# ...
}
今天就裝逼到這吧~~
參考文檔
https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/