Chuyển đến nội dung chính

第1課:Nginx 介紹與安裝

介紹 Nginx 的事件驅動架構,提供在 Ubuntu/CentOS/macOS/Windows 上的安裝指南, 目錄結構,以及 start、stop、reload 等基本管理指令。 您將了解 Nginx 與 Apache 的差異,並學會排除常見錯誤。

🔒 DevSecOps — 第1課 第1課:Nginx 介紹與安裝

Nginx 從入門到進階

第1部:基礎

xdev.asia

1. 什麼是 Nginx?

Nginx(發音為「engine-x」)是由 Igor Sysoev 於 2004 年開發的強大高效能開源 Web 伺服器。最初是為了解決 C10K 問題(同時處理 1 萬個連線)而建立,如今已成為全球最受歡迎的 Web 伺服器之一。

Nginx 不只是 Web 伺服器,還可以作為:

  • 反向代理伺服器
  • 負載均衡器
  • HTTP 快取
  • 郵件代理伺服器
  • API 閘道

事件驅動與非阻塞 I/O 架構

Nginx 最大的優勢在於其架構。與傳統模型不同,Nginx 採用事件驅動和非阻塞 I/O(非同步)架構。

運作方式:

  1. 主處理程序(Master Process):單一主處理程序負責讀取和評估設定,並管理工作處理程序
  2. 工作處理程序(Worker Processes):多個工作處理程序處理實際連線
  3. 事件迴圈(Event Loop):每個工作處理程序使用事件迴圈同時處理數千個連線

非阻塞 I/O 的意義:

  • 當工作處理程序正在等待 I/O(讀取檔案、資料庫查詢、網路請求)時,不會「阻塞」,可以繼續處理其他請求
  • 單一工作處理程序可同時處理數千個連線
  • 大幅節省 CPU 和 RAM 資源

示意圖:

Apache(阻塞式):
請求 1 → 執行緒 1 → 等待讀取檔案(阻塞)→ 完成
請求 2 → 執行緒 2 → 等待讀取檔案(阻塞)→ 完成
請求 3 → 執行緒 3 → 等待讀取檔案(阻塞)→ 完成
→ 3 個請求需要 3 個執行緒

Nginx(非阻塞): 請求 1 → 工作者 → 等待 I/O → 處理請求 2 → 處理請求 3 → 請求 1 完成 請求 2 → 同一個工作者 請求 3 → 同一個工作者 → 3 個請求只需 1 個工作者


2. Nginx vs Apache 比較

比較項目 Nginx Apache
架構 事件驅動、非同步 行程/執行緒型
連線處理 單一工作者處理多個連線 每個連線一個執行緒/行程
記憶體 非常低,穩定 隨連線數增加
靜態內容 極快 快,但比 Nginx 慢
動態內容 需搭配後端(PHP-FPM) 可直接處理(mod_php)
設定 集中式,基於檔案 分散式(.htaccess)
模組 須預先編譯 動態載入
重寫規則 不同,較簡單 透過 .htaccess 強大
適合場景 高流量、靜態內容、反向代理 共享主機、動態內容處理

適合使用 Nginx 的情況:

  • 提供靜態檔案(HTML、CSS、JS、圖片)
  • 為應用程式伺服器做反向代理
  • 負載均衡
  • 高並行(大量同時連線)
  • 有限資源下需要高效能

適合使用 Apache 的情況:

  • 共享主機環境
  • 需要 .htaccess 的彈性
  • 需要大量動態模組
  • 依賴 Apache 特有功能的舊版應用

現在的趨勢: 許多系統採用組合方式:Nginx 作為前端反向代理,Apache 在後端處理動態內容。


3. 安裝 Nginx

3.1. 在 Ubuntu/Debian 上安裝

方式一:從預設套件庫安裝(最簡單)

# 更新套件清單
sudo apt update

安裝 Nginx

sudo apt install nginx -y

確認版本

nginx -v

確認狀態

sudo systemctl status nginx

方式二:從官方 Nginx 套件庫安裝(最新版本)

# 安裝前置套件
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

匯入官方 nginx 簽章金鑰

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

設定套件庫

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
http://nginx.org/packages/ubuntu lsb_release -cs nginx"
| sudo tee /etc/apt/sources.list.d/nginx.list

更新並安裝

sudo apt update sudo apt install nginx -y

3.2. 在 CentOS/RHEL 上安裝

方式一:從 EPEL 套件庫

# CentOS 7
sudo yum install epel-release -y
sudo yum install nginx -y

CentOS 8 / Rocky Linux / AlmaLinux

sudo dnf install nginx -y

啟動並啟用

sudo systemctl start nginx sudo systemctl enable nginx

開放防火牆

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload

方式二:從官方 Nginx 套件庫

# 建立 repo 檔案
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

安裝

sudo yum install nginx -y

3.3. 在 macOS 上安裝

使用 Homebrew:

# 安裝 Homebrew(若尚未安裝)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安裝 Nginx

brew install nginx

啟動 Nginx

brew services start nginx

或在前景執行

nginx

確認

nginx -v

macOS 上的路徑:

  • 設定:/usr/local/etc/nginx/nginx.conf
  • 文件根目錄:/usr/local/var/www
  • 記錄檔:/usr/local/var/log/nginx

3.4. 在 Windows 上安裝

步驟一:下載

步驟二:解壓縮並執行

# 解壓縮至 C:\nginx

以系統管理員身份開啟命令提示字元

cd C:\nginx

啟動 Nginx

start nginx

或

nginx.exe

在 Windows 上管理 Nginx:

# 確認版本
nginx -v

測試設定

nginx -t

停止

nginx -s stop

重新載入

nginx -s reload

優雅退出

nginx -s quit

注意: 在 Windows 上 Nginx 的穩定性不如 Linux,不建議用於正式環境。


4. 目錄結構與基本設定檔

4.1. Ubuntu/Debian 上的目錄結構

/etc/nginx/
├── nginx.conf                 # 主要設定檔
├── mime.types                 # MIME 類型定義
├── fastcgi_params            # FastCGI 參數
├── proxy_params              # 代理參數
├── sites-available/          # 可用的網站設定
│   └── default              # 預設虛擬主機
├── sites-enabled/            # 指向啟用網站的符號連結
│   └── default -> ../sites-available/default
├── conf.d/                   # 額外設定
├── modules-available/        # 可用模組
└── modules-enabled/          # 已啟用模組

/var/log/nginx/ ├── access.log # 存取記錄 └── error.log # 錯誤記錄

/var/www/html/ # 預設文件根目錄 └── index.nginx-debian.html

/usr/share/nginx/html/ # 替代文件根目錄

4.2. CentOS/RHEL 上的目錄結構

/etc/nginx/
├── nginx.conf                # 主要設定檔
├── mime.types
├── fastcgi_params
├── conf.d/                   # 虛擬主機設定
│   └── default.conf
└── default.d/

/var/log/nginx/ ├── access.log └── error.log

/usr/share/nginx/html/ # 文件根目錄 └── index.html

4.3. 基本 nginx.conf 設定檔

# 執行 Nginx 的使用者
user www-data;

工作處理程序數量(通常等於 CPU 核心數)

worker_processes auto;

PID 檔案

pid /run/nginx.pid;

載入動態模組

include /etc/nginx/modules-enabled/*.conf;

events { # 每個工作者的最大連線數 worker_connections 768;

# 事件方式(Linux 使用 epoll)
use epoll;

}

http { ## # 基本設定 ## sendfile on; tcp_nopush on; types_hash_max_size 2048;

# MIME 類型
include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# 記錄設定
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip 設定
##
gzip on;
gzip_disable "msie6";

##
# 虛擬主機設定
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

}

4.4. 範例虛擬主機檔案

server {
# 監聽連接埠
listen 80;
listen [::]:80;

# 域名
server_name example.com www.example.com;

# 文件根目錄
root /var/www/example.com;
index index.html index.htm;

# 存取和錯誤記錄
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;

# Location 區塊
location / {
    try_files $uri $uri/ =404;
}

# 拒絕存取 .htaccess
location ~ /\.ht {
    deny all;
}

}


5. 啟動、停止、重新載入 Nginx

5.1. 使用 systemctl 管理(Linux)

# 啟動 Nginx
sudo systemctl start nginx

停止 Nginx

sudo systemctl stop nginx

重新啟動 Nginx

sudo systemctl restart nginx

重新載入設定(零停機時間)

sudo systemctl reload nginx

確認狀態

sudo systemctl status nginx

啟用開機自動啟動

sudo systemctl enable nginx

停用自動啟動

sudo systemctl disable nginx

5.2. 使用 nginx 指令管理

# 測試設定(重新載入前務必執行)
sudo nginx -t

測試並顯示設定

sudo nginx -T

重新載入設定

sudo nginx -s reload

優雅停止(等待目前請求完成)

sudo nginx -s quit

立即停止

sudo nginx -s stop

重新開啟記錄檔(記錄輪替後)

sudo nginx -s reopen

查看版本和編譯選項

nginx -V

5.3. reload、restart 和 stop 的差異

reload:

  • 零停機時間
  • Nginx 重新讀取設定
  • 舊工作處理程序完成目前的請求後才關閉
  • 新工作處理程序以新設定建立
  • 使用時機: 修改設定、新增/修改虛擬主機
sudo nginx -s reload

或

sudo systemctl reload nginx

restart:

  • 有停機時間(短暫)
  • 完全停止後再啟動
  • 所有連線中斷
  • 使用時機: 安裝新模組、重大變更
sudo systemctl restart nginx

stop vs quit:

# 立即停止(切斷連線)
sudo nginx -s stop

優雅退出(等待請求完成)

sudo nginx -s quit

5.4. 確認 Nginx 正在執行

# 確認處理程序
ps aux | grep nginx

確認監聽連接埠

sudo netstat -tulpn | grep nginx

或

sudo ss -tulpn | grep nginx

確認版本

nginx -v

測試存取

curl http://localhost

或

curl -I http://localhost

5.5. 基本問題排除

錯誤:nginx.conf 測試失敗

# 查看詳細錯誤
sudo nginx -t

查看錯誤記錄

sudo tail -f /var/log/nginx/error.log

錯誤:連接埠 80 已被使用

# 查看哪個處理程序使用連接埠 80
sudo lsof -i :80

或

sudo netstat -tulpn | grep :80

若需要,終止處理程序

sudo kill -9 <PID>

錯誤:Permission denied

# 確認 nginx.conf 中的使用者
grep user /etc/nginx/nginx.conf

確認目錄權限

ls -la /var/www/html

修正擁有者

sudo chown -R www-data:www-data /var/www/html

無法透過瀏覽器存取:

# 確認防火牆(Ubuntu/Debian)
sudo ufw status
sudo ufw allow 'Nginx Full'

確認防火牆(CentOS)

sudo firewall-cmd --list-all sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload

確認 SELinux(CentOS)

sudo getenforce sudo setenforce 0 # 暫時停用以進行測試


6. 實作練習

練習 1:安裝與驗證

  1. 在您的作業系統上安裝 Nginx
  2. 確認版本和狀態
  3. 前往 http://localhost 查看預設歡迎頁面
  4. 找到並查看 access.log 檔案

練習 2:熟悉指令

  1. 測試設定:nginx -t
  2. 重新載入 Nginx
  3. 停止並重新啟動 Nginx
  4. 確認執行中的處理程序

練習 3:探索目錄結構

  1. 開啟 nginx.conf 並閱讀各項指令
  2. 在預設虛擬主機中找到文件根目錄
  3. 在文件根目錄中建立一個簡單的 HTML 檔案
  4. 透過瀏覽器存取該檔案

練習 4:修復刻意製造的錯誤

  1. 在 nginx.conf 中加入一行錯誤語法
  2. 執行 nginx -t 查看錯誤
  3. 修正錯誤並重新測試

總結

本課學習內容:

  • ✅ 什麼是 Nginx 及其事件驅動架構
  • ✅ Nginx vs Apache 比較
  • ✅ 在多個作業系統上安裝 Nginx
  • ✅ 目錄結構與設定檔
  • ✅ 基本 Nginx 管理指令

下一課: 我們將深入探討 Nginx 設定,了解 context、directive、虛擬主機以及靜態檔案的提供。