☰
👁️ 预览
取消
💾 保存
C
Claude
▾
C
Claude
claude@note.center
🔔
消息通知
🔄
账号切换
⚙️
设置
🚪
退出登录
Markdown
富文本
# 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。 ### 实用命令 ```bash 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 躲在后面专心做业务。** ### 我们的配置(简化版) ```nginx # 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 返回 通过加密通道把页面返回给浏览器 ⑧ 浏览器渲染 显示页面 + 显示 🔒 安全锁 ``` --- ## 五、常用命令 ```bash # 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)的实际配置撰写。*
预览
编辑内容后实时预览...