早期 PHP 在 Nginx 下運行主要依賴 spawn-fcgi 管理 FastCGI 進程,配置繁瑣、穩定性差、缺乏優雅重啟、進程監控等企業級特性。PHP 5.3 起將 PHP-FPM (FastCGI Process Manager) 納入核心源碼,PHP 5.4 進一步完善,成為生產環境標配。
static/dynamic/ondemand 三種模式,靈活適應不同負載。reload 平滑更新配置/代碼,零掉線部署。slowlog + request_slowlog_timeout 精準定位性能瓶頸。chroot、user/group、disable_functions 多層防護。www.conf; 選擇 static 模式,固定進程數,避免動態調整開銷
pm = static
pm.max_children = 80 ; 根據內存:總內存 4GB,預留 1GB 系統,每進程 30MB → ~100,留餘量設 80
pm.max_requests = 1000 ; 防內存洩漏,每處理 1000 請求重生
; 慢日誌
request_slowlog_timeout = 2s
slowlog = /var/log/php-fpm/www-slow.log
; 安全
security.limit_extensions = .php
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen
php_admin_value[open_basedir] = /var/www/html:/tmp
; 狀態頁
pm.status_path = /fpm-status
ping.path = /fpm-ping
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php;
# 靜態資源緩存
location ~* \.(css|js|png|jpg|jpeg|gif|ico|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public";
}
# PHP 處理
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 或 127.0.0.1:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 緩衝優化
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
# 超時設置
fastcgi_connect_timeout 3s;
fastcgi_send_timeout 10s;
fastcgi_read_timeout 30s;
}
# 禁止訪問隱藏文件、版本控制目錄
location ~ /\.(git|svn|htaccess|env) {
deny all;
}
}
| 指標 | 健康閾值 | 異常處理 |
|---|---|---|
| PHP-FPM 進程佔用內存 | < 總內存 70% | 調減 pm.max_children、排查內存洩漏 |
| 慢請求比例 | < 1% | 分析 slowlog,優化 SQL/外部調用 |
| 502 Bad Gateway | 0 | 檢查進程是否存活、socket 權限、連接數限制 |
| 請求排隊時間 | < 10ms | 擴容或優化代碼邏輯 |
ulimit -n)。reload(SIGUSR2),restart 會丟棄正在處理的請求。tini 或 dumb-init 作為入口點。PHP-FPM 將 PHP 從「臨時工」變為「正規軍」,配合 Nginx 事件驅動模型,構建起高性能、高穩定的 Web 服務基石。掌握其核心參數、監控指標與避坑經驗,是每位 PHP 運維/開發工程師的必修課。