温馨提示×

php-fpm与Apache如何配合使用Linux

小樊
32
2025-12-14 07:01:19
栏目: 编程语言

在 Linux 上让 Apache 与 PHP-FPM 协同工作

一 架构与准备

  • 推荐组合:Apache 2.4 + PHP-FPM(通过 FastCGI),由 Apache 处理静态资源,PHP 请求通过 mod_proxy_fcgi 转发到 PHP-FPM 进程池,职责分离、易于扩展与调优。
  • 安装组件(示例为 Ubuntu/Debian,其他发行版用相应包管理器):
    • 安装 PHP-FPM:sudo apt-get install php-fpm
    • 安装 Apache 模块:sudo a2enmod proxy proxy_fcgi
  • 确认 PHP-FPM 监听地址(编辑 /etc/php/8.x/fpm/pool.d/www.conf):
    • 套接字方式(推荐):listen = /run/php/php8.x-fpm.sock
    • 端口方式:listen = 127.0.0.1:9000
  • 注意:若之前使用 mod_php,需停用相关模块,避免与 FPM 冲突。

二 方案一 通过 mod_proxy_fcgi 转发(推荐)

  • 启用模块并重启 Apache:
    • sudo a2enmod proxy proxy_fcgi
    • sudo systemctl restart apache2
  • 虚拟主机示例(将 PHP 请求转发到 FPM,路径按实际站点调整):
    • 使用 Unix 套接字:
      <VirtualHost *:80>
          ServerName example.com
          DocumentRoot /var/www/html
      
          <Directory /var/www/html>
              Options Indexes FollowSymLinks
              AllowOverride All
              Require all granted
          </Directory>
      
          # 将 .php 请求转发到 PHP-FPM(Unix 套接字)
          <FilesMatch \.php$>
              SetHandler "proxy:unix:/run/php/php8.x-fpm.sock|fcgi://localhost/var/www/html"
          </FilesMatch>
      </VirtualHost>
      
    • 使用 TCP 端口:
      <FilesMatch \.php$>
          SetHandler "proxy:fcgi://127.0.0.1:9000"
      </FilesMatch>
      
  • 说明:
    • 使用 Unix 套接字可减少网络栈开销;确保路径与 listen 一致。
    • 如需同时支持 HTTP 与 HTTPS,分别在 80/443 的 VirtualHost 中配置相同规则。

三 方案二 通过 mod_fastcgi 调用外部 FPM(备选)

  • 安装模块并重启 Apache:
    • sudo a2enmod fastcgi
    • sudo systemctl restart apache2
  • 虚拟主机示例(外部 FastCGI 指向 FPM 套接字):
    <VirtualHost *:80>
        ServerName example.com
        DocumentRoot /var/www/html
    
        <Directory /var/www/html>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    
        AddHandler fastcgi-script .php
        Action fastcgi-script /fastcgi-php
        Alias /fastcgi-php /usr/lib/cgi-bin/fastcgi-php
        FastCgiExternalServer /usr/lib/cgi-bin/fastcgi-php -socket /run/php/php8.x-fpm.sock -pass-header Authorization
    
        <FilesMatch \.php$>
            SetHandler fastcgi-script
        </FilesMatch>
    </VirtualHost>
    
  • 说明:
    • 需确保 /usr/lib/cgi-bin/fastcgi-php 存在或按需创建可执行包装脚本。
    • 老版本或特定发行版路径可能不同,请以系统实际为准。

四 验证与常见问题

  • 验证步骤:
    • 在站点根目录创建 info.php
    • 访问 http://example.com/info.php,确认 Server API 为 FPM/FastCGI,并查看 SCRIPT_FILENAME 是否正确指向你的文件路径。
  • 常见问题与要点:
    • 权限与用户组:确保运行 ApachePHP-FPM 的用户/组一致(如 www-data),且对 /run/php/*.sock 与站点目录有访问权限。
    • 路径一致性:Apache 的 DocumentRootSetHandler/Proxy 中的 SCRIPT_FILENAME 必须匹配,否则会出现 “No input file specified”。
    • 仅代理 PHP:避免将 /static//assets/ 等静态资源走 FPM,减少开销。
    • 日志排查:查看 /var/log/apache2/error.log/var/log/php8.x-fpm.log 定位 500/404/权限类错误。
    • 安全建议:生产环境启用 HTTPS/TLS,限制 FPM 套接字权限(如 660,所属 www-data:www-data),并仅开放必要端口。

0