上一篇
新建虚拟主机需复制主配置模板,修改监听端口及根目录路径,重启服务生效,实现多站点
前期准备
环境确认
| 项目 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Linux(推荐CentOS/Ubuntu) | Windows需额外安装工具链 |
| Web服务器 | Apache HTTP Server | 默认支持基于名称的虚拟主机 |
| 域名解析 | 已绑定至服务器公网IP | 需提前完成A记录配置 |
| 根目录结构 | /var/www/html为主站目录 |
新站点建议新建独立目录 |
必要权限
- 使用
sudo或切换至root用户执行系统级操作 - 确保目标目录可被Web服务器进程读写(如
apache/www-data用户)
核心配置步骤(以Apache为例)
编辑主配置文件
路径:/etc/httpd/conf/httpd.conf(CentOS)
或 /etc/apache2/apache2.conf(Ubuntu)
关键修改点:
# 启用名称型虚拟主机
NameVirtualHost :80
# 保留默认主机定义(防止未匹配请求失败)
<VirtualHost :80>
DocumentRoot "/var/www/html"
ServerName www.example.com
ErrorLog logs/default-error_log
CustomLog logs/default-access_log common
</VirtualHost>
# 新增第二个虚拟主机配置
<VirtualHost :80>
DocumentRoot "/var/www/secondsite" # 新站点根目录
ServerName second.example.com # 对应域名
ErrorLog logs/second-error_log # 独立错误日志
CustomLog logs/second-access_log common # 独立访问日志
</VirtualHost>
创建站点目录及测试页
# 创建目录并设置权限 mkdir -p /var/www/secondsite chown -R apache:apache /var/www/secondsite # CentOS # chown -R www-data:www-data /var/www/secondsite # Ubuntu # 生成测试页面 echo "<h1>Second Virtual Host Working!</h1>" > /var/www/secondsite/index.html
更新hosts文件(本地测试用)
编辑 /etc/hosts 添加:
168.1.100 second.example.com # 替换为实际服务器IP
重启服务使配置生效
systemctl restart httpd # CentOS # systemctl restart apache2 # Ubuntu
高级配置选项
| 功能 | 实现方式 | 示例代码片段 |
|---|---|---|
| SSL加密 | 启用mod_ssl模块 + 443端口监听 | <VirtualHost :443> |
| 负载均衡 | 结合mod_proxy实现后端分发 | ProxyPass balancer://backends/ |
| PHP版本隔离 | FPM池化管理 | SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost" |
| 访问控制 | .htaccess文件+AllowOverride指令 | <Directory "/var/www/secondsite"> AllowOverride All </Directory> |
常见问题与解答
Q1: 为什么输入新域名仍跳转到主站?
原因分析:
- DNS未正确解析到服务器IP → 检查域名服务商的A记录
- 防火墙阻断了80/443端口 → 执行
firewall-cmd --permanent --add-service=http后重载防火墙 - 配置文件顺序错误 → 确保新虚拟主机定义在主站之后
解决方案:
# 检查端口开放状态 ss -tuln | grep :80 # 检查SELinux状态(CentOS特有) getsebool httpd_can_network_connect → 如果为off则执行 setsebool -P httpd_can_network_connect on
Q2: 如何实现同一台服务器上的多级子域名?
典型场景: blog.example.com → forum.example.com → shop.example.com
实施要点:
- 为每个子域名创建独立虚拟主机块:
<VirtualHost :80> ServerName blog.example.com DocumentRoot /var/www/blog </VirtualHost> <VirtualHost :80> ServerName forum.example.com DocumentRoot /var/www/forum </VirtualHost>
- 使用通配符匹配时需谨慎:
ServerName www..example.com会导致优先级冲突 - 推荐采用扁平化目录结构而非嵌套式,便于维护和管理
验证清单
域名解析生效:dig A second.example.com +short应返回服务器IP
端口连通性:telnet server_ip 80能建立TCP连接
HTTP响应头:curl -I http://second.example.com显示200 OK状态码
日志输出:查看/var/log/httpd/second-access_log
