Web 伺服器(Nginx/Apache)本身只處理靜態資源。動態 PHP 程式碼需要「PHP 處理器」解析執行,再將結果(HTML/JSON)返還給 Web 伺服器發送給客戶端。不同運行模式本質上是「Web 伺服器與 PHP 進程通訊方式」的差異。
# 安裝 apt install libapache2-mod-php # Apache 載入模組 LoadModule php_module /usr/lib/apache2/modules/libphp.so
| 優點 | 缺點 |
|---|---|
| 安裝簡單、配置極少 | 僅支援 Apache |
| PHP 解釋器內嵌於 Apache 進程,通訊零開銷 | 每個 Apache 子進程都載入 PHP,靜態請求也佔用記憶體 |
| 支援 .htaccess 即時生效 | 修改 php.ini 需重啟 Apache |
| 相容性最好(舊專案) | 不適合高併發、大量靜態資源場景 |
適用場景:中小型 Apache 專案、共享主機、需 .htaccess 支援的舊系統
每請求 Fork 一個新進程執行 PHP,執行完銷毀。已淘汰,效能極差,僅作歷史參考。
# Apache 啟用 a2enmod proxy_fcgi # 配置 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
| 優點 | 缺點 |
|---|---|
| 通用協議,支援 Nginx/Apache/Lighttpd/IIS | 配置相對複雜 |
| 持久進程池,避免重複 Fork 開銷 | 需獨立管理 PHP 進程 |
| 支援多 PHP 版本共存 | 早期實現(mod_fcgid)進程管理功能弱 |
| 支援 suexec 隔離用戶權限 |
# 安裝 apt install php8.2-fpm # 核心配置 /etc/php/8.2/fpm/pool.d/www.conf [www] user = www-data group = www-data listen = /run/php/php8.2-fpm.sock # Unix Socket 效能更高 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 10
| 核心優勢 | 說明 |
|---|---|
| 優雅重啟 | 平滑重載配置/二進制,不丟失請求 |
| 進程管理 | 動態/靜態/按需模式,自適應負載 |
| 狀態監控 | 內建 /status 頁面,支援 Prometheus 整合 |
| 慢日誌 | request_slowlog_timeout 定位效能瓶頸 |
| 安全隔離 | chroot、chdir、disable_functions 每池獨立 |
| 緊急重啟 | emergency_restart_threshold 連續失敗自動重啟 |
# /etc/nginx/sites-available/default
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Unix Socket
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
# 靜態資源快取
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
| 模式 | 靜態請求 QPS | 動態請求 QPS | 記憶體佔用 | 維護難度 |
|---|---|---|---|---|
| mod_php | ★★★★★ | ★★★☆☆ | 高 | 低 |
| FastCGI (mod_fcgid) | ★★★★★ | ★★★★☆ | 中 | 中 |
| PHP-FPM | ★★★★★ | ★★★★★ | 可控 | 中 |
graph TD
A[Web Server] -->|Apache| B{專案類型}
B -->|舊專案/需.htaccess| C[mod_php]
B -->|現代專案/高併發| D[PHP-FPM]
A -->|Nginx| E[PHP-FPM 唯一選擇]
A -->|IIS| F[FastCGI/PHP-FPM]
D --> G[Unix Socket + 動態進程池]
G --> H[啟用 OPcache + JIT]
php-fpm,停用 libapache2-mod-phpproxy_fcgi 模組www.conf 進程池參數ProxyPassMatch 或 SetHandler$_SERVER['PHP_SELF'] 等變數行為一致pm.max_children 至 CPU 核心數 × 2-42024 年新專案無腦選 Nginx + PHP-FPM (Unix Socket)。mod_php 僅用於維護舊 Apache 專案。FastCGI 是協議,PHP-FPM 是目前最成熟的實現。理解本質差異,才能在架構演進中做正確決策。