1. 首页 > 技术教程 > 正文

Nginx 反向代理:隐藏后端端口、实现流量加速分发

Nginx 反向代理:隐藏后端端口、实现流量加速分发

后端服务端口直接暴露在公网,等于把家门钥匙挂在门外。Nginx 反向代理能帮你隐藏真实端口,同时实现负载均衡和缓存加速。这篇 Linux 教程直接告诉你配置方法和排障技巧,照着做就行。

Nginx 反向代理:隐藏后端端口、实现流量加速分发的图片

反向代理基础配置:隐藏后端端口

反向代理的核心是用 Nginx 监听一个公网端口(比如 80),然后把请求转发给内网或本机的其他端口(比如 3000、8080)。客户端只看到 Nginx,看不到后端服务。

配置一个简单的反向代理

假设你有个 Node.js 应用跑在 `127.0.0.1:3000`,你想让用户通过 `http://yourdomain.com` 访问它。

nginx

编辑 /etc/nginx/sites-available/default 或新建配置文件

server {
listen 80; # 监听公网 80 端口
server_name yourdomain.com; # 换成你的域名或 IP

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;
}
}

配置完执行 `nginx -t` 检查语法,没问题就 `systemctl reload nginx`。现在用户访问你的域名,实际请求被转发到 3000 端口,这个端口不会暴露在公网。

为什么必须设置 proxy_set_header

很多 Linux 小白配置完发现后端应用获取不到真实 IP,或者跳转地址不对。原因就是没传这些头部信息。

`proxy_set_header Host $host` 保证后端收到的是你请求的域名,而不是 127.0.0.1。`X-Real-IP` 和 `X-Forwarded-For` 用来传递客户端真实 IP,日志分析和安全审计全靠它。

流量加速分发:负载均衡与缓存

隐藏端口只是基础,Nginx 反向代理的真正价值在于把流量分发给多个后端,并缓存静态内容,降低后端压力。

配置负载均衡池

假设你有三台应用服务器,都在内网,IP 分别是 10.0.0.2、10.0.0.3、10.0.0.4,端口都是 8080。

nginx

在 http 块中定义 upstream 池

upstream backend_servers {
server 10.0.0.2:8080 weight=3; # weight 越高,分到的请求越多
server 10.0.0.3:8080 weight=2;
server 10.0.0.4:8080 weight=1;
}

server {
listen 80;
server_name yourdomain.com;

location / {
proxy_pass http://backend_servers; # 引用 upstream 名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

这里 `weight` 参数控制流量比例,适合不同性能的服务器。如果不写 `weight`,默认是轮询,每个后端平均分配。

开启缓存加速

对于静态资源(图片、CSS、JS),可以缓存到 Nginx 本地,避免每次请求都穿透到后端。

nginx

在 http 块中定义缓存路径

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g;

server {
listen 80;
server_name yourdomain.com;

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://backend_servers;
proxy_cache mycache; # 启用缓存
proxy_cache_valid 200 302 60m; # 成功状态码缓存 60 分钟
proxy_cache_valid 404 1m; # 404 只缓存 1 分钟
add_header X-Proxy-Cache $upstream_cache_status; # 调试用
}

location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
}

`proxy_cache_valid` 可以根据状态码设置不同过期时间。`add_header X-Proxy-Cache` 返回 HIT 或 MISS,方便你验证缓存是否生效。

常见排障:反向代理不生效怎么办

配置完发现访问不了,或者返回 502、404,别慌,按这个顺序排查。

502 Bad Gateway 的常见原因

502 通常表示 Nginx 连不上后端。先确认后端服务是否在运行:

检查后端端口是否监听

ss -tlnp | grep 3000

或者用 curl 直接测试后端是否正常

curl http://127.0.0.1:3000

如果后端正常,检查 `proxy_pass` 的地址是否正确。注意 `http://` 不能少,IP 和端口不能写错。

端口放行问题

如果后端在其他服务器上,记得放行防火墙。VPS 上常用 `ufw` 或 `firewalld`:

放行 80 和 443 端口

ufw allow 80/tcp
ufw allow 443/tcp

但后端端口(比如 3000)**不需要**放行公网,只允许内网访问就行。万一你放行了 3000 端口,反向代理就失去隐藏端口的意义了。

老鸟叮嘱:别把 upstream 写在 server 块里

`upstream` 必须定义在 `http` 块内,不能放在 `server` 或 `location` 里。很多 Linux 小白把 `upstream` 写错位置,导致 Nginx 报错 `upstream directive is not allowed here`。如果报了这个错,检查配置文件层级。

FAQ

Nginx 反向代理 502 错误怎么解决?

先确认后端服务是否运行,再检查 `proxy_pass` 地址是否正确,最后看防火墙是否拦截了内网通信。

隐藏后端端口后,如何让用户直接访问?

不需要做额外操作。用户访问你配置的域名或公网 IP,Nginx 自动把请求转发给后端,用户完全不知道后端端口的存在。

Nginx 负载均衡支持哪些算法?

默认是轮询,还可以用 `ip_hash`(同一 IP 固定到同一后端)、`least_conn`(最少连接数)、`random`(随机)。在 `upstream` 块中直接写算法名即可。

反向代理缓存会影响实时数据更新吗?

会。如果后端返回的是动态数据(如用户登录状态),建议不要缓存。可以只对静态资源或特定路径开启缓存,动态请求直接穿透。

Nginx 反向代理和 CDN 有什么区别?

Nginx 反向代理通常部署在你自己的服务器上,用于隐藏端口和分发流量。CDN 是分布式网络,用于加速全球访问和缓存静态资源。两者可以配合使用。

配置完后 Nginx 报错 “upstream directive is not allowed here” 怎么办?

说明你把 `upstream` 写在了 `server` 或 `location` 块里。把 `upstream` 移到 `http` 块中,和 `server` 平级。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9444.html 商家投稿邮箱:zhujixuanblog@qq.com