Nginx 反向代理入门:把一台服务器变成多站点的入口

举报
yd_248904582 发表于 2026/11/07 06:04:54 2026/11/07
【摘要】 在本地开发或部署个人项目时,我们常常遇到这样的问题:80 端口只有一个,后端却有好几个——前端跑在 3000 端口,接口服务跑在 8080 端口,管理后台又在 5173 端口。直接把端口暴露给用户既不方便,也不安全。这时,反向代理就是最常用的解法。本文用 Nginx 做一次从零到可用的入门实践。 一、什么是反向代理反向代理是部署在客户端和后端服务之间的一层转发服务。用户只访问 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、缓存和限流,但第一步,先把这份最简配置跑通。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。