一个 server 块可绑定多个域名,但 HTTPS 下必须使用覆盖全部域名的 SAN 或泛域名证书;单域名证书不支持多域名,否则触发浏览器警告。

Nginx 中一个 server 块可以绑定多个域名,但 HTTPS 场景下证书必须覆盖所有这些域名,否则浏览器会报错。关键不是“多证书配一个 server”,而是“一个 server 配一套能覆盖全部域名的证书”。
多域名绑定(HTTP 或 HTTPS 共用逻辑)
在 server_name 指令中直接列出多个域名,用空格分隔:
server {
listen 80;
server_name example.com www.example.com blog.example.com;
root /var/www/example;
index index.html;
}- 这种写法适用于 HTTP 流量,或作为 HTTPS 的跳转入口。
- 所有请求只要 Host 头匹配其中任一域名,就会进入该
server块。
多域名共用 HTTPS 证书的配置要点
HTTPS 层不识别 server_name 的多值逻辑——它靠 SNI 协商,而证书必须在 TLS 握手阶段就提供有效匹配。所以:
-
✅ 支持多域名的证书类型只有两种:
-
SAN 证书(Subject Alternative Name):显式列出所有域名,如
example.com,www.example.com,blog.example.com -
泛域名证书(Wildcard):如
*.example.com,覆盖所有一级子域名,但不包括主域名(example.com)本身,除非额外加进 SAN
-
SAN 证书(Subject Alternative Name):显式列出所有域名,如
❌ 单域名证书(如仅
example.com)无法用于www.example.com,即使server_name里写了两个,也会触发证书警告。
配置示例(SAN 证书):
server {
listen 443 ssl http2;
server_name example.com www.example.com blog.example.com;
ssl_certificate /etc/ssl/certs/example_com_san.crt;
ssl_certificate_key /etc/ssl/private/example_com_san.key;
root /var/www/example;
index index.html;
}注意:证书路径必须是真实可读文件,私钥权限建议设为
600,目录需对nginx用户可读。
多域名、多证书的正确做法:用多个 server 块
如果不同域名需要完全不同的证书(比如 example.com 和 another-site.org 无任何归属关系),就不能塞进同一个 server 块,而应:
- 为每个独立域名(或域名组)单独写一个
server块 - 每个块
listen 443 ssl,各自指定server_name和对应的证书路径
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
root /var/www/example;
}
server {
listen 443 ssl http2;
server_name another-site.org www.another-site.org;
ssl_certificate /etc/ssl/certs/another-site.org.crt;
ssl_certificate_key /etc/ssl/private/another-site.org.key;
root /var/www/another;
}- Nginx 依赖 SNI 自动选择对应
server块和证书,前提是客户端支持 SNI(现代浏览器/系统均支持) - 所有
server块可共存于同一配置文件,或按站点拆分到/etc/nginx/sites-enabled/下
证书路径管理建议
- 把证书按域名归类存放,例如:
/etc/ssl/certs/example.com/fullchain.pem(含证书链)/etc/ssl/private/example.com/privkey.pem(私钥) - 在配置中统一使用完整路径,避免相对路径歧义
- 私钥文件权限设为
600,目录权限建议700,防止未授权读取
sudo chmod 600 /etc/ssl/private/example.com/privkey.pem sudo chown root:root /etc/ssl/private/example.com/privkey.pem


















