Nginx 反向代理入门:把一台服务器变成多站点的入口
在本地开发或部署个人项目时,我们常常遇到这样的问题:80 端口只有一个,后端却有好几个——前端跑在 3000 端口,接口服务跑在 8080 端口,管理后台又在 5173 端口。直接把端口暴露给用户既不方便,也不安全。这时,反向代理就是最常用的解法。本文用 Nginx 做一次从零到可用的入门实践。
一、什么是反向代理
反向代理是部署在客户端和后端服务之间的一层转发服务。用户只访问 Nginx 的 80 或 443 端口,Nginx 再根据域名或路径,把请求转发给内网里真正的应用。用户看不到后端端口,后端也不用直接暴露在公网。
它和正向代理正好相反:正向代理是替客户端去访问外网,反向代理是替服务器接收外网请求。理解这一点,就理解了 Nginx 最常见的用途。
二、安装与验证
以常见的 Linux 服务器为例,先安装并确认 Nginx 能够正常启动:
sudo apt update && sudo apt install -y nginx
nginx -v
sudo systemctl enable --now nginx
curl -I http://localhost
看到 200 OK 和 Nginx 的欢迎页,就说明服务已经跑起来了。如果 curl 不通,先检查防火墙是否放行了 80 端口,再看 Nginx 是否真的在运行:
sudo systemctl status nginx
sudo ss -tlnp | grep ':80'
三、最简反向代理配置
假设前端应用跑在 3000 端口,我们希望用户访问 http://example.local/ 时由它响应。新建一个站点配置:
server {
listen 80;
server_name example.local;
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_pass,它决定请求被转发到哪里;proxy_set_header 则是把原始的域名、客户端 IP 和协议透传给后端,否则后端拿到的 Host 永远是 127.0.0.1:3000,日志和鉴权都可能出错。
每次改完配置都要先检查语法,再重载,而不是直接重启:
sudo nginx -t
sudo systemctl reload nginx
nginx -t 通过后再重载,正在处理的请求不会被粗暴打断,这是一个值得养成的好习惯。
四、按路径分流:一台服务器跑多个服务
一台服务器通常不止一个服务。可以用 location 按路径把请求分给不同的后端:
server {
listen 80;
server_name example.local;
location / {
proxy_pass http://127.0.0.1:3000;
}
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
location /admin/ {
proxy_pass http://127.0.0.1:5173/;
}
}
这里有一个容易踩的坑:proxy_pass 后面带不带斜杠,转发结果不一样。http://127.0.0.1:8080/ 会把 /api/ 这段路径去掉再转发,而不带斜杠的写法会把完整路径原样转发。改完后可以用 curl 逐个验证:
curl -v http://127.0.0.1/api/health
curl -v http://127.0.0.1/admin/
如果想按域名而不是路径分流,也很简单:为每个域名写一个 server 块,分别设置不同的 server_name 和 proxy_pass 即可,一台服务器就能同时托管多个站点。
五、常见问题排错
反向代理出问题时,先分清是 Nginx 的问题,还是后端的問題。最常见的 502 Bad Gateway,通常是后端没启动、端口写错,或者后端只监听了 IPv6。先确认后端本身能访问:
curl -v http://127.0.0.1:3000/
后端能通但经 Nginx 不通,就去看 Nginx 的错误日志,里面一般会写明连接被拒绝还是超时:
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 50 /var/log/nginx/access.log
另外两个高频问题是:改了配置忘记 nginx -t 和重载,以及 server_name 写错导致请求落到了默认站点。排错时按“后端是否存活、配置语法是否通过、日志写了什么”这个顺序查,大多数问题都能快速定位。
六、小结
反向代理的核心就三步:让 Nginx 监听对外端口,用 proxy_pass 指定后端地址,再用 proxy_set_header 把真实请求信息透传过去。掌握这三步,就能把一台服务器变成多个站点的统一入口:对外只暴露 80 和 443 端口,对内再按域名或路径分流。后续还可以再叠加 HTTPS、缓存和限流,但第一步,先把这份最简配置跑通。
- 点赞
- 收藏
- 关注作者
评论(0)