是的,Nginx 可以通过 **SNI(Server Name Indication)** 技术,根据客户端请求的域名自动匹配对应的 SSL 证书。但需要为每个域名单独配置 `server` 块,因为每个域名的证书路径不同。以下是具体方案:
---
### **1. 常规配置:每个域名独立 `server` 块**
为每个域名编写独立的 `server` 块,并指定对应的证书路径:
```nginx
# 域名1:domain1.com
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /etc/nginx/ssl/domain1.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain1.com.key;
...
}
# 域名2:domain2.com
server {
listen 443 ssl;
server_name domain2.com;
ssl_certificate /etc/nginx/ssl/domain2.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain2.com.key;
...
}
# 其他域名同理...
```
**优点**:
- 配置清晰,易于维护。
- 官方推荐做法,兼容性最佳。
**缺点**:
- 域名数量多时,配置文件冗长。
---
### **2. 动态匹配证书(需满足条件)**
如果证书文件名与域名严格对应(例如 `域名.crt` 和 `域名.key`),可通过变量动态加载证书。但需注意:
- Nginx 1.15.9+ 支持变量在 `ssl_certificate` 中使用。
- 证书需预加载到内存,可能影响性能。
```nginx
server {
listen 443 ssl;
server_name ~^(?<domain>.+)$;
# 动态路径(假设证书按域名命名)
ssl_certificate /etc/nginx/ssl/$domain.crt;
ssl_certificate_key /etc/nginx/ssl/$domain.key;
# 其他通用配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
...
}
```
**优点**:
- 减少重复配置,适合证书命名规范的场景。
**缺点**:
- 依赖证书命名规则,灵活性低。
- 性能略低于静态配置(证书需实时加载)。
---
### **3. 混合方案:通配符证书 + 独立配置**
如果多个子域名使用同一张通配符证书(如 `*.example.com`),可合并配置:
```nginx
server {
listen 443 ssl;
server_name app1.example.com app2.example.com;
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
...
}
```
**优点**:
- 减少证书管理和配置复杂度。
**缺点**:
- 仅适用于子域名场景。
---
### **总结与建议**
- **推荐方案**:
若域名数量较少(如6个),优先选择 **独立 `server` 块配置**,清晰且稳定。
示例:
```nginx
# 域名1
server {
listen 443 ssl;
server_name domain1.com;
ssl_certificate /etc/nginx/ssl/domain1.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain1.com.key;
root /var/www/domain1;
...
}
# 域名2
server {
listen 443 ssl;
server_name domain2.com;
ssl_certificate /etc/nginx/ssl/domain2.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain2.com.key;
root /var/www/domain2;
...
}
# 其他域名同理...
```
- **动态方案适用场景**:
域名数量极多且证书命名规范(如自动化证书管理工具签发)。
---
### **验证配置**
1. 检查语法:
```bash
nginx -t
```
2. 重载配置:
```bash
nginx -s reload
```
3. 测试证书匹配:
```bash
openssl s_client -connect domain1.com:443 -servername domain1.com
```
---
通过上述方案,Nginx 可根据访问域名自动选择对应证书,无需手动干预请求路由。
它们什么都知道,它们本就是故意的
我什么也做不了