網上教程良莠不齊,很多過時或配置錯誤。本文記錄在 Ubuntu 20.04/22.04 LTS 上使用官方倉庫 apt 快速部署 Nginx + PHP-FPM 生產環境的標準流程,驗證可用,適合快速上手與自動化腳本。
# 更新包索引
sudo apt update
# 安裝 Nginx、PHP-FPM 及常用擴展
sudo apt install -y nginx php-fpm php-mysql php-redis php-gd php-xml php-mbstring php-curl php-zip php-bcmath php-intl
# 驗證安裝
nginx -v
php -v
php-fpm -v
編輯默認站點配置(或新建 /etc/nginx/sites-available/your_site 並軟鏈到 sites-enabled):
sudo vim /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com; # 替換為你的域名或 _
root /var/www/html; # 站點根目錄
index index.php index.html index.htm; # 關鍵:添加 index.php
# 靜態文件優化
location / {
try_files $uri $uri/ =404;
# 可選:開啟目錄瀏覽 autoindex on;
}
# PHP 處理核心配置
location ~ \.php$ {
# 防止惡意腳本執行 (cgi.fix_pathinfo=0 需在 php.ini 設置)
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# 連接 PHP-FPM:推薦 Unix Socket (性能更好、安全)
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 注意版本號對應
# 或 TCP 連接(跨服務器/容器場景)
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
# 關鍵參數傳遞
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
# 拒絕訪問隱藏文件、版本控制目錄
location ~ /\.(git|svn|env|htaccess) {
deny all;
}
}
編輯 /etc/php/8.1/fpm/pool.d/www.conf (版本號對應):
# 運行用戶/組 (與 Nginx 一致,通常 www-data)
user = www-data
group = www-data
# 監聽方式:Unix Socket 推薦
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
# 進程管理模式:動態調整 (生產環境可改 static 固定數量)
pm = dynamic
pm.max_children = 50 # 最大進程數 (根據內存:總內存/單進程內存)
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
# 請求生命週期控制
pm.max_requests = 500 # 防止內存洩漏,處理 500 請求後重啟進程
# 慢日誌 (排查性能瓶頸)
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log
編輯 /etc/php/8.1/fpm/php.ini:
# 安全
cgi.fix_pathinfo = 0 # 防止任意文件執行漏洞
expose_php = Off # 隱藏 PHP 版本
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
# 性能
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
post_max_size = 50M
upload_max_filesize = 50M
# OPcache (生產必開)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 1
# 錯誤日誌
log_errors = On
error_log = /var/log/php-fpm/error.log
display_errors = Off
# 測試配置語法
sudo nginx -t
sudo php-fpm8.1 -t
# 重啟服務
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
# 設置開機自啟
sudo systemctl enable php8.1-fpm nginx
# 驗證 PHP 處理
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
curl https://localhost/info.php | grep "PHP Version"
為每個站點創建獨立 PHP-FPM 池(不同 Socket、用戶、權限),實現賬號級隔離:
# /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1_user
group = site1_group
listen = /run/php/site1.sock
...
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
# 自動續期已配置 systemd timer
| 現象 | 排查方向 |
|---|---|
| 502 Bad Gateway | PHP-FPM 未啟動、Socket 路徑錯誤、權限不足、進程數耗盡 |
| File not found | SCRIPT_FILENAME 參數錯誤、root 路徑不匹配、cgi.fix_pathinfo=1 |
| 權限拒絕 | 目錄所有者非 www-data、Socket 權限 0660 導致 Nginx 讀取失敗 |
| 上傳大文件失敗 | client_max_body_size、upload_max_filesize、post_max_size 限制 |
使用 Ubuntu 官方倉庫部署 Nginx + PHP-FPM 是最穩健、可維護的方式:版本經過測試、安全更新及時、配置規範。關鍵點在於:Unix Socket 通信、OPcache 啟用、進程池合理配置、權限正確、禁用危險函數。掌握此流程,可輕鬆擴展至 Ansible/Docker 自動化部署。