NGINX Unit 作為新一代應用伺服器,其靈活的組態和多語言支援特性吸引了眾多開發者。本文除了基本設定外,也深入探討如何透過控制 API 動態調整組態,包含應用程式生命週期管理、路由設定以及監聽器組態。同時也涵蓋安全性考量,例如應用程式隔離、使用者許可權控管以及 SSL/TLS 加密設定,確保伺服器執行安全無虞。最後,文章也提供一些效能最佳化策略,讓開發者可以根據實際應用場景調整 NGINX Unit,使其發揮最佳效能。

NGINX Unit 伺服器設定與操作

應用程式物件設定

在 NGINX Unit 中,每個應用程式都由一個應用程式物件定義。這個物件以 JSON 格式指定應用的屬性。每種應用程式型別都有其特定的必要屬性和可選屬性。Unit 的應用程式屬性控制了程式管理和限制。

必要屬性:type

  • type 屬性是唯一必要的程式管理屬性,用於定義應用程式的語言,如 PHP、Python、Golang、Ruby 或 Perl。

可選屬性

其他屬性包括:

  • 子程式數量限制
  • 請求時間限制
  • 使用者與群組設定
  • 環境變數
  • 工作目錄

PHP 應用範例

{
  "applications": {
    "my-php-app": {
      "type": "php",
      "processes": 2,
      "root": "/var/www/app/",
      "index": "index.php",
      "user": "app_user",
      "group": "app_group"
    }
  }
}

內容解密

  1. type: 指定應用程式的語言為 PHP。
  2. processes: 設定 PHP 應用程式的工作程式數量為 2。
  3. root: 定義應用程式的根目錄為 /var/www/app/
  4. index: 指定預設的索引檔案為 index.php
  5. usergroup: 設定執行應用程式的使用者和群組。

Listener 物件設定

要讓 NGINX Unit 監聽特定的 IP 和埠,需要定義一個 Listener 物件。

基本範例

{
  "listeners": {
    "*:8080": {
      "pass": "applications/my-app"
    }
  }
}

內容解密

  1. *:8080: 表示監聽所有 IP 地址的 8080 埠。
  2. pass: 將請求直接傳遞給名為 my-app 的應用程式。
  3. 在版本 1.8.0 之後,pass 屬性取代了 Listener 物件中的 application 屬性。

路由物件設定

路由物件允許在不同的 Listener 和應用程式之間進行內部路由。

使用路由陣列

{
  "listeners": {
    "*:8080": {
      "pass": "routes"
    }
  },
  "routes": [
    {
      "match": {
        "host": "blog.example.com"
      },
      "action": {
        "pass": "applications/blog"
      }
    },
    {
      "action": {
        "pass": "applications/my_app"
      }
    }
  ]
}

使用命名路由物件

{
  "listeners": {
    "*:8080": {
      "pass": "routes/main"
    }
  },
  "routes": {
    "main": [
      {
        "match": {
          "host": ["example.com", "www.example.com"]
        },
        "action": {
          "pass": "applications/website"
        }
      },
      {
        "match": {
          "uri": "/admin/*"
        },
        "action": {
          "pass": "applications/admin"
        }
      }
    ]
  }
}

內容解密

  1. match: 定義匹配條件,可以根據 hostmethoduri
  2. action: 指定匹配後的動作,目前僅支援 pass 屬性,用於將請求導向指定的應用程式。
  3. 當多個匹配條件同時使用時,它們之間的關係是邏輯 AND。
  4. 如果某個匹配條件使用了字串陣列,則陣列內的元素之間的關係是邏輯 OR。

NGINX Unit 伺服器啟動與關閉

在安裝 NGINX Unit 後,可以使用系統的服務管理器(如 init.d 或 systemd)來啟動或停止 Unit 服務。

在 init.d 系統上啟動/停止 Unit

sudo /etc/init.d/unit start
sudo /etc/init.d/unit stop

在 systemd 系統上啟動/停止 Unit

sudo systemctl start unit
sudo systemctl stop unit

內容解密

  1. NGINX Unit 可以透過服務管理器作為守護程式執行。
  2. 使用 init.dsystemd 命令來控制 Unit 服務的啟動和停止。

提交設定到 Unit 控制 API

要使 NGINX Unit 生效,需要透過其控制 API 提交組態物件。這部分內容將在後續章節中詳細介紹。

NGINX Unit 的高階組態與管理

使用 Mermaid 圖表呈現 NGINX Unit 的架構

  graph LR
    A[客戶端] -->|請求| B[NGINX Unit]
    B -->|路由| C[應用程式1]
    B -->|路由| D[應用程式2]
    C -->|處理| E[資料函式庫]
    D -->|處理| E

圖表翻譯: 此圖表展示了客戶端請求如何透過 NGINX Unit 被路由到不同的應用程式,並最終與資料函式庫互動的過程。

NGINX Unit 的安全性考量

在使用 NGINX Unit 時,安全性是一個非常重要的考量因素。以下是一些需要特別注意的安全性實踐:

  1. 使用安全的通訊協定:確保使用 HTTPS 等安全協定來加密客戶端與伺服器之間的通訊。
  2. 限制存取許可權:為 NGINX Unit 的控制 API 設定嚴格的存取控制,確保只有授權的使用者可以進行組態變更。
  3. 定期更新與修補:定期更新 NGINX Unit 到最新版本,以取得最新的安全修補和功能改進。

NGINX Unit 的效能最佳化

為了確保 NGINX Unit 能夠高效執行,以下是一些效能最佳化的建議:

  1. 調整工作程式數量:根據伺服器的硬體資源,適當調整 NGINX Unit 的工作程式數量,以充分利用多核心 CPU 的優勢。
  2. 最佳化應用程式組態:針對特定的應用程式需求,最佳化其在 NGINX Unit 中的組態,例如調整快取策略、連線逾時設定等。
  3. 使用負載平衡:在多臺伺服器上佈署 NGINX Unit,並使用負載平衡技術分散請求,提高整體系統的吞吐量和可用性。

NGINX Unit 的發展方向包括但不限於以下幾個方面:

  1. 增強安全性功能:持續增強 NGINX Unit 的安全性功能,例如支援最新的安全協定和加密技術。
  2. 提高效能和可擴充套件性:不斷最佳化 NGINX Unit 的內部架構,提高其效能和可擴充套件性,以滿足日益增長的業務需求。
  3. 簡化組態和管理:改進 NGINX Unit 的組態和管理介面,使其更加直觀和易於使用,降低使用者的學習曲線和管理成本。

NGINX Unit 的操作與安全性組態

NGINX Unit 是一種多功能的應用伺服器,能夠支援多種語言和框架的應用佈署。本篇文章將深入探討 NGINX Unit 的基本操作、組態方法及其安全性特點。

啟動與停止 NGINX Unit 服務

在 systemd 系統中,您可以使用以下命令來管理 NGINX Unit 服務:

# 啟動 NGINX Unit 服務
sudo systemctl start unit

# 停止 NGINX Unit 服務
sudo systemctl stop unit

# 在前臺啟動 NGINX Unit(用於測試或 Docker 環境)
sudo unitd --no-daemon

內容解密

  • systemctl 是 systemd 系統中用於管理服務的命令。
  • startstop 分別用於啟動和停止服務。
  • unitd --no-daemon 命令用於在前臺執行 NGINX Unit,這在測試或容器環境中非常有用。

組態 NGINX Unit

NGINX Unit 的組態是透過 RESTful API 進行的,所有組態都表示為一個 JSON 物件。您可以透過 curl 命令與控制通訊端互動來組態應用和監聽器。

步驟 1:找到控制通訊端

首先,您需要找到 NGINX Unit 控制通訊端的路徑。預設路徑通常是 /var/run/control.unit.sock

unitd -h

內容解密

  • unitd -h 命令顯示 NGINX Unit 的幫助資訊,包括控制通訊端的預設路徑。
  • 控制通訊端用於與 NGINX Unit 的 API 進行互動。

步驟 2:建立應用組態

您可以透過提交一個 JSON 檔案來建立應用組態:

{
  "applications": {
    "app-name": {
      "type": "php",
      "processes": 20,
      "root": "/var/www/app/",
      "index": "index.php"
    }
  }
}

使用 curl 命令將此組態提交到控制通訊端:

sudo curl -X PUT -d @/path/to/application-object.json \
--unix-socket /var/run/control.unit.sock \
http://localhost/config/applications/app-name

內容解密

  • curl 命令用於與 NGINX Unit 的 RESTful API 互動。
  • -X PUT 指定 HTTP 請求方法為 PUT,用於建立或更新組態。
  • --unix-socket 指定控制通訊端的路徑。
  • 組態檔案中定義了應用的型別、程式數、根目錄和索引檔案。

步驟 3:組態監聽器

您可以組態監聽器並將其指向應用:

sudo curl -X PUT \
-d '{"*:8080":{"pass":"applications/app-name"}}' \
--unix-socket /var/run/control.unit.sock \
http://localhost/config/listeners

內容解密

  • 此命令組態監聽器在所有網路介面的 8080 埠上監聽,並將請求傳遞給名為 app-name 的應用。
  • pass 屬性指定了請求應該被傳遞到的應用。

一次性組態應用和監聽器

您也可以一次性建立應用和監聽器的組態:

{
  "listeners": {
    "*:8080": {
      "pass": "applications/app-name"
    }
  },
  "applications": {
    "app-name": {
      "type": "php",
      "processes": 20,
      "root": "/var/www/app/",
      "index": "index.php"
    }
  }
}

將此組態提交到 NGINX Unit:

sudo curl -X PUT -d @config.json \
--unix-socket /var/run/control.unit.sock \
http://localhost/config/

內容解密

  • 此 JSON 檔案包含了監聽器和應用的完整組態。
  • 提交此組態將替換現有的所有監聽器和應用組態。

安全特性

NGINX Unit 提供多項安全特性,包括應用隔離、使用者許可權控制和 SSL/TLS 支援。

應用隔離

NGINX Unit 為每個應用建立獨立的程式,實作了應用之間的隔離。

{
  "applications": {
    "auth-service": {
      "type": "php",
      "processes": 10,
      "root": "/var/www/auth/",
      "index": "index.php",
      "user": "auth-app"
    },
    "key-service": {
      "type": "external",
      "processes": 2,
      "executable": "/var/key-service",
      "user": "key-app"
    }
  }
}

內容解密

  • 每個應用被組態為以不同的系統使用者執行,進一步增強了隔離性。
  • user 屬性指定了執行應用的系統使用者。

SSL/TLS 組態

您可以透過以下步驟組態 SSL/TLS:

  1. 建立證書包

    cat cert.pem ca.pem key.pem | sudo tee bundle.pem > /dev/null
    
  2. 上傳證書包到 NGINX Unit

    sudo curl -X PUT --data-binary @bundle.pem \
    --unix-socket /var/run/control.unit.sock \
    http://localhost/certificates/certificate-name
    
  3. 組態監聽器使用證書

    {
      "*:8443": {
        "pass": "applications/app-name",
        "tls": {
          "certificate": "certificate-name"
        }
      }
    }
    
  4. 提交 TLS 組態

    sudo curl -X PUT -d @tls-listener.json \
    --unix-socket /var/run/control.unit.sock \
    http://localhost/config/listeners
    

內容解密

  • 證書包包含了證書、證書授權鏈和私鑰。
  • 證書被上傳到 NGINX Unit 的證書儲存後,可以被監聽器參照。
  • tls 組態指定了要使用的證書名稱。