博客
关于我
Nginx做反向代理时访问端口被自动去除
阅读量:791 次
发布时间:2023-02-15

本文共 2797 字,大约阅读时间需要 9 分钟。

Nginx配置问题:反向代理设置中的常见误区

在实际工作中,我遇到了一个Nginx配置问题,主要是关于反向代理设置的。经过多番调试,最终找到了问题所在,并成功解决了它。下文将详细记录我的思考过程和解决方案。

问题背景

我正在配置一个Nginx服务器,目的是为内部服务提供反向代理。具体来说,我需要将请求从端口8088转发到后端服务器(IP地址0.0.0.0,端口9000)。经过配置后,我发现当尝试访问目标地址时,端口信息被Nginx默认去除,导致请求最终转向错误的URL。

错误配置文件

以下是我的初始配置文件内容:

upstream http-web {    server 0.0.0.0:9000;}server {    listen       8088;    server_name mysql_web;    resolver 8.8.8.8;    location / {        proxy_pass http://http-web;        proxy_redirect     off;        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;        proxy_max_temp_file_size 0;        proxy_connect_timeout      300;        proxy_send_timeout         300;        proxy_read_timeout         300;        proxy_buffer_size          4k;        proxy_buffers              4 32k;        proxy_busy_buffers_size    64k;        proxy_temp_file_write_size 64k;    }    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   html;    }}

测试结果

在进行初步测试时,我使用curl命令进行验证:

curl http://172.30.45.10:8088 -v

结果显示,返回了一个302 Found的状态码,并且Location头字段中缺少了端口信息,导致最终请求转向http://172.30.45.10/login,而不是预期的http://172.30.45.10:8088/login

解决方案

经过进一步调研,我意识到问题的根源在于Nginx反向代理的配置中,proxy_set_header Host的设置不完整。具体来说,Host头部仅包含了$host变量,而忽略了包含端口的$server_port变量。Nginx默认会去除端口信息,导致最终请求中缺少端口部分。

以下是修正后的配置文件:

upstream http-web {    server 0.0.0.0:9000;}server {    listen       8088;    server_name mysql_web;    resolver 8.8.8.8;    location / {        proxy_pass http://http-web;        proxy_redirect     off;        proxy_set_header   Host             $host:$server_port;        proxy_set_header   X-Real-IP        $remote_addr;        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;        proxy_max_temp_file_size 0;        proxy_connect_timeout      300;        proxy_send_timeout         300;        proxy_read_timeout         300;        proxy_buffer_size          4k;        proxy_buffers              4 32k;        proxy_busy_buffers_size    64k;        proxy_temp_file_write_size 64k;    }    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   html;    }}

测试结果

重新进行测试后,使用curl命令验证:

curl http://172.30.45.10:8088 -v

此时,返回的Location头字段包含完整的端口信息,请求最终转向http://172.30.45.10:8088/login,问题得以解决。

总结

在这次问题解决过程中,我深刻体会到了反向代理设置中Host头部配置的重要性。初期的疏忽导致Nginx默认去除端口信息,影响了请求的正确转发。通过详细的调试和查阅相关资料,我找到了问题的根源,并通过修改配置文件成功解决了问题。

这种类型的Nginx配置问题,尤其是在反向代理场景下,需要特别注意Host头部的设置是否包含端口信息。Nginx默认行为可能会导致意想不到的结果,因此在配置时需要格外小心。

通过这次经历,我也提醒自己,在日常工作中要注重细节,尤其是在处理常见但容易被忽视的问题时,要有系统的分析和验证过程。只有这样,才能有效避免配置错误,确保服务器的稳定运行。

转载地址:http://lhcfk.baihongyu.com/

你可能感兴趣的文章
NACOS部署,微服务框架之NACOS-单机、集群方式部署
查看>>
Nacos配置中心集群原理及源码分析
查看>>
nacos配置新增不成功
查看>>
nacos配置自动刷新源码解析
查看>>
Nacos集群搭建
查看>>
nacos集群搭建
查看>>
nagios安装文档
查看>>
name_save matlab
查看>>
Nami 项目使用教程
查看>>
NAT-DDNS内网穿透技术,解决动态域名解析难题
查看>>
NativePHP:使用PHP构建跨平台桌面应用的新框架
查看>>
NAT技术
查看>>
NAT模式下虚拟机centOs和主机ping不通解决方法
查看>>
NAT的两种模式SNAT和DNAT,到底有啥区别?
查看>>
NAT网络地址转换配置实战
查看>>
Navicat for MySQL 命令列 执行SQL语句 历史日志
查看>>
Navicat for MySQL 查看BLOB字段内容
查看>>
Navicat Premium 12 卸载和注册表的删除
查看>>
navicat 系列软件一点击菜单栏就闪退
查看>>
Navicat 设置时间默认值(当前最新时间)
查看>>