NGINX提供靜態內容

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:
  1. 運行命令:
sudo sysctl -w net.core.somaxconn=4096
  1. 使用文本編輯器將以下行添加到/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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章