PHP 5.3.3 起內建 php-fpm,無需外部補丁。編譯時加入 --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-libevent-dir=... 即可。但編譯安裝後缺乏標準的啟動腳本與服務管理,需手動配置。
php-fpm 主進程支援以下信號:
| 信號 | 動作 |
|---|---|
| SIGINT, SIGTERM | 立即終止 |
| SIGQUIT | 平滑終止 (處理完當前請求) |
| SIGUSR1 | 重新開啟日誌檔案 |
| SIGUSR2 | 平滑重載所有 worker 進程、重讀配置與二進制模組 |
範例:
# 停止
kill -SIGINT `cat /usr/local/php/var/run/php-fpm.pid`
# 平滑重載
kill -SIGUSR2 `cat /usr/local/php/var/run/php-fpm.pid`
cp -f /usr/local/src/php-5.3.6/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
/usr/local/php/etc/php-fpm.conf) 確保 pid 路徑正確:
pid = /usr/local/php/var/run/php-fpm.pid
chmod 755 /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
service php-fpm start
service php-fpm stop
service php-fpm reload # 平滑重載
service php-fpm status
cat > /etc/systemd/system/php-fpm.service <<'EOF'
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm
systemctl restart php-fpm
systemctl reload php-fpm
journalctl -u php-fpm -f # 查看日誌
; 全域設定
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
; 池子設定 (www.conf)
[www]
user = www
group = www
listen = 127.0.0.1:9000
; listen = /tmp/php-fpm.sock # Unix socket 效能更好
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
slowlog = /usr/local/php/var/log/slow.log
request_slowlog_timeout = 5s
request_terminate_timeout = 30s
php_admin_value[error_log] = /usr/local/php/var/log/php-errors.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
netstat -tlnp | grep 9000 確認監聽埠。ps aux | grep php-fpm 確認主進程與 worker 進程。phpinfo.php 確認 Server API: FPM/FastCGI。journalctl -u php-fpm 或 /usr/local/php/var/log/php-fpm.log。ERROR: unable to bind listening socket → 埠衝突或權限不足;ERROR: failed to open configuration file → 路徑錯誤。/usr/local/php-new)。/usr/local/php-new/sbin/php-fpm --fpm-config /usr/local/php-new/etc/php-fpm.conf。fastcgi_pass 指向新版 socket/埠。nginx -s reload 切換流量。kill -SIGQUIT `cat /usr/local/php/var/run/php-fpm.pid`。