📢 Nginx & SSL 端口管理分析
1️⃣ 域名解析与 SSL 申请失败分析
在使用宝塔申请 www.mywebsite.test
的 SSL 证书时,遇到了解析失败的问题。最初,我认为 www
只是一个附加的前缀,不属于域名的关键部分,因此只为 mywebsite.test
配置了解析,而没有为 www.mywebsite.test
添加 DNS 记录。
然而,在 SSL 申请过程中,Let’s Encrypt 需要验证 www.mywebsite.test
是否可以被正确解析并访问,而由于缺少 DNS 记录,验证失败,导致 SSL 申请无法成功。
分析原因
www.mywebsite.test
和mywebsite.test
是独立的域名,需要单独解析。- 申请 SSL 证书时,每个域名(包括
www
版本)都必须有对应的 DNS 解析。 - 访问
www.mywebsite.test
时,如果没有 DNS 解析,服务器无法找到该域名对应的 IP,导致验证失败。
解决方案
在 DNS 解析控制台为 www.mywebsite.test
添加 A
记录,使其指向服务器 IP,等待解析生效后,重新申请 SSL 证书。
nslookup www.mywebsite.test # 确认解析是否生效
此外,也可以为 mywebsite.test
配置 CNAME
记录,让 www
自动指向主域名,减少维护成本:
www CNAME mywebsite.test
2️⃣ Nginx 443 端口冲突问题
在配置多个站点时,发现 www.mywebsite.test
和 www.anotherwebsite.test
都监听 443
端口,疑惑是否会产生冲突。
分析
Nginx 采用 SNI(Server Name Indication) 机制,通过 server_name
识别不同的域名,并选择相应的 SSL 证书,因此多个站点可以共用 443
端口,不会产生端口冲突。
示例配置
server {
listen 443 ssl;
server_name www.mywebsite.test;
}
server {
listen 443 ssl;
server_name www.anotherwebsite.test;
}
访问 https://www.mywebsite.test
时,Nginx 会匹配正确的 server_name
并使用对应 SSL 证书。
3️⃣ Nginx 443 端口是否影响后端服务
如果后端服务运行在同一台服务器,是否会与 Nginx 监听 443
端口发生冲突?
分析
- Nginx 作为反向代理,通常监听
443
端口,将请求转发到不同的后端端口(如8443
、5000
)。 - 只要后端服务 不直接监听 443 端口,则不会发生端口冲突。
示例
如果后端服务监听 5000
端口,则 Nginx 可以代理流量:
server {
listen 443 ssl;
server_name api.mywebsite.test;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
4️⃣ 如果后端服务未通过 Nginx 代理
假设后端服务运行在 5000
端口,但 未通过 Nginx 代理,则会导致以下问题:
❌ 问题
- 后端服务无法使用 HTTPS
- 由于 SSL 证书通常由 Nginx 处理,直接访问
http://服务器IP:5000
时,连接不会加密。
- 由于 SSL 证书通常由 Nginx 处理,直接访问
- 需要手动开放端口
- 必须手动在防火墙中允许
5000
端口,否则外部无法访问。
sudo ufw allow 5000
- 必须手动在防火墙中允许
- API 端口暴露风险
- 直接暴露
5000
端口,使 API 端点容易成为攻击目标。
- 直接暴露
✅ 推荐做法
使用 Nginx 代理后端服务,使其支持 HTTPS,并统一流量管理。
server {
listen 443 ssl;
server_name api.mywebsite.test;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
这样,用户可以通过 https://api.mywebsite.test
访问后端,而后端仍然运行在 5000
端口。
🔥 总结
www
版本和非www
版本的域名需要单独解析,不能默认互通。- 多个站点可以共用 443 端口,Nginx 通过
server_name
匹配不同站点,不会冲突。 - 后端服务不应直接监听 443 端口,而是让 Nginx 代理 HTTPS 访问。
- 如果后端未通过 Nginx 代理,API 端口可能暴露,且无法使用 HTTPS,存在安全风险。
推荐最佳实践:
✅ 使用 Nginx 代理后端 API,让所有流量都走 HTTPS,避免端口暴露和安全风险。