上一篇
apache配置虚拟主机后如何支持php
- 虚拟主机
- 2025-08-07
- 49
在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解析器处理。

创建虚拟主机配置(以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: 推荐方案:

- 安装多版本PHP(如PHP7.4和PHP8.1);
- 为每个虚拟主机单独配置
FPM池:<VirtualHost :80> ... ProxyPassMatch ^/(..php(/.)?)$ unix:/run/php/php8.1-fpm.sock|fcgi://localhost/var/www/example.com/public_html$1 </VirtualHost> - 修改
Directory段中的处理器定义:<FilesMatch ".php$"> SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/" </FilesMatch> - 确保对应版本的
php-fpm服务已启动。
验证方法
- 浏览器访问:
http://example.com/info.php应显示PHP环境信息页; - 命令行测试:
curl -I http://example.com/info.php应返回Content-Type: text/html; - 日志检查:
grep "info.php" /var/log/apache2/access.log应看到200状态码
