Nginx+PHP-FPM是运行PHP应用(如WordPress、Typecho、Laravel等)的主流方案。与Apache的mod_php相比,Nginx+PHP-FPM更加高效,资源占用更低,适合搬瓦工VPS的硬件配置。本文介绍完整的安装配置和性能优化方法。
Debian/Ubuntu 系统:
# 安装PHP和常用扩展
sudo apt update
sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring \
php-xml php-zip php-json php-opcache php-redis -y
# 查看安装的PHP版本
php -v
# 查看PHP-FPM服务状态
sudo systemctl status php8.2-fpm
CentOS/AlmaLinux 系统:
# 安装Remi源获取新版PHP
sudo yum install epel-release -y
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
sudo yum module enable php:remi-8.2 -y
sudo yum install php-fpm php-mysqlnd php-curl php-gd php-mbstring \
php-xml php-zip php-json php-opcache php-redis -y
sudo systemctl enable php-fpm
sudo systemctl start php-fpm
创建站点配置文件,将PHP请求转发给PHP-FPM处理:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php index.html;
# PHP文件处理
location ~ \.php$ {
# 检查文件是否存在,防止任意代码执行
try_files $uri =404;
# Unix Socket方式(推荐,性能更好)
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
# TCP方式(如果PHP-FPM配置监听端口)
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# FastCGI超时设置
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}
PHP-FPM进程池配置是性能优化的关键。编辑进程池配置文件:
# Debian/Ubuntu
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
# CentOS
sudo nano /etc/php-fpm.d/www.conf
搬瓦工VPS推荐配置(1GB内存):
[www]
user = www-data
group = www-data
; 监听方式(Unix Socket性能优于TCP)
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
; 进程管理方式
; static - 固定进程数(内存可预测)
; dynamic - 动态调整(推荐小内存VPS)
; ondemand - 按需创建(最省内存)
pm = dynamic
; dynamic模式参数
pm.max_children = 10 ; 最大子进程数
pm.start_servers = 3 ; 启动时创建的进程数
pm.min_spare_servers = 2 ; 最小空闲进程数
pm.max_spare_servers = 5 ; 最大空闲进程数
pm.max_requests = 500 ; 每个进程处理500个请求后重启(防止内存泄漏)
; 慢日志(排查性能瓶颈)
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s
; 单个请求最大执行时间
request_terminate_timeout = 300s
进程数计算方式:每个PHP-FPM进程约占用20-50MB内存。1GB内存的VPS预留400MB给系统和Nginx,剩余600MB可运行12-30个PHP进程。
Tip: 512MB内存的VPS建议使用 ondemand 模式,pm.max_children 设为5-8。
OPcache将PHP编译后的字节码缓存到共享内存中,避免每次请求都重新解析PHP文件,可大幅提升性能。编辑PHP配置:
# 查找OPcache配置文件
php -i | grep opcache
# 编辑配置
sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
[opcache]
opcache.enable=1
opcache.enable_cli=0
; 共享内存大小(MB)
opcache.memory_consumption=128
; 暂存池中字符串的最大数量
opcache.interned_strings_buffer=16
; 最大缓存文件数
opcache.max_accelerated_files=10000
; 检查文件更新的频率(秒),生产环境可设为0
opcache.revalidate_freq=2
; 快速关闭
opcache.fast_shutdown=1
; 保存文件/函数注释
opcache.save_comments=1
; JIT编译(PHP 8.0+)
opcache.jit=1255
opcache.jit_buffer_size=64M
配置完成后重启PHP-FPM:
sudo systemctl restart php8.2-fpm
在Nginx层面缓存PHP-FPM的响应结果,减少PHP执行次数:
# 在http块中定义缓存区域
http {
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2
keys_zone=php_cache:10m
max_size=512m
inactive=30m;
}
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php;
# 缓存Key
set $skip_cache 0;
# POST请求不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
# 带查询参数不缓存
if ($query_string != "") {
set $skip_cache 1;
}
# 后台管理页面不缓存
if ($request_uri ~* "/wp-admin/|/admin/") {
set $skip_cache 1;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# FastCGI缓存设置
fastcgi_cache php_cache;
fastcgi_cache_valid 200 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-FastCGI-Cache $upstream_cache_status;
}
}
编辑php.ini进行安全加固:
sudo nano /etc/php/8.2/fpm/php.ini
; 禁用危险函数
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
; 隐藏PHP版本信息
expose_php = Off
; 文件上传限制
upload_max_filesize = 20M
post_max_size = 25M
max_file_uploads = 10
; 内存和执行时间限制
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
; 错误日志(生产环境关闭显示)
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
; 会话安全
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
# 查看PHP-FPM进程状态
sudo systemctl status php8.2-fpm
# 查看PHP-FPM进程数和内存占用
ps aux | grep php-fpm | grep -v grep
# 启用PHP-FPM状态页面(在pool配置中)
# pm.status_path = /fpm-status
# 在Nginx中配置访问
# location /fpm-status {
# fastcgi_pass unix:/run/php/php8.2-fpm.sock;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# include fastcgi_params;
# allow 127.0.0.1;
# deny all;
# }
# 查看慢日志
sudo tail -f /var/log/php-fpm/slow.log
# 查看OPcache使用情况(创建PHP文件访问)
# <?php phpinfo(); ?>
Tip: 更多教程请查看新手教程。