Nginx 充當「轉發官」:接收 HTTP 請求 → 根據 location 規則匹配 .php → 轉發給 PHP-FPM (FastCGI Process Manager)。
PHP-FPM 充當「調度員」:管理 PHP Worker 進程池 → 接收請求 → 派發空閒 Worker 執行腳本 → 返回結果給 Nginx。
溝通方式:listen 指令定義的 Socket 文件 (Unix Domain Socket) 或 TCP 端口 (127.0.0.1:9000)。
# 更新索引並安裝 Nginx
sudo apt update && sudo apt install nginx
# 安裝 PHP 7.0 FPM 及常用擴展
sudo apt install php7.0-fpm php7.0-mysql php7.0-common php7.0-curl php7.0-cli php7.0-mcrypt php7.0-mbstring php7.0-dom php7.0-xml php7.0-gd php7.0-zip
# 多裝常用擴展預防後續報錯,缺什麼再補裝即可
編輯 /etc/php/7.0/fpm/pool.d/www.conf (CentOS/編譯安裝路徑可能為 /etc/php-fpm.d/www.conf):
; 方式 A:Unix Socket (推薦,本機通信性能更高、無 TCP 開銷)
listen = /run/php/php7.0-fpm.sock
; 權限設置 (Nginx 進程用戶需可讀寫)
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; 方式 B:TCP 端口 (適合 Nginx 與 PHP-FPM 分離部署)
; listen = 127.0.0.1:9000
記住 listen 的值,Nginx 必須完全一致。
編輯 /etc/nginx/sites-enabled/default (或站點配置文件) server {} 塊內:
location ~ \.php$ {
include snippets/fastcgi-php.conf; # 內含 fastcgi_param 標準參數
# 方式 A:對應 Unix Socket
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
# 方式 B:對應 TCP 端口 (二選一,取消註釋對應行)
# fastcgi_pass 127.0.0.1:9000;
}
www-data) 或至少有同組權限。root /var/www/html;) 需被 PHP-FPM 進程可讀取。fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 必須正確映射腳絕對路徑 (通常在 fastcgi-php.conf 中已定義)。sudo systemctl restart php7.0-fpm nginx。echo '' | sudo tee /var/www/html/info.php。https://your-server-ip/info.php,應顯示 PHP 7.0 信息頁面。| 現象 | 原因 | 解決 |
|---|---|---|
| 502 Bad Gateway | Nginx 連不上 PHP-FPM | 檢查 listen 路徑/端口是否一致、Socket 文件權限、PHP-FPM 進程是否運行 |
| File not found / Primary script unknown | SCRIPT_FILENAME 映射錯誤 | 確認 root 指令、fastcgi_param SCRIPT_FILENAME、chroot 設置 |
| 權限拒絕 | 目錄/文件權限不足 | chown -R www-data:www-data /var/www/html; chmod 755 目錄 / 644 文件 |
| 變更不生效 | 未重啟對應服務 | systemctl reload php7.0-fpm nginx |
pool.d/site1.conf),不同用戶運行,實現隔離。opcache.enable=1、opcache.memory_consumption=128、opcache.validate_timestamps=0 (生產環境需手動清理或部署時重啟)。pm = dynamic (按需啟動) 或 pm = static (固定進程數,高併發穩定)。slowlog = /var/log/php-fpm/$pool-slow.log、request_slowlog_timeout = 5s。