Linux基于域名的虚拟主机配置
Linux 下基于域名的虚拟主机实战指南:Apache 与 Nginx 双引擎深度配置与生产加固
在现代 Web 架构中,“基于域名的虚拟主机”(Name-based Virtual Hosting)早已超越单纯的技术选型,成为多站点高效复用基础设施的核心范式,它允许单台 Linux 服务器(甚至仅一个公网 IPv4 地址)同时托管数十乃至上百个独立域名——如 docs.company.com、shop.brand.io、api.v2.internal——每个站点拥有专属的文档根目录、访问控制策略、SSL 证书、日志体系与安全头配置,相较需独占 IP 的“基于 IP 的虚拟主机”(成本高、IPv4 枯竭下不可持续),或违背 HTTP 标准、无法被 CDN/代理正确识别的“基于端口的虚拟主机”,基于域名的方案凭借其零额外 IP 开销、原生兼容 HTTP/1.1 与 HTTP/2 协议、天然支持 SNI 扩展、配置可审计性强等优势,已成为 LAMP(Linux-Apache-MySQL-PHP)与 LNMP(Linux-Nginx-MySQL-PHP)架构的事实标准。
本文以 Ubuntu 22.04 LTS(Debian 系)与 CentOS Stream 9(RHEL 系) 为实操环境,系统性地展开从协议原理、双引擎配置、本地 DNS 模拟、Let’s Encrypt 全自动 HTTPS 部署,到权限隔离、日志治理、SELinux/防火墙协同加固及故障定位的全链路实践,所有操作均通过真实终端验证,拒绝理论空谈;所有配置均标注生产级注意事项;所有安全建议均附带可执行命令与原理说明,全文逾2600字,助您一次性构建稳定、安全、可运维的企业级多域名 Web 平台。
🔍 协议基石:Host 头与 SNI 是如何让“一IP多站”成为可能?
HTTP/1.1 协议(RFC 7230)明确规定:客户端发起请求时,必须在请求头中携带 Host 字段。
GET /about.html HTTP/1.1 Host: blog.example.net User-Agent: curl/8.5.0
Web 服务器(Apache/Nginx)在接收 TCP 连接后,会先解析该 Host 值,并据此匹配预定义的虚拟主机块(VirtualHost/server),只要 DNS 将 blog.example.net 和 shop.example.net 同时解析至服务器同一 IP,路由即刻完成——这正是无需额外 IP 的根本依据。
⚠️ HTTPS 特别说明:早期 SSL/TLS 握手发生在 HTTP 层之前,服务器无法获知目标域名,导致 HTTPS 虚拟主机失效,这一瓶颈由 SNI(Server Name Indication)扩展(RFC 6066)彻底解决——客户端在 TLS ClientHello 中明文发送 server_name。所有主流浏览器(Chrome/Firefox/Safari/Edge)与服务器(Apache ≥2.2.12, Nginx ≥1.11.0)均已默认启用并强制依赖 SNI,在现代环境中,基于域名的 HTTPS 虚拟主机不仅可行,更是唯一推荐方案。
🛠️ 环境准备:稳扎稳打的三步奠基
系统基础
- ✅ 设置静态 IP(如
168.1.100),避免 DHCP 变更导致服务中断; - ✅ 临时禁用防火墙仅用于调试:
- Ubuntu:
sudo ufw disable(后续务必sudo ufw allow 'Apache Full'或sudo ufw allow 'Nginx Full'); - CentOS:
sudo firewall-cmd --permanent --add-service=http --add-service=https && sudo firewall-cmd --reload;
- Ubuntu:
- ✅ 同步系统时间(
sudo timedatectl set-ntp on),防止 Let’s Encrypt 证书因时间偏差而签发失败。
软件安装(按需选择,非共存)
| 发行版 | Apache 方案 | Nginx 方案 |
|---|---|---|
| Ubuntu | sudo apt update && sudo apt install apache2 apache2-utils certbot python3-certbot-apache |
sudo apt install nginx certbot python3-certbot-nginx |
| CentOS | sudo dnf install httpd mod_ssl certbot python3-certbot-apache |
sudo dnf install nginx mod_ssl certbot python3-certbot-nginx |
💡 提示:
certbot包名后缀(-apache/-nginx)决定插件集成方式,切勿混用。
域名规划(开发→生产演进路径)
- 开发测试:使用
.local域名(如site-a.local,admin.site-b.local),通过/etc/hosts模拟 DNS; - 生产部署:必须注册真实域名(如
example.com),并在权威 DNS 提供商处添加 A 记录(IPv4)或 AAAA 记录(IPv6) 指向服务器公网 IP; - ✅ 建议为每个主域名配置
www别名(CNAME www.example.com → example.com),并在虚拟主机中统一处理。
⚙️ Apache 实战:稳定可靠的企业级配置
步骤 1:标准化目录与权限
sudo mkdir -p /var/www/{site-a,site-b}/{html,logs}
echo '<h1>✅ Site A Live</h1>' | sudo tee /var/www/site-a/html/index.html
echo '<h1>✅ Site B Live</h1>' | sudo tee /var/www/site-b/html/index.html
# 创建独立用户,杜绝跨站访问风险
sudo adduser --home /var/www/site-a --shell /usr/sbin/nologin sitea
sudo adduser --home /var/www/site-b --shell /usr/sbin/nologin siteb
sudo chown -R sitea:sitea /var/www/site-a
sudo chown -R siteb:siteb /var/www/site-b
sudo chmod -R 750 /var/www/site-{a,b} # 移除 world 权限
步骤 2:启用 mod_rewrite 并配置虚拟主机
sudo a2enmod rewrite headers ssl # 启用重写、安全头、SSL模块 sudo nano /etc/apache2/sites-available/site-a.conf
<VirtualHost *:80>
ServerName site-a.local
ServerAlias www.site-a.local
DocumentRoot /var/www/site-a/html
ErrorLog /var/www/site-a/logs/error.log
CustomLog /var/www/site-a/logs/access.log combined
<Directory "/var/www/site-a/html">
Require all granted
AllowOverride All # 支持 .htaccess(生产环境建议移除此行,将规则写入主配置)
Options -Indexes # 禁用目录列表
</Directory>
# 强制 HTTPS 重定向(启用 SSL 后取消注释)
# Redirect permanent "/" "https://site-a.local/"
</VirtualHost>
步骤 3:启用并验证
sudo a2ensite site-a.conf site-b.conf sudo systemctl restart apache2 sudo apache2ctl configtest # 必须返回 "Syntax OK"
⚡ Nginx 实战:轻量高效的新一代部署
Nginx 配置更简洁、内存占用更低、静态文件处理性能显著优于 Apache,尤其适合容器化与微服务网关场景。
关键配置(/etc/nginx/sites-available/site-a):
server {
listen 80;
server_name site-a.local www.site-a.local;
root /var/www/site-a/html;
index index.html;
# 日志分离(注意:Nginx 默认不创建目录,需手动创建)
access_log /var/www/site-a/logs/access.log;
error_log /var/www/site-a/logs/error.log warn;
location / {
try_files $uri $uri/ =404;
}
# 安全加固头(生产必备 版权声明
本站原创内容未经允许不得转载,或转载时需注明出处:特网云知识库
特网科技产品知识库

