上一篇
建立第二个虚拟主机
- 虚拟主机
- 2025-08-13
- 4
新建虚拟主机需复制主配置模板,修改监听端口及根目录路径,重启服务生效,实现多站点
前期准备
环境确认
项目 | 要求 | 说明 |
---|---|---|
操作系统 | 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