高流量的网站需要对服务进行特殊配置。根据所选服务的不同,有一些推荐措施可以提升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服务配置,服务器资源得到充分利用,而不是像之前那样闲置。