小服务器生存法则:2C4G VPS 的性能优化记录
记录 2C4G VPS 承载多个 WordPress 站点时,对 PHP-FPM、MySQL 与 OpenResty 进行的分阶段优化。
这台 2 核 4G 的云服务器承载着 3 个 WordPress 网站和 2 个静态页面。准备增加第 4 个 WordPress 站点时,我开始整理 PHP-FPM、MySQL 与 OpenResty 的资源占用。
先处理 PHP-FPM 的闲时进程,再根据实际诊断结果调整数据库和 Web 服务。
优化前的服务器状况
在开始任何操作前,先盘点一下服务器的初始状态,这有助于我们明确优化的目标。
- 服务器配置:2 核 CPU、4 GB 内存。
- 承载应用:3 个 WordPress 网站和 2 个静态 HTML 页面。
- 软件环境:PHP 8.x、MySQL 8.x。
- 已有优化:
- WordPress 后台已启用缓存插件(如 WP Super Cache)。
- 启用了 Redis 进行对象缓存。
- 静态资源(图片、CSS、JS)通过 CDN 分发。
尽管已经做过应用层优化,服务器的闲时内存占用依然不低。我想降低空闲时的资源占用,为第 4 个 WordPress 站点预留空间。
重要前提:在进行任何修改前,我通过服务商的控制台为服务器创建了快照。这是最重要的一步,它保证了在任何操作失误的情况下,我都能快速恢复到原始状态。
调整 PHP-FPM 进程管理器
经过分析,服务器性能瓶颈的首要怀疑对象指向了 PHP-FPM(FastCGI Process Manager)。它是 PHP 与 Web 服务器(如 Nginx)之间的桥梁,负责管理 PHP 的子进程池。它的运行模式,直接决定了服务器内存的消耗方式。
我查看了各个 WordPress 站点对应的 PHP-FPM 池配置文件(通常位于/etc/php/[版本号]/fpm/pool.d/目录下),发现了关键配置:
pm = dynamicpm代表 Process Manager(进程管理器)。dynamic(动态模式)是很多系统的默认设置。在这种模式下,即使网站没有任何访问,FPM 也会始终保持一定数量的“待命”子进程(由pm.min_spare_servers参数决定)。这些待命进程会持续占用内存,对于我这种访问量不大的个人站点来说,这是一种显著的资源浪费。
切换到 Ondemand 模式
ondemand模式是一种更为智能的进程管理方式。它的工作逻辑是:平时不创建任何子进程,完全不占用内存;只有当第一个 Web 请求到达时,才会“按需”启动一个子进程来处理。处理完成后,如果该进程闲置超过一定时间,就会被自动销毁,从而释放内存。
操作步骤
-
备份原有的 FPM 池配置文件。
-
编辑文件,修改
pm相关的配置。修改前:
pm = dynamicpm.max_children = 10pm.start_servers = 2pm.min_spare_servers = 1pm.max_spare_servers = 3修改后:
pm = ondemandpm.max_children = 10 ; 这个值暂时保留,代表最多能同时处理 10 个请求pm.process_idle_timeout = 10s ; 启用此项,表示进程闲置 10 秒后自动关闭; 以下三行在 ondemand 模式下无效,用分号注释掉; pm.start_servers = 2; pm.min_spare_servers = 1; pm.max_spare_servers = 3 -
对服务器上所有WordPress 站点的 FPM 池配置文件重复以上修改。
-
执行
systemctl restart php-fpm命令重启 PHP-FPM 服务,使新配置生效。
效果立竿见影:重启服务后,通过free -h命令查看,服务器在无访问状态下的可用内存(available)有了非常明显的增加。这第一刀,成功地为我“挤”出了宝贵的内存资源。
为容器化应用对齐环境
在完成已有站点的优化后,我使用 1Panel 的一键部署功能,安装了第四个 WordPress 站点。这引出了新的问题:如何为这个容器化的新站点进行同样的 PHP 优化?
经过探索发现,容器化应用的配置管理遵循不同的哲学。我们无法直接修改其内部的 FPM 配置文件。但 1Panel 的应用模板已经做好了预设,它通过挂载一个外部配置文件的方式来让我们调整 PHP 的核心参数。
操作步骤
- 在 1Panel 的文件管理器中,找到新应用目录下的
conf/uploads.ini文件。 - 编辑此文件,将 PHP 的核心参数(如
memory_limit,upload_max_filesize等)与老站点进行对齐。这确保了所有 PHP 应用的负载模型基本一致。 - 对于 FPM 的进程管理模式,我们相信 1Panel 使用的官方 WordPress 镜像已经默认采用了
ondemand或一个为容器环境高度优化的模式。我们无需、也无法直接干预。 - 修改完
uploads.ini后,在 1Panel 的应用管理界面对该应用执行“重建 (Rebuild)”操作,使新配置生效。
修改后需要观察 24 至 48 小时,再根据实际负载决定是否继续调整 pm.max_children。这次调整主要降低了空闲时的常驻进程数量,没有代替后续的数据库和请求链路检查。