Image

知识库 → 在 VPS 上为高流量网站设置 php-fpm

[虚拟服务器] [VPS/VDS 上的应用]
出版日期: 04.06.2025

高流量的网站需要对服务进行特殊配置。根据所选服务的不同,有一些推荐措施可以提升VPS服务器的性能。

仅仅增加资源不足以实现VPS服务器的高性能——还需要对服务进行配置。

默认情况下,服务的设置是基础的,适用于流量较低或中等的典型项目。

为了更清晰地理解,我们将定义流量的标准:

  • 网站低流量:每月至多10,000次访问(每天约300次,每5分钟1次访问)。
  • 网站中等流量:每月10,000至90,000次访问——我们取平均值50,000次每月(每天约1,600次,每分钟1次访问)。
  • 网站高流量:每月100,000次访问及以上,即每分钟2次访问及以上。

我们来分析一种配置,其中nginx作为代理Web服务器,php-fpm(在本例中为php8.3-fpm)作为主要处理程序。

我们使用的是一台运行Linux Debian 12的VPS服务器,配备6个CPU核心、8GB内存和50GB SSD。

我们将专门针对php8.3-fpm优化性能。在默认配置下,我们运行了一个链接分析脚本,几分钟后,请求速率从每秒9个请求下降到5个。又过了5分钟,性能下降到每秒1.5个请求,服务开始出现瓶颈,很快就返回了Bad Gateway错误。

与此同时,服务器的负载没有显著增加,仍然有足够的资源来处理请求。

1. 新建php-fpm配置文件

在 /etc/php/8.3/fpm/pool.d/domain.conf 中创建一个新的配置文件。

将旧文件重命名为 www.conf.bak ——这样它就不会被使用,如果需要,可以通过移除 .bak 后缀恢复使用。

2. 配置详情

[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Process manager
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
pm.max_spawn_rate = 32
pm.process_idle_timeout = 10s

; Connection settings
listen.backlog = 65535
listen.allowed_clients = 127.0.0.1

; Timeouts
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm/slow.log

; Status monitoring
pm.status_path = /fpm-status
ping.path = /ping
ping.response = pong

; Logging
access.log = /var/log/php8.3-fpm/access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}dms"
catch_workers_output = yes
decorate_workers_output = no

; Security
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8
clear_env = no

; Performance tweaks
rlimit_files = 65535
rlimit_core = unlimited

; PHP settings
php_admin_value[error_log] = /var/log/php8.3-fpm/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 32M
php_admin_value[max_execution_time] = 30
php_admin_value[session.gc_maxlifetime] = 1440

3. 附加设置

如果日志目录不存在,请创建:

mkdir -p /var/log/php8.3-fpm

3.1 配置注释

  • listen = 127.0.0.1:9000 - 必须与nginx的配置一致,或反之。
  • pm.max_children = 50 - 取决于可用内存(每个子进程50MB → PHP约2GB)。
  • pm.start_servers = 10 - 约为 pm.max_children 的20%。
  • pm.max_requests = 500 - 在处理500个请求后重启工作进程,以防止内存泄漏(对访问者无感知,不影响运行)。
  • request_terminate_timeout = 30s - 终止挂起的请求。
  • request_slowlog_timeout = 5s - 记录慢请求。
  • slowlog = /var/log/php8.3-fpm/slow.log

对于基于CMS的网站,慢请求日志可能用处不大,因为它会显示调用堆栈,但可以提供有关请求开始和结束时间间隔的有用信息。

要监控 /fpm-status,请在nginx的服务器块中添加以下配置:

    location = /fpm-status {
        allow 127.0.0.1;    # 仅允许本地访问
        allow 192.168.10.100; # 或您的可信网络
        deny all;          # 拒绝其他所有访问

        include /etc/nginx/fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }

输出内容如下:

pool:                 www
process manager:      dynamic
start time:           04/Jun/2025:18:16:50 +0000
start since:          814
accepted conn:        239
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       9
active processes:     1
total processes:      10
max active processes: 3
max children reached: 0
slow requests:        0

4. 应用新配置

检查配置文件是否存在错误:

php-fpm8.3 -t

如果没有错误,重启服务:

systemctl restart php8.3-fpm

5. 重新测试

使用新配置后,在类似测试中CPU负载显著增加,但性能仅下降了20%(从每秒9个请求降至7个),几分钟后稳定。所有请求(25分钟内约10,000个请求,相当于每分钟400个请求或每秒约7个请求)均成功处理,状态码为200。

在同时测试和浏览网站页面时,视觉上明显感觉性能更快。现在,采用这种Web服务配置,服务器资源得到充分利用,而不是像之前那样闲置。





No Comments Yet