所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
LiteSpeed 主机 管理 虚拟服务器

VPS 上的 PHP 模式:mod_php vs FastCGI vs PHP-FPM — 完整指南

PHP 为互联网上超过 80% 的网站提供支持,但最容易被忽视的性能决策之一是选择正确的 PHP 执行模式。选择错误的模式,你将面临缓慢的加载时间、过度的 RAM 消耗和流量峰值下的服务器崩溃。选择正确的模式,你的应用程序将轻松扩展,即使在高并发负载下也是如此。

本指南分解了三种主要的 PHP 执行模式 — mod_phpFastCGIPHP-FPM — 包括真实的性能背景、配置示例和针对不同用例的明确建议。无论你运行个人博客还是高流量电子商务平台,理解这些模式对于充分利用服务器环境至关重要。

什么是 PHP 执行模式?{#what-are-php-execution-modes}

PHP 执行模式定义了您的 Web 服务器如何解释和运行 PHP 脚本。它确定了 Web 服务器进程(Apache、Nginx、LiteSpeed)与 PHP 解释器之间的关系——具体来说,它们是共享同一进程、通过协议通信,还是作为完全独立的托管服务运行。

三种主要模式是:

模式架构最适合
mod_phpPHP 嵌入在 Apache 中简单的共享环境
FastCGIPHP 作为单独的进程中等流量网站
PHP-FPM托管 PHP 进程池高流量、生产应用

选择正确的模式直接影响内存使用请求吞吐量隔离可扩展性。在VPS 托管环境中,资源是专用的且可配置的,您可以完全自由地实施最适合您工作负载的任何模式。

mod_php — 经典的 Apache 模块

什么是 mod_php?

mod_php 是一个 Apache 模块,它将 PHP 解释器直接嵌入到 Apache Web 服务器进程中。这是运行 PHP 最古老且历史上最常见的方法。

mod_php 的工作原理

当 Apache 收到对 .php 文件的请求时,它在内部处理执行 — 不会生成外部进程,不会发生套接字通信。PHP 存在于 Apache 本身内部。

Browser Request → Apache (with embedded PHP) → Response

性能特征

对于低流量网站和开发环境,mod_php 的性能是可以接受的。由于 PHP 已经加载到 Apache 的内存中,每个请求都没有进程生成的开销。

但是,这种架构有一个严重的缺陷:每个 Apache 工作进程都在内存中携带完整的 PHP 解释器,无论它是在服务 PHP 文件还是静态资源(如图像或 CSS 文件)。

mod_php 的缺点

  • 内存消耗高:每个 Apache 工作进程(即使是那些服务静态文件的)都在 RAM 中保持完整的 PHP 运行时。
  • 没有按站点隔离:所有虚拟主机共享相同的 PHP 进程和用户上下文,这在多租户服务器上存在安全隐患。
  • 配置灵活性有限:在没有重大变通的情况下,无法为不同的虚拟主机运行不同的 PHP 版本。
  • 与 Nginx 不兼容mod_php 仅限于 Apache;它不能与 Nginx 或 LiteSpeed 一起使用。
  • 在负载下可扩展性差:在高并发情况下,内存耗尽成为真实风险。

何时使用 mod_php

  • 本地开发环境
  • 非常低流量的个人网站
  • 无法重新配置的遗留应用程序

FastCGI — 将 PHP 与 Web 服务器解耦

什么是 FastCGI?

FastCGI 是一种协议,允许 Web 服务器与外部 PHP 进程通信,而不是将 PHP 嵌入到服务器本身。这是相对于 mod_php 的重大架构改进。

FastCGI 如何工作

Web 服务器(Apache 或 Nginx)通过 Unix 套接字或 TCP 端口将 PHP 请求传递给持久的 FastCGI 进程。PHP 进程处理执行并返回结果。

Browser Request → Web Server → FastCGI Socket → PHP Process → Response

这里的关键词是持久:与 CGI(原始协议)不同,FastCGI 进程在请求之间保持活跃,消除了为每个请求生成新进程的开销。

性能特征

mod_php 相比,FastCGI 显著降低了内存开销,因为静态文件请求完全由 Web 服务器处理,不涉及 PHP。PHP 进程仅在真正需要时才被调用。

FastCGI 的缺点

  • 配置复杂性:与 mod_php 相比需要额外的设置,包括套接字或端口配置。
  • 进程管理有限:基本 FastCGI 缺乏生产环境所需的高级池管理功能。
  • 被 PHP-FPM 取代:在大多数现代部署中,PHP-FPM(基于 FastCGI 构建)比基本 FastCGI 实现更受欢迎。

何时使用 FastCGI

  • 中等流量网站
  • PHP-FPM 不可用的环境
  • mod_php 迁移的过渡设置

PHP-FPM — 高性能的现代标准

什么是 PHP-FPM?

PHP-FPM (FastCGI Process Manager) 是 FastCGI 协议的一个先进的、功能丰富的实现。它是在生产环境中运行 PHP 的事实标准,也是任何严肃的 Web 应用程序的推荐模式。

PHP-FPM 如何工作

PHP-FPM 管理一个 PHP 工作进程池。Web 服务器通过 Unix socket 或 TCP 连接将 PHP 请求转发给 PHP-FPM。PHP-FPM 根据当前流量动态管理活跃工作进程的数量,在负载下启动新的工作进程,在空闲期间释放它们。

Browser Request → Nginx/Apache → Unix Socket → PHP-FPM Pool → PHP Worker → Response

PHP-FPM 的主要优势

1. 动态进程管理

PHP-FPM 支持多种进程管理策略:

  • static:固定数量的工作进程(可预测,适合高流量)
  • dynamic:工作进程根据需求在最小值和最大值之间扩展
  • ondemand:仅在请求到达时生成工作进程(对于低流量来说内存效率高)

2. 按池配置

每个应用程序或虚拟主机都可以有自己的 PHP-FPM 池,具有独立的设置:

  • 独立的 Unix 用户/组(改进的安全隔离)
  • 每个池不同的 PHP 版本
  • 每个应用程序自定义 php.ini
  • 单独的资源限制

3. 慢请求日志

PHP-FPM 可以记录超过定义的执行时间阈值的请求,这对于识别性能瓶颈非常有价值。

4. 资源效率

由于 PHP 进程与 Web 服务器分开管理,静态资源的提供不会产生任何 PHP 开销。内存仅由活跃的 PHP 工作进程消耗。

5. 兼容性

PHP-FPM 与 NginxApache(通过 mod_proxy_fcgi)和 LiteSpeed 无缝协作。与 Nginx 或 LiteSpeed 结合使用时,性能提升是显著的 — 在并发负载下通常比 mod_php 与 Apache 快 5–10 倍。

并排比较

功能mod_phpFastCGIPHP-FPM
架构嵌入 Apache外部进程托管进程池
内存效率中等
静态文件开销
并发请求处理优秀
按站点 PHP 版本有限
安全隔离中等优秀
Nginx 兼容性
配置复杂性中等中等
生产就绪部分
慢请求日志

如何在 VPS 上设置 PHP-FPM (Ubuntu/Debian)

以下说明适用于 Ubuntu 22.04 LTS 和 Debian 11/12。如果您在 VPS Hosting 计划上运行您的应用程序,您将拥有完整的 root 访问权限来执行这些命令。

步骤 1:更新您的系统并安装 PHP-FPM

sudo apt update && sudo apt upgrade -y
sudo apt install php-fpm -y

要安装特定的 PHP 版本(例如 PHP 8.2):

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2-fpm -y

步骤 2:验证 PHP-FPM 正在运行

sudo systemctl status php8.2-fpm

您应该在输出中看到 active (running)。如果没有,请启动并启用它:

sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm

步骤 3:确认 Socket 路径

PHP-FPM 通过 Unix socket 进行通信。验证其位置:

ls /var/run/php/
# Expected output: php8.2-fpm.sock

PHP-FPM with Nginx

Nginx 是与 PHP-FPM 配对最常见的网络服务器,原因很充分 — Nginx 的事件驱动、非阻塞架构与 PHP-FPM 的进程池模型完美互补。

安装 Nginx

sudo apt install nginx -y

配置 Nginx 服务器块

编辑您网站的配置文件:

sudo nano /etc/nginx/sites-available/yourdomain.com

添加以下配置:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /var/www/yourdomain.com/public;
    index index.php index.html index.htm;

    # Handle PHP files
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Deny access to .htaccess files
    location ~ /.ht {
        deny all;
    }

    # Serve static files directly
    location ~* .(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

启用网站并重启 Nginx

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

PHP-FPM with Apache

如果你更喜欢 Apache — 或者你的应用程序依赖于 .htaccess 文件 — 你仍然可以通过 Apache 的 mod_proxy_fcgi 模块使用 PHP-FPM。

启用所需的 Apache 模块

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm

配置 Apache 虚拟主机

sudo nano /etc/apache2/sites-available/yourdomain.com.conf
<VirtualHost *:80>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com
    DocumentRoot /var/www/yourdomain.com/public

    <Directory /var/www/yourdomain.com/public>
        AllowOverride All
        Require all granted
    </Directory>

    # Route PHP requests to PHP-FPM
    <FilesMatch .php$>
        SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/yourdomain_error.log
    CustomLog ${APACHE_LOG_DIR}/yourdomain_access.log combined
</VirtualHost>

启用站点并重启 Apache

sudo a2ensite yourdomain.com.conf
sudo apache2ctl configtest
sudo systemctl restart apache2

PHP-FPM 池调优用于生产环境

默认的 PHP-FPM 池配置是保守的,适合开发环境。对于生产工作负载,您应该根据服务器的可用 RAM 和预期流量来调优池设置。

定位池配置文件

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

要调优的关键参数

; Process management mode: static, dynamic, or ondemand
pm = dynamic

; Maximum number of child processes
pm.max_children = 50

; Number of processes started on boot
pm.start_servers = 10

; Minimum idle processes
pm.min_spare_servers = 5

; Maximum idle processes
pm.max_spare_servers = 20

; Requests per child before recycling (prevents memory leaks)
pm.max_requests = 500

; Log slow requests (requests taking longer than 5 seconds)
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

计算 pm.max_children

动态环境的实用公式:

pm.max_children = (Available RAM in MB) / (Average PHP process size in MB)

要找到平均 PHP 进程大小:

ps --no-headers -o "rss,cmd" -C php-fpm8.2 | awk '{ sum+=$1 } END { printf "%.0f MBn", sum/NR/1024 }'

在典型的 WordPress 站点上,每个 PHP-FPM 工作进程消耗约 30–60 MB。在具有 2 GB RAM 的 VPS 上(为 OS 开销后留下约 1.5 GB 用于 PHP),您可以安全地运行 25–50 个工作进程。

应用更改

sudo systemctl reload php8.2-fpm

您应该选择哪种 PHP 模式?{#which-to-choose}

这是一个实用的决策指南:

选择 mod_php 如果:

  • 您正在运行本地开发环境
  • 您有一个非常简单的、低流量的静态内容网站
  • 您在没有其他选择的旧版共享主机上

选择 FastCGI 如果:

  • 您在中等流量网站上,PHP-FPM 不可用
  • 您正在从 mod_php 迁移,需要一个中间步骤

选择 PHP-FPM 如果:

  • 您正在运行任何生产应用程序
  • 您需要在同一服务器上支持多个 PHP 版本
  • 您正在运行 WordPress、Laravel、Symfony、Magento 或任何现代 PHP 框架
  • 您需要每个应用程序的安全隔离
  • 您正在使用 Nginx(PHP-FPM 是唯一可行的选择)
  • 您需要在并发流量下可扩展性

对于绝大多数生产用例,PHP-FPM 是明确的赢家。它是现代托管平台上的标准配置,也是您在任何自管理 VPS 上应该运行的配置。

如果您管理多个网站,并希望使用图形界面来处理 PHP 模式切换、进程池管理和虚拟主机配置,而无需手动编辑配置文件,请考虑使用 cPanel VPS — cPanel 的 EasyApache 4 允许您只需点击几下即可按域切换 PHP 处理程序。

或者,探索可用的完整 VPS 控制面板范围,找到最适合您工作流程的管理界面。

超越执行模式保护您的 PHP 应用程序

选择正确的 PHP 执行模式是服务器安全和性能策略的一个层面。以下是其他注意事项:

SSL/TLS 加密

每个生产 PHP 应用程序都应该通过 HTTPS 提供。未加密的网站会暴露用户数据,并在 Google 搜索结果中排名较低。您可以使用受信任的 SSL 证书保护您的域名,启用 HTTPS 并保护您的访问者。

为高流量应用程序提供专用资源

如果您的 PHP 应用程序持续处理数千个并发用户,共享或入门级 VPS 最终可能会成为瓶颈。专用服务器提供有保证的 CPU、RAM 和 NVMe 存储,没有资源争用——非常适合大规模运行 PHP-FPM 的高性能 PHP 应用程序。

PHP 配置强化

除了执行模式之外,强化您的 PHP 安装:

; Disable dangerous functions
disable_functions = exec,passthru,shell_exec,system,proc_open,popen

; Hide PHP version from HTTP headers
expose_php = Off

; Restrict file access
open_basedir = /var/www/yourdomain.com/

; Set reasonable limits
memory_limit = 256M
max_execution_time = 30
upload_max_filesize = 20M

结论

理解 mod_php、FastCGI 和 PHP-FPM 之间的差异不仅仅是学术练习 — 它对您的应用程序的性能、安全性和可扩展性有直接的、可衡量的影响。

总结如下:

  • mod_php 简单但资源消耗大,与 Apache 紧密耦合,不适合生产环境。
  • FastCGI 将 PHP 与 Web 服务器解耦并提高效率,但缺乏高级管理功能。
  • PHP-FPM 是现代的、生产级的标准 — 提供动态进程管理、按池隔离、多版本支持和在并发负载下的卓越性能。

对于任何严肃的 Web 应用程序,PHP-FPM 配合 Nginx(或 LiteSpeed)是您应该运行的配置。结合适当的池调优、PHP 加固和 HTTPS 强制执行,它形成了强大、可扩展的 PHP 托管环境的骨干。

如果您准备好部署具有完全控制执行环境的 PHP 应用程序,AlexHost 的 VPS 托管为您提供了从第一天起实施本指南中涵盖的所有内容所需的 root 访问权限、NVMe 存储和 DDoS 保护。

*对在您的服务器上配置 PHP-FPM 有疑问?请在下方留言或联系 AlexHost 支持团队以获得专家协助。*