DNS 解析、Nginx 反向代理与 HTTPS 原理详解
DNS 解析、Nginx 反向代理与 HTTPS 原理详解
本文基于个人运维平台(https://zhoujiayi.xyz)的实际部署过程讲解,适合初学者阅读。
一、DNS 解析
什么是 DNS?
DNS(Domain Name System,域名系统) 是互联网的"电话簿"。它的作用是把人类易记的域名(如 zhoujiayi.xyz)转换成计算机通信所需的 IP 地址(如 43.134.84.11)。
你不可能记住 43.134.84.11 这串数字,但 zhoujiayi.xyz 念一遍就能记住。DNS 就是干这个翻译活的。
DNS 解析是怎么工作的?
当你在浏览器输入 https://zhoujiayi.xyz:
你输入 https://zhoujiayi.xyz
→ 浏览器查自己有没有缓存过这个 IP
→ 没有,问操作系统
→ 操作系统也没有,问配置的 DNS 服务器(比如 114.114.114.114)
→ DNS 服务器从根一路问到权威服务器
→ 找到 IP:43.134.84.11
→ 返回给浏览器
→ 浏览器用这个 IP 去连接服务器
整个过程一般几十到几百毫秒,你感觉不到。
DNS 记录类型
| 类型 | 作用 | 我们的例子 |
|---|---|---|
| A 记录 | 域名 → IPv4 地址 | zhoujiayi.xyz → 43.134.84.11 |
| CNAME | 域名 → 另一个域名 | www → zhoujiayi.xyz(别名) |
| TXT 记录 | 存放任意文本 | 用于 Let's Encrypt 验证域名所有权 |
| NS 记录 | 指定谁管理这个域名的 DNS | Namesilo 的 DNS 服务器 |
直接解析 vs CDN 代理
直接 A 记录(我们现在的用法):
zhoujiayi.xyz → 43.134.84.11
浏览器直接连你的服务器
CDN 代理(如 Cloudflare 橙色云):
zhoujiayi.xyz → Cloudflare 的 IP(不是你的 IP)
Cloudflare 再转发给你的服务器
我们选择了直接 A 记录,因为个人平台单人使用,不需要 CDN。
实用命令
dig zhoujiayi.xyz # 查 IP
nslookup zhoujiayi.xyz # 简版查询
二、Nginx 反向代理
什么是反向代理?
反向代理就是架设在用户和后端服务器之间的"中转站"。用户请求先到 Nginx,Nginx 再转发给后端(我们的 Flask 应用)。
用户 → https://zhoujiayi.xyz → Nginx → Flask(127.0.0.1:5001)
为什么需要 Nginx?Flask 直接上不行吗?
| 问题 | 直接 Flask | Nginx 在前 |
|---|---|---|
| SSL 证书 | Flask 要自己处理 HTTPS,麻烦 | Nginx 统一管理,Flask 只管 HTTP |
| 静态文件 | Python 读文件慢 | Nginx 读磁盘飞快(零拷贝) |
| 并发能力 | Flask 开发服务器单线程 | Nginx 轻松上千并发 |
| 安全 | Flask 直接暴露给公网 | 外网只看到 Nginx |
结论:Nginx 挡在前面做"保安",Flask 躲在后面专心做业务。
我们的配置(简化版)
# 80 端口 → 强制跳转到 HTTPS
server {
listen 80;
server_name zhoujiayi.xyz;
return 301 https://$host$request_uri;
}
# 443 端口 → HTTPS 主服务
server {
listen 443 ssl;
server_name zhoujiayi.xyz;
ssl_certificate /etc/nginx/ssl/zhoujiayi.xyz.crt; # 证书
ssl_certificate_key /etc/nginx/ssl/zhoujiayi.xyz.key; # 私钥
location / {
proxy_pass http://127.0.0.1:5001; # 转发到 Flask
proxy_set_header Host $host; # 传递原始域名
proxy_set_header X-Real-IP $remote_addr; # 传递用户真实 IP
}
location /static/ {
alias /root/note-center/static/; # 静态文件 Nginx 直接返回
expires 30d;
}
}
核心指令解释:
| 指令 | 作用 |
|---|---|
listen 443 ssl |
在 443 端口监听 HTTPS 请求 |
server_name |
匹配哪个域名的请求走这个配置 |
ssl_certificate |
指定证书文件(证明"我是 zhoujiayi.xyz") |
proxy_pass |
把请求转发给谁 |
proxy_set_header |
转发时带上额外信息(让 Flask 知道用户真实 IP) |
alias |
静态文件路径,Nginx 直接读磁盘,不经过 Flask |
静态文件:为什么不用 proxy_pass?
两种方式的区别:
proxy_pass(经过 Flask):
请求 /static/style.css → Nginx → Flask(找文件、读文件、返回)→ Nginx → 浏览器
alias(Nginx 直读):
请求 /static/style.css → Nginx(直接读磁盘)→ 浏览器
Flask 完全不知道有这个请求
Nginx 发静态文件用的是 零拷贝(sendfile) 技术,直接从磁盘到网卡,几乎不占 CPU。而 Flask 是 Python 程序,处理文件 I/O 效率低得多。
80 和 443 端口
端口就像大楼里的房间号:
- 80 端口:HTTP 的默认房间。我们把它设为"只做重定向"——你来 80,我就告诉你"请走 443"
- 443 端口:HTTPS 的默认房间。这里是真正的网站服务
http://zhoujiayi.xyz → 80 端口 → 301 重定向 → 跳转到 HTTPS
https://zhoujiayi.xyz → 443 端口 → Nginx 解密 → 转发给 Flask
三、HTTPS 与 SSL/TLS
为什么需要 HTTPS?
| HTTP | HTTPS | |
|---|---|---|
| 数据加密 | ❌ 明文传输 | ✅ 加密 |
| 数据完整性 | ❌ 可能被篡改 | ✅ 防篡改 |
| 身份认证 | ❌ 可被冒充 | ✅ 验证身份 |
| 浏览器 | ⚠️ 显示"不安全" | ✅ 🔒 |
一句话:没有 HTTPS,你在网站上输入的所有内容(包括密码)对中间人都是透明的。
HTTPS 是怎么加密的?
假设你要寄一个密码箱给朋友:
公钥(锁) → 谁都可以拿来锁箱子
私钥(钥匙) → 只有你有
第一步(非对称加密):
朋友把锁(公钥)寄给你,他自己留着钥匙(私钥)
你把东西放进箱子,锁上锁,寄给朋友
朋友用钥匙打开
→ 安全,但加密解密很慢
第二步(对称加密):
因为非对称加密太慢,实际的做法是:
先通过上面的方式,安全地约定一个"暗号"(对称密钥)
之后直接用这个暗号加密通信
→ 又快又安全
所以 HTTPS 实际上是:非对称加密"商量暗号",对称加密"用暗号聊天"。
什么是 SSL 证书?
SSL 证书是网站的身份证明,由 CA(证书颁发机构) 签发。就像公安局给你办身份证,证明"你是你"。
浏览器访问 zhoujiayi.xyz
→ 服务器出示 Let's Encrypt 签发的证书
→ 浏览器检查:证书没过期?域名对得上?签发机构可信?
→ 全部通过 → 🔒 安全连接建立
我们用的证书来自 Let's Encrypt,一个免费、自动化的证书机构。证书有效期 90 天,acme.sh 会自动续期,不用人工干预。
四、完整请求流程
当你访问 https://zhoujiayi.xyz:
① DNS 解析
浏览器查 zhoujiayi.xyz 的 IP → 43.134.84.11
② TCP 连接(三次握手)
浏览器 ↔ 服务器建立连接
③ TLS 握手(HTTPS)
服务器出示证书 → 浏览器验证通过 → 加密通道建立
④ HTTP 请求
浏览器发送:GET / HTTP/1.1
⑤ Nginx 收到请求
检查 server_name 匹配 → 把请求转发给 Flask:5001
⑥ Flask 处理
渲染页面 → 返回 HTML 给 Nginx
⑦ Nginx 返回
通过加密通道把页面返回给浏览器
⑧ 浏览器渲染
显示页面 + 显示 🔒 安全锁
五、常用命令
# DNS 查询
dig zhoujiayi.xyz # 查域名 IP
nslookup zhoujiayi.xyz # 简版
# Nginx 管理
nginx -t # 检查配置语法
nginx -s reload # 重新加载配置
systemctl status nginx # 查看运行状态
# 测试 HTTPS
curl -I https://zhoujiayi.xyz # 检查网站是否正常
curl -I http://zhoujiayi.xyz # 应该看到 301 重定向
# 查看证书
openssl x509 -in /etc/nginx/ssl/zhoujiayi.xyz.crt -noout -text | head -10
# 查看日志
tail -f /var/log/nginx/access.log # 访问日志
tail -f /var/log/nginx/error.log # 错误日志
总结
| 概念 | 一句话 | 类比 |
|---|---|---|
| DNS | 域名 → IP 地址 | 电话簿 |
| A 记录 | 域名指向服务器 IP | 公司地址 |
| 反向代理 | 替后端收请求、挡攻击 | 前台保安 |
| SSL 证书 | 证明"这个网站是真的" | 身份证 |
| 80 端口 | HTTP → 重定向到 HTTPS | 前台引导员 |
| 443 端口 | HTTPS → 真正的网站入口 | 正式会客厅 |
本文整理于 2026-06-29,基于个人运维平台(Nginx + Flask)的实际配置撰写。