⚙️ PHP-FPM

高效能 PHP FastCGI 程序管理員

PHP-FPM(FastCGI Process Manager)是 PHP 的 FastCGI 實作,搭配 Nginx 提供高效能 PHP 應用服務,支援多程序池隔離,避免單站故障影響整體。

安裝

$ sudo apt update && sudo apt install -y php8.3-fpm php8.3-mysql php8.3-redis \
  php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-gd
sudo systemctl enable --now php8.3-fpm
$ php --version && php-fpm8.3 --version

程序池設定(/etc/php/8.3/fpm/pool.d/www.conf)

[www]
user  = www-data
group = www-data

; 使用 Unix socket(比 TCP 效能更好)
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data

; 動態程序管理(依負載自動調整)
pm = dynamic
pm.max_children      = 20   ; 最多子程序數(RAM / 每程序使用量)
pm.start_servers     = 4    ; 啟動時建立的程序數
pm.min_spare_servers = 2    ; 最少閒置程序
pm.max_spare_servers = 6    ; 最多閒置程序
pm.max_requests      = 500  ; 每個程序處理 500 請求後重啟(防止記憶體洩漏)

; 慢請求日誌
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm-slow.log

與 Nginx 整合

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass   unix:/run/php/php8.3-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # 效能優化
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }

    # 禁止直接存取敏感檔案
    location ~ /\.(ht|git) { deny all; }
}
$ sudo nginx -t && sudo systemctl reload nginx

php.ini 常用設定(/etc/php/8.3/fpm/php.ini)

; 記憶體限制
memory_limit = 256M

; 上傳限制(需同時調整 Nginx 的 client_max_body_size)
upload_max_filesize = 50M
post_max_size       = 50M

; 執行時間
max_execution_time = 60

; 顯示錯誤(開發用,生產環境設 Off)
display_errors = Off
log_errors     = On
error_log      = /var/log/php8.3-fpm-error.log

; 時區
date.timezone = Asia/Taipei
$ sudo systemctl restart php8.3-fpm

常用操作

操作指令
重新載入設定sudo systemctl reload php8.3-fpm
完全重啟sudo systemctl restart php8.3-fpm
查看狀態sudo systemctl status php8.3-fpm
查看已安裝擴充php -m
安裝擴充sudo apt install php8.3-intl && sudo systemctl restart php8.3-fpm
查看設定值php -i | grep memory_limit