Nginx 反向代理入门:把后端服务安全地暴露给外网
一台服务器上跑了好几个服务:博客在 8000 端口,接口在 3000 端口,管理后台在 8080 端口。如果直接把这些端口都暴露到公网,既难记又不安全。反向代理就是解决这个问题的标准做法:让 Nginx 守在 80/443 端口,收到请求后再按规则转发给后面的服务,访客只看到 Nginx,看不到真正的后端。
一、反向代理到底做了什么
请求链路是这样的:访客 -> Nginx(80/443)-> 后端服务(本机某个高位端口)。Nginx 收到请求后,根据域名或路径决定交给哪个后端,再把后端的响应原样返回给访客。后端服务只监听本机回环地址,公网根本连不上它。
这样做有三个直接好处:一是端口收敛,对外只开 80 和 443;二是一个域名可以按路径分流到多个服务;三是以后换后端、加服务,改 Nginx 配置就行,访客无感知。
二、最基础的一份配置
假设后端服务跑在 127.0.0.1:3000,域名是 app.example.com。新建一个独立的站点配置文件,不要直接改默认配置:
server {
listen 80;
server_name app.example.com;
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_set_header 非常关键,缺了会出怪问题:不传 Host,后端不知道访客访问的是哪个域名;不传 X-Real-IP 和 X-Forwarded-For,后端日志里所有访客都显示成 Nginx 自己的 IP,限流和统计全乱套;不传 X-Forwarded-Proto,后端以为请求是 HTTP,内部跳转可能陷入 http 和 https 来回重定向的死循环。
写好配置后先 nginx -t 检查语法,通过了再 systemctl reload nginx 平滑重载,不用重启服务。
三、一个域名分流多个服务
同一个域名下,/api/ 走接口服务,/ 走前端页面,/admin/ 走管理后台,用多个 location 块就能实现:
location /api/ {
proxy_pass http://127.0.0.1:3000/;
}
location /admin/ {
proxy_pass http://127.0.0.1:8080/;
}
location / {
proxy_pass http://127.0.0.1:8000;
}
注意 proxy_pass 末尾斜杠的区别:带斜杠时,location 匹配到的那段路径会被去掉再转发;不带斜杠时,完整路径原样转发。/api/ 这个例子里,带斜杠才能把 /api/users 转成后端收到的 /users。配错了斜杠,常见的症状就是后端收到 404,但直接访问后端端口却是好的。
四、超时时间要按需调
Nginx 默认的 proxy_read_timeout 是 60 秒。后端接口如果偶尔要跑超过 60 秒的任务(比如导出大文件),访客就会看到 504 超时,但后端其实还在跑。按业务调大一点:
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 120s;
连接超时可以设短一些,后端没起来 5 秒就该报错了;读取超时按最慢的接口来定。调完同样先 nginx -t 再重载。
五、加上 HTTPS 才是完整形态
80 端口的反向代理跑通后,下一步就是上 HTTPS。最省事的是 Certbot:一条命令自动申请免费证书、自动改配置、自动续期。Nginx 只需要在 443 端口监听,证书和加密都在代理层终止,后端继续走明文的本机回环,性能损耗可以忽略。
上了 HTTPS 之后记得把 80 端口的请求永久重定向到 https,避免访客误走明文。
六、排错的三板斧
反向代理配完最常见的三个问题:502、404 和重定向循环。502 一般是后端没起来或端口写错,先 curl 一下后端本机端口确认服务本身是好的;404 先检查 proxy_pass 末尾斜杠;重定向循环先检查 X-Forwarded-Proto 有没有传,多数情况是这三板斧能覆盖的。
还有一个容易忽略的点:改完配置一定要 nginx -t 再 reload。直接 restart 虽然也能生效,但配置写错时重启会让 Nginx 起不来,正在跑的站点一起掉线;reload 失败则保持旧配置继续服务,安全得多。
小结
反向代理的核心就一句话:Nginx 在前门收请求,后端在屋里干活。配好 proxy_pass 和几个关键请求头,再按路径分流、调好超时、加上 HTTPS,一台小服务器就能稳稳地对外提供多个服务。刚开始不用追求负载均衡、缓存这些高级玩法,先把最基础的这条链路跑通,再按需往上加。
(本文为个人运维实践记录。)
- 点赞
- 收藏
- 关注作者
评论(0)