Apache虚拟主机配置文件位置因系统而异:Ubuntu/Debian需放/etc/apache2/sites-available/并用a2ensite启用,CentOS/RHEL则直接放/etc/httpd/conf.d/;ServerName须匹配Host头,DocumentRoot权限与SELinux上下文需正确,HTTPS必须单独配置*:443。

Apache 虚拟主机配置文件放哪?
Linux 下 Apache 的虚拟主机配置不能随便丢进 /etc/apache2/ 任意位置,否则 apache2ctl configtest 会报错或直接忽略。Debian/Ubuntu 默认只加载 /etc/apache2/sites-enabled/ 下的文件(通过符号链接指向 sites-available/),CentOS/RHEL 则通常在 /etc/httpd/conf.d/ 下直接放 .conf 文件。
- Ubuntu/Debian:把配置写进
/etc/apache2/sites-available/mysite.conf,再用sudo a2ensite mysite.conf启用 - CentOS/RHEL:直接新建
/etc/httpd/conf.d/mysite.conf,无需额外启用 - 别漏掉
IncludeOptional conf.d/*.conf(RHEL)或确认sites-enabled已被主配置包含(Debian)
ServerName 和 ServerAlias 写不对就 404
Apache 匹配虚拟主机靠的是请求头里的 Host 字段,不是靠 IP 或端口顺序。如果 ServerName 没写对,或者没覆盖浏览器实际访问的域名,请求就会落到默认站点(通常是第一个定义的 <virtualhost></virtualhost>)上,导致页面错乱或 404。
-
ServerName必须是完整域名,比如example.com,不能写www.example.com:80或带协议 - 多个域名用
ServerAlias补齐,支持通配符:ServerAlias *.example.com - 本地测试时,记得改
/etc/hosts,比如加一行127.0.0.1 test.local,否则 DNS 解析失败,curl -H "Host: test.local" http://127.0.0.1才能验证
DocumentRoot 权限和 SELinux 问题最常卡住启动
配置写完,systemctl restart apache2 失败,日志里出现 Permission denied: AH00035 或 Cannot serve directory,八成是权限或 SELinux 拦住了。
-
DocumentRoot目录必须对www-data(Debian)或apache(RHEL)用户可读,且父目录至少有x权限(否则无法进入) - RHEL/CentOS 开启 SELinux 时,目录需要打上
httpd_sys_content_t标签:sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/mysite(/.*)?",再restorecon -Rv /var/www/mysite - 别用
chmod 777图省事——Apache 会拒绝启动,日志里明确提示Unsafe permissions
HTTPS 虚拟主机必须单独写一个 <virtualhost></virtualhost>
HTTP 和 HTTPS 是两个完全独立的监听端口,不能靠 Redirect 或条件判断混在一个 <virtualhost></virtualhost> 里解决。不单独配 *:443,哪怕证书装好了,浏览器也会直接断连或显示不安全。
- 确保
mod_ssl已启用:a2enmod ssl(Debian)或确认LoadModule ssl_module modules/mod_ssl.so在配置中 -
SSLEngine on、SSLCertificateFile、SSLCertificateKeyFile缺一不可;Let’s Encrypt 的证书路径通常是/etc/letsencrypt/live/example.com/fullchain.pem和privkey.pem - 别忘了在 HTTP 站点里加重定向:
Redirect permanent / https://example.com/,但这是另一段配置,不是合并到 443 里
apache2ctl configtest 或 httpd -t 验证,再看 journalctl -u apache2 -n 50 --no-pager(或 httpd)查实时错误。










