第一次配 Nginx 反向代理:把本地服务安全地交给外网
本地跑了一个小服务,比如 Node 应用监听在 3000 端口,自己 curl 没问题,但想让同事从别的机器访问,或者想用一个好记的域名访问它,该怎么办?最常见的答案是 Nginx 反向代理。它不难,第一次配只要抓住三个概念。
什么是反向代理。平时我们说的代理,多半是正向代理:客户端主动找代理去访问外网,代理替客户端出面。反向代理反过来:客户端以为自己在访问 Nginx,其实 Nginx 把请求悄悄转给了背后的真实服务,客户端并不知道服务到底跑在哪台机器、哪个端口。对调用方来说,只有一个统一的入口;对服务方来说,真实端口可以藏在内网,只暴露 80 或 443。
最小配置长这样。假设服务跑在 127.0.0.1:3000,域名是 demo.example.com,配置文件里只需要一个 server 块:监听 80 端口,server_name 写域名,location / 里面写 proxy_pass http://127.0.0.1:3000。写完先跑 nginx -t 检查语法,没问题再 nginx -s reload 平滑重载,不用停服务。浏览器打开域名,看到的就是 3000 端口应用的内容,而地址栏里没有端口号。
新手最容易踩的三个坑。第一是忘记传真实请求头:后端应用经常要拿 Host 和客户端 IP 做判断,不加 proxy_set_header Host $host 和 X-Real-IP $remote_addr,后端看到的永远是 127.0.0.1,日志和限流都会失真。第二是端口冲突:80 端口已经被别的程序占了,Nginx 启动就报错,先用 ss -tlnp 查清楚谁占了端口再处理。第三是只配了 Nginx、忘了防火墙和云服务器安全组:本地 curl 通了、外网打不开,十有八九是安全组没放行 80 端口,排查时先分清是 Nginx 的问题还是网络层的问题。
配好之后怎么验证。先用 curl -I 域名看返回码是不是 200,再看 Nginx 的 access.log,确认请求真的经过了 Nginx 而不是直连后端。想更进一步,可以给 location 加上 proxy_read_timeout,避免后端响应慢时 Nginx 提前断开连接;也可以在同一个 server 里再加一个 location /api/,把接口请求转给另一个端口的服务,一个域名就能同时服务前端页面和后端接口。
反向代理的价值不只是“去掉端口号”。它把入口收敛到一处:以后想加 HTTPS、想限流、想把流量切到新版本服务,都只改 Nginx 这一层,后端服务本身不用动。第一次配通之后,再去看负载均衡、动静分离这些进阶用法,会发现它们不过是同一套思路的延伸。先把最小配置跑通,再慢慢加东西,是最稳的学习路径。
- 点赞
- 收藏
- 关注作者
评论(0)