php-fpm 的 pool 是什麼?
它是 PHP-FPM 的“<span style="color:red">進程池</span>”,用來按站點/應用把 PHP 解釋進程分組運行:每個 pool 有獨立的監聽地址、用户組、資源上限、日誌與健康檢查,從而實現<span style="color:red">隔離</span>、<span style="color:red">可觀測</span>與<span style="color:red">穩定吞吐</span> ✅。
關鍵點(直擊核心)
- 多 pool:按域名/租户拆分,避免相互拖垮,便於限流與故障定位。
- 三種 pm 模式:
static固定併發;dynamic根據空閒度調節;ondemand按需啓動,低 QPS 省內存。 - 核心參數:
pm.max_children(併發上限)、pm.max_requests(進程輪換)、request_terminate_timeout(超時兜底)、slowlog(慢調用抓取)。
配置示例(最小可用)
[shop]
user = www
group = www
listen = /run/php-fpm-shop.sock
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 1000
request_terminate_timeout = 30s
request_slowlog_timeout = 2s
slowlog = /var/log/php-fpm/slow-shop.log
php_admin_value[opcache.enable] = 1
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
security.limit_extensions = .php
pm.status_path = /status-shop
ping.path = /ping-shop
ping.response = pong
解釋:
[shop]定義名為 shop 的<span style="color:red">pool</span>;user/group用業務賬號隔離文件權限。listen採用 Unix Socket,listen.owner/group讓 Nginx 可讀寫。pm=dynamic以<span style="color:red">彈性併發</span>應對流量;max_children控制總體併發,start/min/max_spare_servers管理空閒容量。max_requests週期性重啓子進程,緩解內存碎片與泄漏。request_terminate_timeout強制超時切斷“懸掛請求”;slowlog+request_slowlog_timeout抓取<span style="color:red">慢腳本</span>堆棧。php_admin_value強制開啓 OPCache、限制高危函數;security.limit_extensions只執行.php。pm.status_path、ping.*提供<span style="color:red">健康探針</span>與狀態頁,便於監控。
常用操作
sudo systemctl reload php-fpm
解釋:平滑加載新配置,不中斷正在處理的請求;適合常規調參與灰度驗證。
參數説明表
| 指令 | 含義 | 建議與風險 |
|---|---|---|
| <span style="color:red">pm.max\_children</span> | 最大併發子進程 | 過小限吞吐,過大易 OOM;用內存測算。 |
| pm.max\_requests | 進程輪換閾值 | 500\~2000 視框架而定,緩解內存膨脹。 |
| request\_terminate\_timeout | 單請求上限 | 防止卡死/慢後端拖垮池;結合 Nginx 超時統一。 |
| slowlog / request\_slowlog\_timeout | 慢日誌 | 精準定位慢函數與數據庫調用 🔎。 |
| pm(static/dynamic/ondemand) | 併發策略 | 高峯穩定選 static,通用選 dynamic,低流量選 ondemand。 |
容量估算(公式 ✅)
$$ \text{max\_children}=\left\lfloor \frac{\text{可用內存(MB)}} {\text{單子進程常駐內存( MB )}} \right\rfloor $$
示例:4 GB 可用、單進程 \~60 MB ⇒ max_children≈68;再為系統與峯值預留 15% 安全邊界。
請求流轉(工作流程)
實戰要點 🧭
- 用多個 pool 做<span style="color:red">租户/應用隔離</span>,分別限併發與日誌。
- Socket 優先;跨機或容器編排再用 TCP。
- 結合
pm.status_path指標(空閒/活動/最大/隊列)與slowlog,滾動調參,先保穩定再提吞吐。 - 高併發框架配合短路緩存、連接池與只讀分離,避免把 PHP-FPM 當“線程池”硬抗數據庫慢查詢。
結論:把握三件事——<span style="color:red">併發上限</span>(max\_children)、<span style="color:red">超時與慢日誌</span>、<span style="color:red">多 pool 隔離</span>。按公式測算、用監控校準,你的 PHP-FPM 將既穩又快 🚀。