Nginx+PHP-FPM环境配置优化


Nginx+PHP-FPM是运行PHP应用(如WordPress、Typecho、Laravel等)的主流方案。与Apache的mod_php相比,Nginx+PHP-FPM更加高效,资源占用更低,适合搬瓦工VPS的硬件配置。本文介绍完整的安装配置和性能优化方法。

安装PHP-FPM

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

Nginx配置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进程池配置

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配置

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

FastCGI缓存

在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安全配置

编辑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: 更多教程请查看新手教程
关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工 BandwagonHost 的优惠信息、使用教程和方案对比,方便中文用户选购和使用。

新手必读
搬瓦工优惠码

当前最大折扣优惠码:

NODESEEK2026(优惠 6.77%)

在购买方案时填入优惠码即可自动抵扣。详见 优惠码使用教程