1. 什麼是 Nginx?
Nginx(發音為「engine-x」)是由 Igor Sysoev 於 2004 年開發的強大高效能開源 Web 伺服器。最初是為了解決 C10K 問題(同時處理 1 萬個連線)而建立,如今已成為全球最受歡迎的 Web 伺服器之一。
Nginx 不只是 Web 伺服器,還可以作為:
- 反向代理伺服器
- 負載均衡器
- HTTP 快取
- 郵件代理伺服器
- API 閘道
事件驅動與非阻塞 I/O 架構
Nginx 最大的優勢在於其架構。與傳統模型不同,Nginx 採用事件驅動和非阻塞 I/O(非同步)架構。
運作方式:
- 主處理程序(Master Process):單一主處理程序負責讀取和評估設定,並管理工作處理程序
- 工作處理程序(Worker Processes):多個工作處理程序處理實際連線
- 事件迴圈(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/ubuntulsb_release -csnginx"
| 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 -yCentOS 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 上安裝
步驟一:下載
- 前往:http://nginx.org/en/download.html
- 下載 Windows 版本(nginx-x.x.x.zip)
步驟二:解壓縮並執行
# 解壓縮至 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:安裝與驗證
- 在您的作業系統上安裝 Nginx
- 確認版本和狀態
- 前往 http://localhost 查看預設歡迎頁面
- 找到並查看 access.log 檔案
練習 2:熟悉指令
- 測試設定:
nginx -t - 重新載入 Nginx
- 停止並重新啟動 Nginx
- 確認執行中的處理程序
練習 3:探索目錄結構
- 開啟 nginx.conf 並閱讀各項指令
- 在預設虛擬主機中找到文件根目錄
- 在文件根目錄中建立一個簡單的 HTML 檔案
- 透過瀏覽器存取該檔案
練習 4:修復刻意製造的錯誤
- 在 nginx.conf 中加入一行錯誤語法
- 執行
nginx -t查看錯誤 - 修正錯誤並重新測試
總結
本課學習內容:
- ✅ 什麼是 Nginx 及其事件驅動架構
- ✅ Nginx vs Apache 比較
- ✅ 在多個作業系統上安裝 Nginx
- ✅ 目錄結構與設定檔
- ✅ 基本 Nginx 管理指令
下一課: 我們將深入探討 Nginx 設定,了解 context、directive、虛擬主機以及靜態檔案的提供。