全书目录

第十七篇:Nginx 完全指南 —— 城市总闸口宇宙

第九章:HTTPS / TLS —— 给城市总闸口装上加密隧道和身份证核验窗口

1 分钟 301 字 第 329 / 962 个阅读单元

Nginx 很常见的职责,是在最前面终止 HTTPS。

也就是:

text
浏览器 <== HTTPS ==> Nginx 城市总闸口 <== HTTP/HTTPS ==> 后方服务

一份最基本的 HTTPS 配置长这样:

nginx
server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate     /etc/nginx/certs/example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/example.com.key;

    location / {
        root /srv/www/site;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://api_backend/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

同时通常还会保留一个 80 端口闸门,专门做跳转:

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    return 301 https://$host$request_uri;
}

你要理解 HTTPS 在这里的工程意义:

  • 加密客户端到总闸口之间的数据
  • 统一证书管理入口
  • 让后方应用不必每个都各自处理公网 TLS
  • 便于集中做安全头、重定向、日志、限流等边缘动作

再给一个生产上很常见的基础优化:

nginx
http {
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}

它相当于让城市总闸口保留一部分“安检复用记录”,减少重复握手成本。

如果你准备加 HSTS,也就是:

nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

前提是你已经确认:

  • 全站、全子域都稳定支持 HTTPS
  • 不会再回退到 HTTP

因为这相当于告诉浏览器:“以后只准走加密通道”。