Nginx 无法转发本地端口

问题描述

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

nginx 端口转发配置

server{
    listen       80;
    server_name  localhost;
    location / {
            proxy_pass  http://localhost:8080;
        }
}

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

原因分析

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

server{
    listen       80;
    server_name  localhost;
    location / {
            proxy_pass  https://www.baidu.com; #修改为转发到百度
        }
}

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

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

解决方案

修改 nginx 的配置文件

vim /etc/nginx/nginx.conf

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

重新加载 nginx 配置

nginx -s reload

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

cd /etc/selinux
vim config

将 SELINUX 设置为 disabled

SELINUX=disabled

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

你可能感兴趣的:(Linux,nginx,linux,运维)