一、整体认知
大致方向是对的,但表述需要精确一点:
| 环节 | 常见说法 | 更准确的说法 |
|---|---|---|
| 用户输入 | https://znty.xinhu.cn/... |
浏览器先通过 DNS 把域名解析成 公网 IP(或 CNAME 再解析) |
| 公网 → 内网 | 「外网 IP → 内网 IP」 | 多在 路由器 / 防火墙 / 云负载均衡 / NAT 上做 端口转发 或 DNAT ,把公网 443(或自定义端口如 5001)转到内网某台机器的 443 |
| 内网机器 | 「内网 IP」 | 该机器上的 Nginx 监听 443,先把 HTTPS 解密 ,再 反向代理 到上游(本机其它端口、FastDFS、应用容器等) |
因此,「HTTPS 域名 → 外网 IP → 内网 IP → Nginx(SSL + 证书)」 可以作为一种典型链路来写文章;若省略 DNS 与 端口映射 细节,读者容易误以为「域名直接等于某台内网机器」。
二、Nginx 安装过程、环境与 SSL 说明(CentOS 7)
2.1 环境准备
- 操作系统:CentOS 7(x86_64)。
- 依赖(源码编译常用) :
gcc、make、pcre-devel、zlib-devel、openssl-devel。 - 包管理安装(常用) :通过 EPEL 或 nginx 官方 yum 源 安装,多数预编译包已包含
ngx_http_ssl_module。
bash
# 示例:安装编译依赖(源码编译时需要)
sudo yum install -y gcc make pcre-devel zlib-devel openssl-devel
2.2 安装 Nginx
以官方仓库为例(具体 repo 配置以 nginx.org 当前文档为准):
bash
sudo yum install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
2.3 是否已带 SSL 模块(必查)
SSL 不是事后单独安装的「插件」 ,而是编译进 nginx 可执行文件里的模块。用下面命令确认:
bash
nginx -V 2>&1 | grep http_ssl_module
若输出中包含 --with-http_ssl_module,即可在配置里使用 listen 443 ssl;、ssl_certificate 等指令。
若 没有 该模块,需要 更换带 SSL 的二进制 或 重新编译 并加上 --with-http_ssl_module(需系统已安装 OpenSSL 开发库)。
2.4 防火墙与端口(HTTPS 必做)
bash
# firewalld 放行 HTTPS
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
若使用非标准端口(如 5001),需放行对应端口,并在安全组/边界设备上同步放行。
三、Nginx 证书的作用
3.1 证书解决什么问题?
- 身份:向浏览器证明「你访问的域名确实由持有该证书的一方提供服务」(由受信任的 CA 或私有 CA 签发)。
- 机密性 :HTTPS 在 TLS 握手后,客户端与服务端之间的 HTTP 内容被 加密,中间人难以直接窃听明文。
- 完整性:配合 TLS,可降低传输过程中被篡改的风险(与具体密码套件配置有关)。
3.2 常见文件
ssl_certificate:通常为 证书链 (如.pem/.crt,可含中间证书)。ssl_certificate_key:私钥(.key),必须保密,权限建议仅 root/nginx 可读。
3.3 和「域名 → IP」的关系
- DNS 决定浏览器连哪个 IP。
- 证书 +
server_name决定 Nginx 对哪个 域名 呈现哪套站点;证书中的 CN/SAN 应包含用户访问的域名,否则浏览器会报证书域名不匹配。
四、全链路流程图
4.1 逻辑流程(含 DNS 与 TLS)
HTTPS 请求 Host: 域名
返回 公网 IP
端口转发 / NAT / SLB
监听 443 或自定义端口
TLS 握手 校验证书
反向代理 HTTP
用户浏览器
DNS 解析
公网入口
内网服务器
Nginx
上游应用 / 静态 / FastDFS 等
4.2 分层视角(适合博客「从外到内」叙述)
内网
公网
1 输入 https://域名
2 解析得到公网 IP
3 TCP+TLS 到公网:443
4 转发到内网 IP:443
5 解密后 proxy_pass
用户
DNS 服务器
公网 IP / 边界设备
Nginx 解密 HTTPS
业务 upstream
4.3 配置顺序建议
- DNS :域名 A 记录指向 公网 IP(或指向负载均衡)。
- 网络 :公网 443(或业务端口)映射到内网 Nginx 所在机器。
- Nginx :
listen+server_name+ssl_certificate+ssl_certificate_key。 nginx -t通过后reload,再用浏览器或curl -Ik验证。- 上游 :
proxy_pass、容器端口、防火墙与Host头按需调整。
五、小结
- 流程本质 :DNS 解析 → 公网接入 →(可选 NAT/转发)→ 内网 Nginx 解密 HTTPS → 反代到真实业务。
- 证书本质:在 TLS 层建立信任与加密通道;与 DNS 是不同层面,需同时正确配置。
- 运维习惯 :安装后第一件事执行
nginx -V确认 SSL 模块 ;上线前确认 监听端口、防火墙、证书路径与server_name一致。
六、Nginx 配置 SSL 参考模板
下面是一份常见生产模板,包含:
- 80 端口跳转到 HTTPS
- 443 启用证书与 TLS 参数
- 反向代理透传常用请求头
nginx
# 80 端口统一跳转到 HTTPS
server {
listen 80;
server_name znty.xinhu.cn;
return 301 https://$host$request_uri;
}
# HTTPS 站点
server {
listen 443 ssl http2;
server_name znty.xinhu.cn;
# 证书与私钥
ssl_certificate /etc/nginx/ssl/znty.xinhu.cn.pem;
ssl_certificate_key /etc/nginx/ssl/znty.xinhu.cn.key;
# TLS 基础配置(推荐)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 会话复用
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP stapling(可选,需要证书链完整)
# resolver 223.5.5.5 8.8.8.8 valid=300s;
# resolver_timeout 5s;
# ssl_stapling on;
# ssl_stapling_verify on;
# 安全响应头(可选)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 反向代理示例
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
应用配置后,推荐按以下顺序验证:
bash
nginx -t
systemctl reload nginx
ss -lntp | grep :443
curl -Ik https://znty.xinhu.cn
附录:文中命令速查
| 目的 | 命令 |
|---|---|
| 查看编译参数 | nginx -V 2>&1 |
| 检查配置 | nginx -t |
| 查看监听端口 | `ss -lntp |
| 本机测 HTTPS | curl -Ik https://域名 |