Nginx 常用反向代理配置与 HTTPS 证书自动化部署备忘

在自建个人网站、部署后端 API 接口或微服务时,Nginx 作为反向代理网关几乎是标准底座。它既能接管 80/443 端口集中管理 TLS/SSL 证书,又能将不同的子路径分发给不同的本地服务端口(如 Node.js、Python FastAPI、Go 等)。本文记录一份经过生产检验的标准模板。

一、反向代理标准基础块(保留真实客户端 IP)

直接将所有 HTTP 请求转发给运行在 127.0.0.1:3000 的后端程序。务必配置 Host 与 X-Real-IP 头,否则后端日志记录的将全都是 127.0.0.1:

server {
    listen 80;
    server_name api.ucncn.cn;

    location / {
        proxy_pass http://127.0.0.1:3000;
        
        # 传递原始客户端真实信息
        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 $scheme;

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
    }
}

二、支持 WebSocket 长连接透传

现代 Web 经常使用 Socket.IO 或原生 WebSocket。Nginx 默认会把 HTTP 升级请求当成普通短连接断开,需要显式声明升级协议头:

location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    
    # WebSocket 必须的 HTTP 升级声明
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host $host;
    proxy_read_timeout 3600s; # 保持长连接一小时无数据不中断
}

三、结合 Certbot 自动化申请与续期 Let's Encrypt 证书

不用再每三个月手动登录云控制台下载替换证书。在 Ubuntu/Debian 上通过 Certbot 可以实现一键部署与定时自动续签:

# 1. 安装 snapd 及 certbot
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# 2. 自动检测 Nginx 配置并申请绑定域名证书
sudo certbot --nginx -d ucncn.cn -d www.ucncn.cn

# 3. 模拟测试自动续签任务(测试无报错即代表完全正常)
sudo certbot renew --dry-run

四、配置修改后的热生效操作

切忌盲目 nginx -s reload!每次改完配置文件后,先进行语法检查:

# 1. 语法正确性检查
sudo nginx -t

# 2. 输出 syntax is ok 后,平滑无缝重载
sudo nginx -s reload