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"
}
}
}
內容解密
- type: 指定應用程式的語言為 PHP。
- processes: 設定 PHP 應用程式的工作程式數量為 2。
- root: 定義應用程式的根目錄為
/var/www/app/
。 - index: 指定預設的索引檔案為
index.php
。 - user 和 group: 設定執行應用程式的使用者和群組。
Listener 物件設定
要讓 NGINX Unit 監聽特定的 IP 和埠,需要定義一個 Listener 物件。
基本範例
{
"listeners": {
"*:8080": {
"pass": "applications/my-app"
}
}
}
內容解密
*:8080
: 表示監聽所有 IP 地址的 8080 埠。- pass: 將請求直接傳遞給名為
my-app
的應用程式。 - 在版本 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"
}
}
]
}
}
內容解密
- match: 定義匹配條件,可以根據
host
、method
和uri
。 - action: 指定匹配後的動作,目前僅支援
pass
屬性,用於將請求導向指定的應用程式。 - 當多個匹配條件同時使用時,它們之間的關係是邏輯 AND。
- 如果某個匹配條件使用了字串陣列,則陣列內的元素之間的關係是邏輯 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
內容解密
- NGINX Unit 可以透過服務管理器作為守護程式執行。
- 使用
init.d
或systemd
命令來控制 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 時,安全性是一個非常重要的考量因素。以下是一些需要特別注意的安全性實踐:
- 使用安全的通訊協定:確保使用 HTTPS 等安全協定來加密客戶端與伺服器之間的通訊。
- 限制存取許可權:為 NGINX Unit 的控制 API 設定嚴格的存取控制,確保只有授權的使用者可以進行組態變更。
- 定期更新與修補:定期更新 NGINX Unit 到最新版本,以取得最新的安全修補和功能改進。
NGINX Unit 的效能最佳化
為了確保 NGINX Unit 能夠高效執行,以下是一些效能最佳化的建議:
- 調整工作程式數量:根據伺服器的硬體資源,適當調整 NGINX Unit 的工作程式數量,以充分利用多核心 CPU 的優勢。
- 最佳化應用程式組態:針對特定的應用程式需求,最佳化其在 NGINX Unit 中的組態,例如調整快取策略、連線逾時設定等。
- 使用負載平衡:在多臺伺服器上佈署 NGINX Unit,並使用負載平衡技術分散請求,提高整體系統的吞吐量和可用性。
NGINX Unit 的發展方向包括但不限於以下幾個方面:
- 增強安全性功能:持續增強 NGINX Unit 的安全性功能,例如支援最新的安全協定和加密技術。
- 提高效能和可擴充套件性:不斷最佳化 NGINX Unit 的內部架構,提高其效能和可擴充套件性,以滿足日益增長的業務需求。
- 簡化組態和管理:改進 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 系統中用於管理服務的命令。start
和stop
分別用於啟動和停止服務。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:
建立證書包:
cat cert.pem ca.pem key.pem | sudo tee bundle.pem > /dev/null
上傳證書包到 NGINX Unit:
sudo curl -X PUT --data-binary @bundle.pem \ --unix-socket /var/run/control.unit.sock \ http://localhost/certificates/certificate-name
組態監聽器使用證書:
{ "*:8443": { "pass": "applications/app-name", "tls": { "certificate": "certificate-name" } } }
提交 TLS 組態:
sudo curl -X PUT -d @tls-listener.json \ --unix-socket /var/run/control.unit.sock \ http://localhost/config/listeners
內容解密
- 證書包包含了證書、證書授權鏈和私鑰。
- 證書被上傳到 NGINX Unit 的證書儲存後,可以被監聽器參照。
tls
組態指定了要使用的證書名稱。