在haproxy+nginx+php-fpm环境下访问网站URL被自动加上了nginx服务的私网端口号的故障分析

原创 2015年11月18日 09:38:53
近日,针对公司生产环境的PHP网站服务应用主机进行了单点安全隐患的技术改造,将单一主机上的nginx+php-fpm应用迁移至了一套haproxy/keepalived+nginx+php-fpm的双机负载均衡系统中去。

haproxy监听HTTP和HTTPS端口,对公网提供服务。
nginx+php-fpm分别在两个应用主机上部署,处理haproxy分发来的访问请求。nginx监听8080提供HTTP服务,监听8081端口提供HTTPS服务。

1、
在实际测试中,使用浏览器通过域名访问集群上的网站服务,如http://abc.example.com/ 。浏览器打开网页超时,且地址栏返回的URL变成了:http://abc.example.com:8080/xxx/index.php 。
在使用HTTPS协议访问时,也同样超时,且URL中出现了8081的端口。

考虑到我们是使用两个主机部署的全套haproxy/keepalived+nginx+php-fpm的应用,且haproxy的工作网段与nginx处在相同网段。而nginx又使用了自定义的服务端口。所以才会产生了这种问题,即haproxy把访问请求分发给了nginx,但nginx在返回响应时却在URL中携带了自已的服务端口。恰恰haproxy和nginx使用的端口是不同的,因此产生了以上故障。

关于以上分析,可以使用firefox的firebug插件进行网络跟踪,比较容易看到nginx返回的响应头带上了自己的8080或8081的端口号。

带着这个疑问在网上搜索了下相关资料,于是看到了nginx的port_in_redirect选项。这是一个使用在nginx.conf的http段落中的配置项。功能是决定nginx在响应访问请求时,时否在响应头中加上自己的服务端口号,默认开启。

于是调整为 port_in_redirect off;

重启服务后,除phpmyadmin之外的全部项目都可以正常访问了。

2、
在使用http或https访问phpmyadmin服务时,仍然会超时,仍然在拿到的HTTP响应中URL地址被添加了nginx的服务端口。

使用Wireshark在本机抓包,分析访问phpmyadmin时的本机收发数据包,不有任何发现。

登录nginx应用主机,使用tcpdump对服务器端的haproxy和nginx服务地址、端口进行抓包,分析数据通信流向,仍然没有任何发现。

虽然其它我们公司自行研发上线的php项目都已经可以正常浏览和使用了,但phpmyadmin继续固执得在返回HTTP响应时带上了NGINX的服务端口。

于是,转而怀疑是phpmyadmin源码存在问题。忽然想起之前在网上查阅这方面资料时,偶然看到有人提到过php在使用一个环境变量SERVER_PORT时的注意事项。因此,我猜想phpmyadmin在使用该环境变量时,是不是存在问题。

进入到phpmyadmin的应用目录,执行:
$find . -name "*.php" | xargs grep SERVER_PORT
找到了这个文件:
./libraries/Config.class.php
if (empty($url['port']) && PMA_getenv('SERVER_PORT')) {
     $url['port'] = PMA_getenv('SERVER_PORT');
}

从字面意思上,就能理解为,这个判断条件是phpmyadmin对url地址进行了判断,如果url中没有明确使用端口且本地HTTP Server中定义了服务端口,那么就把url中的端口号设置为本地Http Server服务的端口中号!

终于找到了为什么phpmyadmin固执得返回nginx的8080和8081服务端口的原因了。

果断把上面的判断逻辑修改为:
if (empty($url['port']) && PMA_getenv('SERVER_PORT')) {
    // $url['port'] = PMA_getenv('SERVER_PORT');
    if ( PMA_getenv('SERVER_PORT') == 8080 ) {
         $url['port'] = 80;
    } elseif ( PMA_getenv('SERVER_PORT') == 8081 ) {
         $url['port'] = 443;
    }
}

实测,一切问题都烟消云散。

nginx使用非80端口时url带端口号的解决办法

在nginx中配置server侦听非80端口时,我们在访问时会在url中加入对应的端口号,如:http://xxx.xxx.xxx:8006/,但如果在nginx服务器前有另一台服务器作为用户首先访问...
  • hejun1218
  • hejun1218
  • 2017年06月17日 21:23
  • 1957

80端口默认转到443端口及443端口配置

server {     listen       80;     server_name  www.cookie.com;     charset utf-8;      rewrite ...
  • Cookie_1030
  • Cookie_1030
  • 2017年05月05日 17:53
  • 2416

在haproxy+nginx+php-fpm环境下访问网站URL被自动加上了nginx服务的私网端口号的故障分析

近日,针对公司生产环境的PHP网站服务应用主机进行了单点安全隐患的技术改造,将单一主机上的nginx+php-fpm应用迁移至了一套haproxy/keepalived+nginx+php-fpm的双...
  • watermelonbig
  • watermelonbig
  • 2015年11月18日 09:38
  • 1199

freebsd+nginx+mysql+php-fpm+phpmyadmin+haproxy安装日志

在haproxy中添加backend, 规则是host名称iefreer.domain.com;cd usr/portsmake search key=^nginx....如上用ports安装完所有的...
  • iefreer
  • iefreer
  • 2012年06月11日 00:57
  • 4288

关于端口做过映射导致nginx自动添加内网端口的问题

转载: http://6127728.blog.51cto.com/6117728/1294095现象: 1、内网nginx服务器提供web的端口为8080; 2、通过路由的转换,将8080端口...
  • lovelovelovelovelo
  • lovelovelovelovelo
  • 2017年09月01日 10:29
  • 790

私网IP如何访问Internet

公网、内网是两种Internet的接入方式。 内网接入方式:上网的计算机得到的IP地址是Inetnet上的保留地址,保留地址有如下3种形式: 10.x.x.x 172.16.x.x至1...
  • u010229420
  • u010229420
  • 2015年12月25日 22:06
  • 1800

Linux环境Nginx安装多版本PHP

关于Linux环境Nginx安装与调试以及PHP安装参考此文即可:http://blog.csdn.net/unix21/article/details/8544922linux版本:64位CentO...
  • 21aspnet
  • 21aspnet
  • 2015年08月14日 10:32
  • 18310

NGINX+PHP(FASTCGI)好,还是NGINX+APACHE+PHP好?

http://www.oschina.net/question/1047141_151910?sort=default&p=2#tags_nav GINX+PHP(FASTCGI)好,还是N...
  • loongwong2011
  • loongwong2011
  • 2016年09月30日 11:46
  • 2250

nginx下URL末尾自动加斜杠

服务器上用的nginx,在地址栏输入网址,例如www.xxx.com.cn/aaa后会跳到localhost/aaa 而如果输入的是www.xxx.com.cn/aaa/则正常 一直找不到原因,今...
  • geagerg
  • geagerg
  • 2015年06月13日 09:53
  • 2253

nginx proxy_pass后的url加不加/的区别

在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。  ...
  • haitun312366
  • haitun312366
  • 2014年08月12日 21:56
  • 7724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在haproxy+nginx+php-fpm环境下访问网站URL被自动加上了nginx服务的私网端口号的故障分析
举报原因:
原因补充:

(最多只允许输入30个字)