首頁  >  文章  >  運維  >  Nginx靜態檔案服務如何設定及最佳化

Nginx靜態檔案服務如何設定及最佳化

WBOY
WBOY轉載
2023-05-13 09:04:131553瀏覽

根目錄和索引檔案

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靜態檔案服務如何設定及最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除