Apache在单IP上为多个域名提供HTTPS服务核心依赖SNI技术:客户端TLS握手初期明文发送域名,服务器据此匹配VirtualHost并加载专属证书;需满足Apache≥2.2.12且编译支持OpenSSL、mod_ssl启用、OpenSSL≥0.9.8f、客户端支持SNI;每个VirtualHost必须独立配置SSLCertificateFile和SSLCertificateKeyFile,禁用全局证书设置,ServerName须精确匹配,SSLStrictSNIVHostCheck off置于全局段以兼容旧客户端。

Apache 在单 IP 上为多个域名提供 HTTPS 服务,核心靠的是 SNI(Server Name Indication)技术。它让客户端在 TLS 握手初期就明文发送请求的域名,Apache 据此匹配对应 <VirtualHost *:443> 并加载专属证书。只要环境满足、配置隔离、路径明确,就能稳定运行。
确认底层支持是前提
以下四点缺一不可:
-
Apache ≥ 2.2.12(推荐 2.4.8+),且编译时启用了 OpenSSL 支持:运行
httpd -V | grep -i ssl应能输出 OpenSSL 版本信息 -
mod_ssl 模块已启用:Debian/Ubuntu 执行
a2enmod ssl;RHEL/CentOS 检查LoadModule ssl_module modules/mod_ssl.so是否在主配置中启用 - OpenSSL ≥ 0.9.8f(实际建议 ≥ 1.0.2 或 1.1.1),以兼容 TLS 1.2/1.3 和稳定回调
-
客户端需支持 SNI:IE6/WinXP、Android 2.x 等旧环境不支持;现代浏览器、
curl 7.18.1+、Java 7u25+ 均支持
每个域名必须独占一套证书文件
SNI 生效的关键是“按域名精确加载”,不是共用,更不能混写:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 禁止在全局
ssl.conf或主配置中设置SSLCertificateFile或SSLCertificateKeyFile - 每个
<VirtualHost *:443>块内必须显式声明自己的证书与私钥,例如:
<VirtualHost *:443> ServerName site-a.com SSLCertificateFile /etc/letsencrypt/live/site-a.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/site-a.com/privkey.pem # Apache 2.4.8+ 可省略 chain 文件,因 fullchain.pem 已含中间证书 </VirtualHost> <p><VirtualHost *:443> ServerName site-b.com SSLCertificateFile /etc/letsencrypt/live/site-b.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/site-b.com/privkey.pem </VirtualHost>
-
site-a.com和site-b.com的证书路径绝不能指向同一个fullchain.pem,否则所有请求都会返回第一个站点的证书
虚拟主机结构要规范
Apache 2.4 不再需要 NameVirtualHost *:443,但结构必须清晰:
- 所有 HTTPS 虚拟主机统一绑定到
*:443,不可混用 IP 或端口(如192.168.1.10:443与*:443共存易出错) - 每个块必须有明确的
ServerName,且拼写与客户端 SNI 请求完全一致(大小写不敏感,但域名字符必须精准) - 建议为每个站点单独建配置文件(如
sites-available/site-a.com.conf),启用时用a2ensite(Debian/Ubuntu)或手动Include -
SSLStrictSNIVHostCheck off应放在全局段(如ssl.conf末尾),而非某个<VirtualHost>内,用于兼容极少数不发 SNI 的旧客户端
别忘了基础 HTTPS 配置项
除了证书,每个 <VirtualHost *:443> 还应包含:
-
SSLEngine on(必须开启) -
DocumentRoot和配套的<Directory>权限控制(如Require all granted) -
ServerAlias(可选,用于 www/non-www 等变体) -
ErrorLog和CustomLog(便于排错)

















