首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP-FPM 核心配置參數詳細解讀與調優指南

     編輯:PHP 相關知識

PHP-FPM (FastCGI Process Manager) 是 PHP 生產環境的標準運行模式。正確配置 php-fpm.conf 與池配置 www.conf,能顯著提升吞吐量、降低延遲、防止內存洩漏導致的 502 錯誤。本文逐項解讀核心參數,並提供不同場景的調優建議。

一、主進程全局配置 (php-fpm.conf)

二、池配置核心參數 (www.conf)

1. 監聽與訪問控制

; TCP 模式 (跨機器調用)
listen = 127.0.0.1:9000

; Unix Socket 模式 (同機器,性能更高,無 TCP 開銷)
; listen = /run/php/php7.4-fpm.sock

listen.backlog = 511           ; 內核等待隊列長度,高併發調大
listen.allowed_clients = 127.0.0.1 ; 限制訪問 IP,多台 Nginx 用逗號分隔

; Socket 權限 (僅 Unix Socket 生效)
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

2. 進程管理策略 (pm)

參數默認值建議值/說明
pidvar/run/php-fpm.pid建議啟用,便於監控腳本發送信號
error_logvar/log/php-fpm.log單獨存放,方便 ELK 收集
log_levelnotice生產環境 warning;調試時 debug
emergency_restart_threshold60配合 interval 使用,防止子進程頻繁 Segfault 拖垮主進程
emergency_restart_interval60s同上
process_control_timeout0子進程等待主進程信號超時,建議 5-10s
daemonizeyes生產必須 yes;容器化/前台調試改 no
模式適用場景關鍵參數
static專用高配服務器、流量穩定、追求極致性能pm.max_children 固定進程數
dynamic通用場景、共享主機、流量波動大max_children, start_servers, min_spare_servers, max_spare_servers
ondemand低流量、間歇性請求、節省記憶體max_children, process_idle_timeout

Dynamic 模式參數調優公式

; 假設服務器 4GB 內存,系統/其他佔 1GB,留 3GB 給 PHP-FPM
; 單進程平均內存 30MB (含 opcode cache、擴展、請求上下文)
pm.max_children = 3072 / 30 ≈ 100

pm.start_servers = 20          ; 啟動時預熱進程數
pm.min_spare_servers = 10      ; 空閒最小值,低於此創建新進程
pm.max_spare_servers = 30      ; 空閒最大值,高於此回收進程

; 關鍵:防止內存洩漏累積
pm.max_requests = 500          ; 每進程處理 500 請求後重生 (0=不限)
; 配合 opcache.revalidate_freq=60 實現代碼熱更新

3. 超時與慢日誌 (排查 502/504 神器)

; 請求硬性超時 (對應 Nginx fastcgi_read_timeout 需一致或略小)
request_terminate_timeout = 30s  ; 0=關閉,建議 30-60s

; 慢日誌:超過此時間記錄完整調用堆棧
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log

; 狀態頁面 (需 Nginx location /status 轉發)
pm.status_path = /status
ping.path = /ping
ping.response = pong

4. 資源限制

; 文件描述符上限 (ulimit -n 需同步調大)
rlimit_files = 65535

; 核心轉儲大小 (調試 coredump 時設 unlimited)
rlimit_core = 0

; 安全加固
; chroot = /var/www          ; 啟用 chroot 隔離 (需完整根目錄)
; chdir = /var/www/html      ; 啟動工作目錄
catch_workers_output = yes   ; 將 stdout/stderr 導向 error_log

5. 用戶/組與環境變量

user = www-data
group = www-data

; 傳遞環境變量給 PHP 腳本
env[HOSTNAME] = $HOSTNAME
env[APP_ENV] = production
env[DB_HOST] = 127.0.0.1

三、典型場景配置模板

場景 A:高併發 API 服務器 (8核 16GB,靜態模式)

pm = static
pm.max_children = 300
pm.max_requests = 1000
request_terminate_timeout = 20s
request_slowlog_timeout = 2s
rlimit_files = 65535

場景 B:中小型綜合 Web 服務器 (2核 4GB,動態模式)

pm = dynamic
pm.max_children = 80
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 25
pm.max_requests = 500
request_terminate_timeout = 30s
request_slowlog_timeout = 5s

場景 C:低流量個人博客/內部系統 (1核 1GB,按需模式)

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 60s
pm.max_requests = 200
request_terminate_timeout = 60s

四、監控與排查實戰

  1. 狀態頁面:訪問 https://host/status?full&json 獲取實時進程狀態、請求耗時、內存用量。
  2. 慢日誌分析:grep -A 20 \"script_filename\" www-slow.log | head -50 定位慢查詢、外部 API 阻塞、死循環。
  3. 進程數監控:watch -n 1 'ps aux | grep php-fpm | wc -l' 觀察動態伸縮情況。
  4. 內存洩漏定位:配合 pm.max_requests 強制重生 + memory_get_peak_usage() 記錄峰值。

五、Nginx 協同配置要點

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 或 127.0.0.1:9000
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

    # 超時必須 ≤ FPM request_terminate_timeout
    fastcgi_read_timeout 30s;
    fastcgi_send_timeout 30s;

    # 緩衝區優化大文件上傳/下載
    fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
}

核心原則:Nginx 超時 ≤ FPM 超時,避免 Nginx 先切斷連接導致 FPM 繼續佔用進程處理已無客戶端的請求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved