Nginx 无法转发本地端口

时间:2025-01-20 12:16:30

问题描述

本文主要分析解决 centosnginx 配置端口转发后不生效,通过 nginx 配置 server 转发后,无法达到预期的转发目的,并出现502错误的问题。假设虚拟机 ip 为 192.168.0.8,并且在虚拟机内部署一个了 golang 服务,监听端口 8080。

nginx 端口转发配置

  1. server{
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass http://localhost:8080;
  6. }
  7. }

结果检测,发现访问 http://192.168.0.8 时报 502 错误,为什么会这样呢?明明直接访问 http://192.168.0.8:8080 都是正常的,为什么经过 nginx 转发后报错了?

原因分析

基于上面的问题,将代理连接重新改为如下代码

  1. server{
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass ; #修改为转发到百度
  6. }
  7. }

经过修改后,再次访问 http://192.168.0.8 能正常转发到百度,那么说明了一个问题,与 nginx 的端口转发配置无关!

那么为什么能转发到外部地址,反而内部地址无法转发呢?主要原因其实在用户权限,以及 linux 系统一个叫 Selinux 的配置。

解决方案

修改 nginx 的配置文件

vim /etc/nginx/

将第一行 user 改为 root,默认值为 nginx 或 nobody,根据版本不同而不同。

重新加载 nginx 配置

nginx -s reload

将配置文件修改后,重新访问 http://192.168.0.8 看是否能正确的转发到 http://192.168.0.8:8080 地址。有时候修改配置文件后依然无效,还需将 Selinux 禁用,具体方法为:进入 selinux 目录修改 config 文件。

  1. cd /etc/selinux
  2. vim config

将 SELINUX 设置为 disabled

SELINUX=disabled

然后重启你的虚拟机 reboot,经过以上二步后 nginx 无法转发本地端口的问题将得到彻底解决。