官方网站 云服务器 专用服务器香港云主机28元月 全球云主机40+ 数据中心地区 成品网站模版 企业建站 业务咨询 微信客服 控制版面

Linux基于域名的虚拟主机配置

admin 1小时前 阅读数 394 #虚拟主机知识
文章标签 Apache虚拟主机

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;
  • ✅ 同步系统时间(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;
    }
    # 安全加固头(生产必备
版权声明
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主 如果涉及侵权请尽快告知,我们将会在第一时间删除。
本站原创内容未经允许不得转载,或转载时需注明出处:特网云知识库

热门