✏️ 编辑

DNS 解析、Nginx 反向代理与 HTTPS 原理详解

创建于 2026-06-26 11:01:13 · 更新于 2026-06-30 00:58:07

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)的实际配置撰写。