当前位置:首页 > 虚拟主机 > 正文

apache配置虚拟主机后如何支持php

在Apache中为虚拟主机启用PHP需加载 mod_php模块,在对应站点配置中添加` 块,设置Options +ExecCGI AddHandler application/x-httpd-php .php`

前置准备

确保已安装所需组件

组件 作用 安装命令(Debian/Ubuntu) 安装命令(CentOS/RHEL)
libapache2-mod-php 提供Apache对PHP的基础支持 apt install libapache2-mod-php yum install mod_ssl+编译PHP
php-fpm (可选) 更高效的进程管理模式 apt install php-fpm yum install php-fpm
a2enmod 启用/禁用Apache模块的工具 内置 内置

注意:若采用传统mod_php模式,无需额外安装php-fpm;若需高性能场景建议切换至FPM模式。


核心配置步骤

启用PHP模块

# Debian/Ubuntu系统
sudo a2enmod phpX.Y      # X.Y替换为你的PHP版本号(如8.1)
# CentOS/RHEL系统
sudo systemctl restart httpd && sudo systemctl enable httpd

编辑主配置文件(/etc/apache2/apache2.conf/etc/httpd/conf/httpd.conf)至全局配置段:

<FilesMatch ".php$">
    SetHandler application/x-httpd-php
</FilesMatch>

此配置将所有.php文件交由PHP解析器处理。

apache配置虚拟主机后如何支持php  第1张

创建虚拟主机配置(以Debian为例)

/etc/apache2/sites-available/目录下新建文件example.com.conf

<VirtualHost :80>
    ServerAdmin webmaster@example.com
    ServerName example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    <Directory "/var/www/example.com/public_html">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All          # 允许.htaccess覆盖配置
        Require all granted       # 授权所有用户访问
        php_admin_value upload_max_filesize 10M # PHP上传限制
    </Directory>
</VirtualHost>

创建物理目录并赋权

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com  # 根据系统用户调整
sudo chmod -R 755 /var/www/example.com

测试PHP文件

/var/www/example.com/public_html/目录下创建info.php

<?php phpinfo(); ?>

激活虚拟主机并重启服务

# Debian/Ubuntu
sudo a2ensite example.com.conf
sudo systemctl restart apache2
# CentOS/RHEL
sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/
sudo systemctl restart httpd

高级配置选项对照表

需求 配置片段 说明
调整PHP内存限制 php_value memory_limit 128M 单个脚本最大内存消耗
启用OPcache加速器 php_flag opcache.enable On 提升重复请求响应速度
禁止直接访问PHP文件 <FilesMatch ".php$"> Deny from all </FilesMatch> 仅允许通过URL参数调用PHP
跨域资源共享(CORS) Header set Access-Control-Allow-Origin "" 解决前端JS跨域请求问题
错误日志分级记录 LogLevel warn + ErrorLog ... 精细化日志输出级别

常见问题与解答

Q1: 访问PHP文件时报404错误怎么办?

A: 按以下顺序排查:
1️⃣ 检查虚拟主机配置中的DocumentRoot路径是否正确且存在;
2️⃣ 确认<Directory>标签内的路径与DocumentRoot完全一致;
3️⃣ 检查文件权限:ls -l /var/www/example.com/public_html/info.php应显示属主为www-data
4️⃣ 查看Apache错误日志:tail -f /var/log/apache2/error.log查找具体错误提示。

Q2: 如何让不同虚拟主机使用不同PHP版本?

A: 推荐方案:

  1. 安装多版本PHP(如PHP7.4和PHP8.1);
  2. 为每个虚拟主机单独配置FPM池:
    <VirtualHost :80>
        ...
        ProxyPassMatch ^/(..php(/.)?)$ unix:/run/php/php8.1-fpm.sock|fcgi://localhost/var/www/example.com/public_html$1
    </VirtualHost>
  3. 修改Directory段中的处理器定义:
    <FilesMatch ".php$">
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
    </FilesMatch>
  4. 确保对应版本的php-fpm服务已启动。

验证方法

  1. 浏览器访问:http://example.com/info.php应显示PHP环境信息页;
  2. 命令行测试:curl -I http://example.com/info.php应返回Content-Type: text/html
  3. 日志检查:grep "info.php" /var/log/apache2/access.log应看到200状态码
0