Nginx + PHP 8 + PHP-FPM 性能优化指南
1. PHP-FPM 配置优化
主配置文件优化 (/etc/php/8.x/fpm/php-fpm.conf
)
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s
进程池优化 (/etc/php/8.x/fpm/pool.d/www.conf
)
[www]
user = www-data
group = www-data
; 动态进程管理 - 根据服务器内存调整
pm = dynamic
pm.max_children = 100 ; 最大子进程数 = (总内存 - 其他服务内存) / 单个PHP进程内存
pm.start_servers = 20 ; 启动时的子进程数 = CPU核心数 × 2
pm.min_spare_servers = 10 ; 最小空闲进程数 ≈ CPU核心数
pm.max_spare_servers = 30 ; 最大空闲进程数 ≈ CPU核心数 × 2
pm.max_requests = 500 ; 每个子进程处理多少请求后重启
; 提高进程优先级
process.priority = -10
; 优化进程通信
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; 启用慢日志
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s
; 限制单个请求资源
request_terminate_timeout = 30s
rlimit_files = 65535
rlimit_core = unlimited
2. PHP 8 配置优化 (/etc/php/8.x/fpm/php.ini
)
; 基础优化
max_execution_time = 30 ; 减少脚本执行时间
memory_limit = 128M ; 根据应用需求调整
upload_max_filesize = 16M
post_max_size = 18M
; OPcache 配置 (PHP 8 内置)
opcache.enable=1
opcache.memory_consumption=256 ; 根据应用大小调整
opcache.interned_strings_buffer=20
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60 ; 检查文件更改间隔(秒)
opcache.fast_shutdown=1
opcache.enable_cli=1 ; CLI也启用OPcache
opcache.jit_buffer_size=256M ; PHP 8 JIT 缓冲区大小
opcache.jit=1235 ; JIT模式 (4级优化)
; 禁用不必要功能
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
expose_php = Off
3. Nginx 配置优化
主配置文件 (/etc/nginx/nginx.conf
)
user www-data;
worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 每个worker能打开的文件描述符数量
events {
worker_connections 4096; # 每个worker最大连接数
multi_accept on; # 同时接受多个连接
use epoll; # Linux高性能事件模型
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
# 缓冲区优化
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 18m;
large_client_header_buffers 4 16k;
# 文件缓存
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# MIME类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
access_log off; # 生产环境可关闭或缓冲
error_log /var/log/nginx/error.log crit;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 包含站点配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
PHP站点配置示例
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
# 安全头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 365d;
access_log off;
add_header Cache-Control "public";
}
# PHP处理
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 优化FastCGI
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_read_timeout 60s;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 限制上传目录执行PHP
location ~* /uploads/.*\.php$ {
deny all;
}
}
4. 系统级优化
内核参数调整 (/etc/sysctl.conf
)
# 增加网络性能
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_syn_backlog = 262144
# 减少TCP连接时间
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 增加文件描述符限制
fs.file-max = 2097152
# 内存分配
vm.swappiness = 10
vm.vfs_cache_pressure = 50
应用修改:
sysctl -p
增加文件描述符限制 (/etc/security/limits.conf
)
* soft nofile 65535
* hard nofile 65535
www-data soft nofile 65535
www-data hard nofile 65535
5. 监控与调优工具
实时监控命令
# 查看PHP-FPM状态
sudo systemctl status php8.2-fpm
sudo journalctl -u php8.2-fpm -f
# 查看PHP-FPM进程
ps -ylC php-fpm8.2 --sort:rss
# Nginx状态
sudo systemctl status nginx
sudo tail -f /var/log/nginx/error.log
# 系统资源监控
htop
iftop -n
iotop -o
性能测试工具
# 安装基准测试工具
sudo apt install apache2-utils siege
# 压力测试
ab -n 10000 -c 100 http://example.com/
siege -b -c100 -t60S http://example.com/
6. 高级优化技巧
使用最新版本
# 升级到最新PHP 8.2/8.3
sudo apt install php8.3-fpm php8.3-opcache
# 使用最新Nginx主线版
sudo add-apt-repository ppa:nginx/development
sudo apt update
sudo apt install nginx
使用Unix Socket替代TCP
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
启用HTTP/2
listen 443 ssl http2;
使用 Brotli 压缩
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
7. 优化效果验证
优化前后对比指标:
- 请求响应时间 (使用
ab
或siege
) - 并发处理能力
- 内存占用情况
- CPU利用率
- 吞吐量 (Requests/sec)
通过以上优化,Nginx + PHP 8 + PHP-FPM 的性能通常可以提高3-5倍,特别是在高并发场景下效果更为显著。建议每次修改配置后都进行压力测试,观察系统资源使用情况,逐步调整到最佳状态。
No Comments