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

PHP 5.3.6 將 php-fpm 註冊為系統服務 (System V init / systemd) 完整指南

     編輯:PHP 綜合知識

背景

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`

方法一:使用官方提供的 init.d 腳本 (System V init)

  1. 複製腳本:
    cp -f /usr/local/src/php-5.3.6/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    
  2. 修改配置檔 (/usr/local/php/etc/php-fpm.conf) 確保 pid 路徑正確:
    pid = /usr/local/php/var/run/php-fpm.pid
    
  3. 賦予執行權限並註冊服務:
    
    chmod 755 /etc/init.d/php-fpm
    chkconfig --add php-fpm
    chkconfig php-fpm on
    
  4. 服務操作指令:
    
    service php-fpm start
    service php-fpm stop
    service php-fpm reload  # 平滑重載
    service php-fpm status
    

方法二:建立 systemd 服務單元 (CentOS 7 / RHEL 7+ 推薦)

  1. 建立服務檔案:
    
    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
    
  2. 重載 systemd 並啟用:
    
    systemctl daemon-reload
    systemctl enable php-fpm
    systemctl start php-fpm
    
  3. 常用操作:
    
    systemctl status php-fpm
    systemctl restart php-fpm
    systemctl reload php-fpm
    journalctl -u php-fpm -f  # 查看日誌
    

關鍵配置檔說明 (php-fpm.conf / www.conf)


; 全域設定
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 → 路徑錯誤。

平滑升級 PHP-FPM 零停機

  1. 編譯安裝新版 PHP 至新前綴 (如 /usr/local/php-new)。
  2. 複製配置檔至新版目錄,修改 pid、log、socket 路徑避免衝突。
  3. 啟動新版 php-fpm:/usr/local/php-new/sbin/php-fpm --fpm-config /usr/local/php-new/etc/php-fpm.conf。
  4. 驗證新版正常後,修改 Nginx fastcgi_pass 指向新版 socket/埠。
  5. nginx -s reload 切換流量。
  6. 停止舊版:kill -SIGQUIT `cat /usr/local/php/var/run/php-fpm.pid`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved