nginx配置web服務|反向代理|負載均衡

救苦救难韩天尊發表於2024-08-12

目錄
  • http模組
  • server模組(虛擬主機配置)
  • location模組
    • 基本語法
    • 匹配型別
      • 等號匹配(=
      • 正則匹配(~
      • 忽略大小寫的正則匹配(~*
    • 常見指令
    • 巢狀 location
  • 反向代理
  • 負載均衡
    • 步驟 1: 定義 Upstream 塊
    • 步驟 2: 配置 Server 和 Location 塊
    • 示例配置
    • 負載均衡策略
  • Q&A
    • 1.location裡root和alias的區別是什麼?

Nginx 配置檔案通常位於 /etc/nginx/nginx.conf 或者 /usr/local/nginx/conf/nginx.conf,具體位置取決於你的系統和安裝方式。配置檔案是 Nginx 的核心,用於定義伺服器如何執行以及如何處理請求。

http模組

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/mime.types;
}

解釋各個部分

  • user:定義執行 Nginx 程序的使用者和組。

  • worker_processes:指定 Nginx 應該啟動的工作程序數量。

  • error_log:定義錯誤日誌的位置。

  • pid:定義 Nginx 程序 ID 檔案的位置。

  • events:配置事件處理模型,如 worker_connections 設定每個工作程序可以同時開啟的最大連線數。

  • http:這是 Nginx 配置的主要部分,包括全域性設定、虛擬主機配置等。

  • include:用於包含其他配置檔案。

  • log_formataccess_log:用於定義訪問日誌的格式和位置。

  • sendfile, tcp_nopush, tcp_nodelay, keepalive_timeout:這些是提高效能和最佳化網路傳輸的選項。

  • types_hash_max_size:用於快取 MIME 型別的大小限制。

  • include:最後兩個 include 語句用於包含額外的配置檔案,比如站點配置或模組配置。

server模組(虛擬主機配置)

http 塊中,你可以定義多個 server 塊來配置不同的虛擬主機。每個 server 塊可以有以下引數:

server {
    listen 80;
    server_name example.com;

    root /var/www/example;
    index index.html index.htm;

    # 直接指定“/”可代替上面的“root”,能更靈活的配置其他選項
    location / {
        try_files $uri $uri/ =404;
    }

    # 更多 location 塊用於更詳細的 URL 路徑匹配和處理
}
  • listen:定義伺服器監聽的埠和地址。
  • server_name:定義域名或 IP 地址。可配置二級域名。
  • root:定義網站根目錄。
  • index:定義預設索引檔案,如果根目錄下的預設檔案不叫index.html而叫app.html,那麼需配置index為app.html。
  • location:定義 URL 的路徑匹配規則和處理方式。

location模組

server模組中的 location 塊是用來定義如何處理與特定 URL 模式匹配的 HTTP 請求的。location 塊允許你針對不同的 URL 路徑指定不同的處理邏輯,比如靜態檔案服務、動態內容處理、重定向、反向代理、負載均衡等。下面詳細解釋 location 的不同用法和語法:

基本語法

location 塊的基本語法如下:

location [=|~|~*|^~] /pattern {
    # 處理邏輯
}

其中 /pattern 是 URL 路徑的模式,可以是精確的字串、正規表示式或其他匹配型別。

匹配型別

假設我在/data/icons/目錄下有三個檔案favicon1.ico、favicon2.ico、favicon3.ico

等號匹配(=

當使用等號作為字首時,location 將只匹配完全相等的 URL 路徑。這是最高效的匹配型別,因為 Nginx 可以直接查詢而無需進行正規表示式匹配。

location = /favicon1.ico {
    root /data/icons;
}

正則匹配(~

使用波浪線作為字首時,location 將使用正規表示式來匹配 URL 路徑。

location ~ /favicon[2-3].ico {
    root /data/icons;
}

忽略大小寫的正則匹配(~*

類似正則匹配,但忽略大小寫。我們將favicon3.ico改成Favicon3.ico。

location ~* /favicon[2-3].ico {
    root /data/icons;
}

此時按照我們所理解的,訪問example.com/favicon3.ico應該能正常顯示,其實不然!需要訪問example.com/Favicon3.ico才能正常顯示。

為什麼呢?

因為,只是url和nginx這行配置忽略大小寫,讓url走這行配置的規則,並不是url和實際訪問資源忽略大小寫。實際訪問的時候還是要和資源名稱大小寫一致。

常見指令

location 塊內,你可以定義一系列指令來處理匹配到的請求。常見的指令包括:

  • root:設定該 location 下的文件根目錄。
  • alias:與 root 類似,但是 alias 直接對映 URL 到檔案系統路徑。
  • try_files:嘗試按給定順序查詢檔案。如果找不到,可以指定一個預設處理程式,如轉發到後端應用。
  • proxy_pass:用於設定反向代理,訪問服務而非靜態資源用這個。
  • rewrite:用於重寫 URL 或重定向請求。
  • return:立即返回一個 HTTP 響應碼和可選的內容。

巢狀 location

location 塊可以巢狀在另一個 location 塊內,允許更精細的控制。例如:

location / {
    root /www/;
    location ~ \.php$ {
        root /var/www/;
        fastcgi_pass   127.0.0.1:9000;
    }
}

在這個例子中,所有請求都預設指向 /www/ 根目錄,但 .php 副檔名的請求會被特殊處理,指向 /var/www/ 並透過 FastCGI 傳送給 PHP 處理器。

反向代理

假設你有一個後端應用伺服器執行在本地的 8000 埠,並且你想透過 Nginx 將所有對 example.com 的請求代理到這個後端伺服器,你可以使用以下配置:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 可選的其他配置
        proxy_redirect off;
        proxy_buffering off;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        send_timeout 60s;
    }
}

解釋配置

  • listen 80;:監聽 80 埠上的請求。
  • server_name example.com;:指定伺服器名稱,確保只有對 example.com 的請求被處理。
  • location / { ... }:定義所有請求都應該被代理。
  • proxy_pass http://127.0.0.1:8000;:將請求轉發到本地的 8000 埠。
  • proxy_set_header:設定代理傳遞的頭部資訊。這很重要,因為後端伺服器可能需要知道原始客戶端的資訊。
  • 其他 proxy_ 配置:這些設定用於最佳化代理連線的效能和可靠性。

負載均衡

在 Nginx 中配置負載均衡可以讓你在多臺後端伺服器之間分配客戶端的請求,以提高應用程式的可用性和響應速度,同時也可以增加系統的冗餘度。以下是使用 Nginx 配置基於輪詢(round-robin)策略的簡單負載均衡的步驟和示例配置:

步驟 1: 定義 Upstream 塊

首先,你需要定義一個 upstream 塊,它將包含一組後端伺服器的列表。這個 upstream 塊可以被多個 location 塊引用,用於負載均衡。

步驟 2: 配置 Server 和 Location 塊

接著,在 server 塊中使用 location 塊來指定哪些請求應該被代理到定義好的 upstream。這樣,Nginx 將根據負載均衡策略將請求分發到不同的後端伺服器。

示例配置

假設你有兩臺後端應用伺服器,分別執行在 backend1.example.com:8000backend2.example.com:8000,你可以使用以下配置來實現負載均衡:

upstream backend {
    server backend1.example.com:8000;
    server backend2.example.com:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解釋配置

  • upstream backend { ... }:定義了一個名為 backend 的上游伺服器組,包含了兩臺後端伺服器。
  • server backend1.example.com:8000;server backend2.example.com:8000;:指定了後端伺服器的地址和埠。
  • proxy_pass http://backend;:告訴 Nginx 將請求代理到 backend 上游伺服器組。

負載均衡策略

Nginx 預設使用輪詢(round-robin)策略,但你也可以使用其他策略,如最少連線(least connections)或雜湊(hash)策略。例如,為了使用最少連線策略,你可以修改 upstream 塊如下:

upstream backend {
    least_conn;
    server backend1.example.com:8000;
    server backend2.example.com:8000;
}

在這個配置中,least_conn; 指令告訴 Nginx 選擇連線數最少的伺服器來處理新的請求。還有其他策略配置可自行百度,這裡不做贅述。

以上是我在實際使用nginx時常用的配置,剩餘的配置在實際使用後再做持續補充~

Q&A

1.location裡root和alias的區別是什麼?

在 Nginx 的 location 塊中使用 rootalias 指令時,它們之間的主要區別在於如何解析 URL 到實際的檔案系統路徑。儘管這兩個指令都用於指定檔案的根目錄,但它們的工作方式有所不同。

**root** 指令

root 指令用於設定一個基準目錄,當與 location 結合使用時,Nginx 會將請求的 URI(統一資源識別符號)附加到 root 目錄的後面,然後查詢對應的檔案或目錄。這意味著,如果 root 設定為 /data/icons,並且 URL 請求為 /img/favicon1.ico,那麼 Nginx 會嘗試在 /data/icons/img/fabicon1.ico 查詢檔案。

示例:

location / {
    root /data/icons;
    # 請求 /img/favicon1.ico 會查詢 /data/icons/img/favicon1.ico
}

**alias** 指令

alias 指令則是用來做 URL 到檔案系統路徑的直接對映。當使用 alias 時,URL 的路徑部分將被完全替換為 **alias** 指定的路徑,而不是附加到其後。這意味著,如果 alias 設定為 /data/icons/img/,並且 URL 請求為 /img/favicon1.ico,那麼 Nginx 將在 /data/icons/img/favicon1.ico 直接查詢檔案,而不會把 /img/ 加在 alias 指定的路徑後面。

示例:

location /img/ {
    alias /data/icons/img/;
    # 請求 /img/favicon1.ico 會查詢 /data/icons/img/favicon1.ico
}

選擇使用 root 還是 alias 主要取決於你的具體需求。

一般情況下,nginx配置的良好習慣是:

  • 在location /中配置root目錄
  • 在location /path中配置alias目錄

相關文章