Skip to main content

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. 优化效果验证

优化前后对比指标:

  1. 请求响应时间 (使用 absiege)
  2. 并发处理能力
  3. 内存占用情况
  4. CPU利用率
  5. 吞吐量 (Requests/sec)

通过以上优化,Nginx + PHP 8 + PHP-FPM 的性能通常可以提高3-5倍,特别是在高并发场景下效果更为显著。建议每次修改配置后都进行压力测试,观察系统资源使用情况,逐步调整到最佳状态。