Nginx 反向代理实战:从一个后端服务到 HTTPS 上线的配置清单
很多小项目上线时都会遇到同一个问题:后端服务跑在 127.0.0.1:8080,怎么让用户通过域名、用 HTTPS 安全地访问?最常见的答案就是在前面放一层 Nginx 做反向代理。本文按照“能跑起来 → 配好头信息 → 上 HTTPS → 调优与排错”的顺序,整理一份可以直接照抄的配置清单。
一、为什么要加一层反向代理
- 统一入口:一个 80/443 端口挂多个服务,按域名或路径分发。
- 安全隔离:后端只监听本机地址,不直接暴露到公网。
- 卸载 TLS:证书、加密都在 Nginx 处理,后端只管业务。
- 附加能力:静态文件缓存、gzip 压缩、限流、访问日志,一处配置全站生效。
二、最小可用配置
以 Ubuntu 为例,安装后在 /etc/nginx/conf.d/app.conf 写入:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
检查并重载:
sudo nginx -t # 先检查语法,养成习惯
sudo systemctl reload nginx
reload 不会中断已有连接,比 restart 更适合线上。
三、把真实信息传给后端
只写 proxy_pass 时,后端看到的客户端 IP 全是 127.0.0.1,协议也永远是 http。补上这几行:
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
后端框架(如 Spring Boot、Express、Django)一般需要开启“信任代理”选项,才会读取这些头。
一个经典坑:proxy_pass 末尾带不带 / 含义不同。
location /api/ { proxy_pass http://127.0.0.1:8080; }:请求/api/user原样转发为/api/user。location /api/ { proxy_pass http://127.0.0.1:8080/; }:会去掉匹配前缀,转发为/user。
路径对不上导致 404 时,先看这里。
四、支持 WebSocket
聊天、实时日志等场景用到 WebSocket,需要显式转发升级头:
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
proxy_read_timeout 默认 60 秒,长连接空闲超过就会被断开,按业务调大。
五、上 HTTPS
用 Certbot 申请免费证书最省事:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com
Certbot 会自动改写配置并添加续期定时任务。也可以手动写成下面这样,结构更清晰:
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://127.0.0.1:8080;
include /etc/nginx/proxy_params;
}
}
续期是否正常,可以用 sudo certbot renew --dry-run 演练一次。使用云服务器时,别忘了在安全组里放行 443 端口。
六、几个实用的调优项
client_max_body_size 50m; # 上传文件过大报 413 时调这个
gzip on;
gzip_types text/css application/javascript application/json;
location /static/ {
alias /var/www/app/static/;
expires 7d; # 静态资源直接由 Nginx 返回并缓存
}
简单限流可以防止接口被刷:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://127.0.0.1:8080;
}
七、常见报错速查
| 现象 | 常见原因 | 排查方法 |
|---|---|---|
| 502 Bad Gateway | 后端没启动或端口写错 | ss -ltnp | grep 8080、curl 127.0.0.1:8080 |
| 504 Gateway Timeout | 后端处理太慢 | 看后端日志,适当调大 proxy_read_timeout |
| 413 Request Entity Too Large | 上传体积超限 | 调大 client_max_body_size |
| 403 Forbidden | 静态目录权限不足 | 检查目录对 nginx 用户是否可读 |
| 配置改了不生效 | 没 reload 或被其他 server 块抢先匹配 | nginx -T 查看最终生效配置 |
排错时最有用的两个文件:/var/log/nginx/error.log 和 access.log。用 tail -f 边访问边看,大部分问题一眼就能定位。
八、小结
一套靠谱的反向代理配置,核心就是:后端只听本机、Nginx 统一入口、头信息转发完整、HTTPS 强制跳转、改完先 nginx -t 再 reload。把本文的片段按需组合,基本能覆盖中小项目从开发到上线的大部分需求。
- 点赞
- 收藏
- 关注作者
评论(0)