问题描述
本文主要分析解决 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 ; #修改为转发到百度
-
}
-
}
经过修改后,再次访问 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 文件。
-
cd /etc/selinux
-
vim config
将 SELINUX 设置为 disabled
SELINUX=disabled
然后重启你的虚拟机 reboot,经过以上二步后 nginx 无法转发本地端口的问题将得到彻底解决。