1. 程式人生 > >將 Nginx 配置為靜態資源伺服器

將 Nginx 配置為靜態資源伺服器

1. root 目錄和索引檔案

root 指令聲明瞭要查詢檔案的目錄。Nginx 會把請求的 URI 新增到 root 指令指定的路徑之後,來獲取請求檔案對應的目錄。root 指令可以放在 http、server 或 location 上下文的任何位置。
下面例子中的 root 指令定義在 server 中。所有的沒有重新實現 root 指令的 location 都會使用 server 中的 root 指令指定的目錄:

server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ \.(mp3|mp4) {
        root /www/media;
    }
}

如果 URI 以 mp3 或 mp4 字尾結尾,Nginx 會在 /www/media/ 目錄查詢檔案。否則在 /www/data 目錄中查詢。

如果請求以 / 結尾,Nginx 會把這個請求當做一個目錄請求,嘗試找這個目錄中的 index 檔案。index 指令定義了 index 檔案的檔名(預設使用 index.html 檔案)。例如上面的配置,如果請求是 /images/some/path/,Nginx 會嘗試尋找並返回檔案 /www/data/images/some/path/index.html,如果檔案不存在則返回 404。

autoindex 指令如果設定為 on,則 Nginx 會返回自動生成的目錄列表:

location /images/ {
    autoindex on;
}

index 指令中可以列出多個檔案。Nginx 會按順序查詢檔案並返回第一個找到的檔案。

location / {
    index index.$geo.html index.htm index.html;
}

這裡使用的 $geo 變數是通過 geo 指令設定的自定義變數。變數值由客戶端的 IP 地址決定。

為了返回 index 檔案,Nginx 首先檢查檔案是否存在,然後將 index 檔名新增到請求的 URI 之後構成新的 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 匹配到,在這個 location 內通過 fastcgi_pass 指定的 FastCGI 處理請求。

2. 檢查檔案是否存在(try_files 指令)

try_files 指令可以檢查指定的檔案或目錄是否存在,從而執行內部重定向或在檔案不存在的時候返回指定的 HTTP 狀態碼。

例如,通過 try_files 指令和 $uri 變數檢查和請求中的 URI 相關的檔案是否存在:

server {
    root /www/data;

    location /images/ {
        try_files $uri /images/default.gif;
    }
}

檔案以 URI 的形式指定,並且使用在當前 location 或 server 的上下文中設定的 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 / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

更多資訊可以檢視 Content Caching 內容快取,瞭解如何提高網站效能,深入瞭解 Nginx 的快取功能。

3. 優化 Nginx(Optimizing NGINX Speed for Serving Content)

載入速度是伺服器的一個關鍵指標。對 Nginx 配置進行微小的優化可能會提高生產力並實現最佳效能。

使能 sendfile 指令

預設情況下,Nginx 自己處理檔案傳輸並在傳送檔案之前將檔案複製到緩衝區中。啟用 sendfile 指令可以去掉將資料複製到緩衝區的步驟,並允許將資料從一個檔案描述符(file descriptor)直接複製到另一個檔案描述符。 為了防止一個快速連線完全佔用工作程序,可以通過定義 sendfile_max_chunk 指令來限制在單個 sendfile 呼叫中傳輸的資料量:

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    ...
}

使能 tcp_nopush 指令

tcp_nopush 指令需要和 sendfile 指令配合使用。
如果 tcp_nopush 指令和 sendfile 指令同時使能,則 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;
    ...
}

優化積壓佇列(Optimizing the Backlog Queue)

一個重要指標是 Nginx 能夠處理傳入連線的速度。常用規則是當連線建立時,它被放入偵聽套接字的“listen”佇列中。 在正常負載下,佇列很短,或者根本沒有佇列。但是在高負載下,佇列可能急劇增長,這可能會導致效能不均衡,連線丟失和延遲。

測量監聽佇列(Measuring the Listen Queue)

執行下面的命令可以測量監聽佇列(Linux 下的 netstat 命令不支援 -L 引數,需要使用命令 ss -l參考這裡):

netstat -Lan

輸出如下:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address         
0/0/128        *.12345            
10/0/128        *.80       
0/0/128        *.8080

上面的輸出顯示,在 80 埠的監聽佇列有 10 個未接受的連線,最大連線數限制為 128,這種情況是正常的。

然而,如果輸出是下面這樣子的:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address         
0/0/128        *.12345            
192/0/128        *.80       
0/0/128        *.8080

上面顯示有 10 個未接受的連線,超過了最大限制 128。在網站訪問量大時這種情況挺常見的。為了達到最佳效能,可以修改作業系統和 Nginx 配置,增加 Nginx 可以等待接受的佇列中的最大連線數。

調整作業系統(Linux,FreeBSD)

  • 對於 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,需要更改 Nginx 配置檔案中的 backlog 引數匹配這個設定:

server {
    listen 80 backlog=4096;
    # The rest of server configuration
}

相關推薦

Nginx 配置靜態資源伺服器

1. root 目錄和索引檔案 root 指令聲明瞭要查詢檔案的目錄。Nginx 會把請求的 URI 新增到 root 指令指定的路徑之後,來獲取請求檔案對應的目錄。root 指令可以放在 http、server 或 location 上下文的任何位置

Nginx部署vue專案,Nginx搭建一個靜態資源伺服器

一.Nginx安裝(Centos) yum install -y nginx  安裝後啟動nginx service nginx start 通過ip或者域名訪問以下,看看是不是啟動成功了 二.Nginx部署vue 1.vue專案編譯(推薦vue element-

nginx配置-優化靜態資源

開啟gzip功能,gzip就是對網路傳輸的資料進行壓縮處理,從而節省頻寬。開啟nginx.conf檔案,在http模組下增加gzip on; gzip_min_length 1k; gzip_buf

Nginx靜態資源伺服器開啟https配置及http rewrite到https

生成祕鑰 生成祕鑰key: openssl genrsa -des3 -out server.key 2048 然後你就獲得了一個server.key檔案. 以後使用此檔案(通過openssl提供的命令或API)可能經常回要求輸入密碼,如果想去除輸入

james配置需要身份認證的smtp伺服器

                   將james配置為需要身份認證的smtp伺服器   轉載:http://www.west.cn/www/info/63094-1.htm S

nginx搭建靜態資源伺服器

傳統的web專案,一般都將靜態資源存放在 webroot的目錄下,這樣做很方便獲取靜態資源,但是如果說web專案很大,使用者很多,靜態資源也很多時,伺服器的效能 或許就會很低下了。這種情況下一般都會需要一個靜態資源的伺服器。比如本次工作中,需把上傳的圖片放在靜態資源伺服器上,在資料庫中只記錄圖片的地

nginx作為靜態資源伺服器和動態代理的用法示例

專案描述 vue專案使用8090埠(提供頁面),java專案使用8080埠(提供ajax介面),nginx監聽80埠。此時,nginx配置如下: #java專案伺服器使用8080埠 upstream server_java { server 127.0.0.1:8080; }

Nginx 作為靜態資源伺服器

Nginx Windows 版本的啟動停止,重新載入配置 啟動 Windows版本下載解壓後有一個nginx.exe可執行檔案,雙擊啟動。 啟動後 瀏覽器訪問http://127.0.0.1 可以看到Nginx的歡迎頁面,說明已經啟動成功。 停止 在命令列中 cd {nginx_home} 到下載

linux使用Nginx搭建靜態資源伺服器

最近公司需要做一個宣傳片播放  視訊有點大 好幾百M 就想到使用Nginx來代理靜態資源,在過程中出現了一些問題,比如埠沒開、訪問是403等,沒有成功,後面慢慢查詢問題,才發現大部分部落格資料的都不全,所以在這裡記錄一下。  安裝過程本文就不提了 網上都有很多 本文主要說明 nginx.conf 的配置 如下

Windows下nginx作為靜態資源伺服器使用

一、Nginx下載與安裝 1、nginx官方下載地址:http://nginx.org/ 2、下載完後將壓縮包解壓即可 3、nginx配置檔案為根目錄下conf\nginx.conf 二、Nginx常用命令說明 cmd進入nginx安裝目錄 tasklist /fi "imagename e

Windows下nginx作為靜態資源伺服器使用小結

起因            最近在公司接個任務,說用nginx做靜態資源伺服器,給客戶端寫個更新程式,把更新包放nginx伺服器上。當然nginx作為一款輕量級的web伺服器/反向代理伺服器/郵件伺服器,對於這簡單的任務毛毛雨啦,在此總結一下nginx的使用,以備遺忘時翻看。

Windows下nginx作為靜態資源伺服器測試

1、修改nginx配置,新增以下配置   #url http://localhost/image/file/22.jpg 對應檔案 E:/image/image/file/22.jpg #url http://localhost/image/33.jpg 對應檔案 E:/

nginx配置本地靜態伺服器Mac

1、首先安裝HomeBrew 參考:https://jingyan.baidu.com/article/fec7a1e5ec30341190b4e7e5.html 2、然後通過brew安裝nginx brew install nginx 3、成功安裝後就

VS 2012開啟提示 未能網站×××配置使用 ASP.NET 4.5 和 尚未在Web伺服器上註冊,您需要手動Web伺服器配置使用ASP.NET 4.5

visual studio 2012開啟提示 未能將網站×××配置為使用 ASP.NET 4.5 和 尚未在Web伺服器上註冊,您需要手動將Web伺服器配置為使用ASP.NET 4.5 微軟網站下載

使用資料卷容器,配置Nginx Docker作為靜態檔案伺服器

該方法是直接使用命令列,當然也可使用Dockerfile檔案進行建立。 其實,使用docker建立nginx容器是很簡單的,但要和資料卷容器結合起來使用,即所有靜態檔案放在資料卷容器中,然後可以啟動多個nginx來訪問同一個資料卷容器(如果需要啟動多個數據卷容器

nginx教程第六篇:用HTTP核心模組配置一個靜態Web伺服器(二)

網路連線的設定 下面介紹網路連線的設定配置項: 1. 讀取HTTP頭部的超時時間 語法: client_header_timeout time( 預設單位: 秒) ; 預設: client_header_timeout 60; 配置塊: http、 serve

tomcat配置外部靜態資源映射路徑

docs usr 頁面 ext -- tween sign apps 測試 一、背景 1.有一個錄音軟件每天生成很多新的錄音文件。 2.現在想通過一個WEB項目頁面下載這些錄音文件。 3.很顯然這些錄音文件放在WEB項目下不是很合適(WEB項目更新是個大麻煩,海量的錄音文件

nginx配置靜態

con html 直接 引入 bubuko info amp htm onf 最近做門戶網站,使用了的nginx重寫規則 項目目錄下寫好 nginx.conf文件 然後在打開nginx配置文件,在server引入對應的重寫規則的文件就可以了 當然直接寫在配置裏面 lo

linux下的nginx配置(做靜態服務)

nginx配置較為複雜,基本的很好理解,也好學習,但是很多是要靠摸索來總結經驗的,接下來,拿券君就來說說自己的經驗,希望能對正在閱讀的你有一定的幫助。   nginx雖然只有小小的幾MB,但是功能超級強大,比如 a、反向代理 b、負載均衡 c 、cgi渲染 d、做靜

nginx之expires靜態資源快取

nginx.conf檔案配置: server { listen 80; server_name xxx.xxx.com; # 通過此語句來對映靜態資源 root /app/xxx/html/; location ~ .*