首页  >  文章  >  后端开发  >  nginx页面加载不全或提示502bad gateway,nginx反向代理端口号丢失 bad gateway什么意思 乐视502 bad gateway dnf 502 bad gateway

nginx页面加载不全或提示502bad gateway,nginx反向代理端口号丢失 bad gateway什么意思 乐视502 bad gateway dnf 502 bad gateway

WBOY
WBOY原创
2016-07-29 08:53:572084浏览

Nginx反向代理模式下出现页面加载不全,或直接出现502 bad gateway的情况。

出现502 bad gateway的情况有很多,大多是一些nginx相关timeout的设置问题。下文讨论一种比较少见但又不得不注意的情况。

出现环境

nginx工作在反向代理模式下,监听非80端口(这点很重要,监听非80端口往往意味着用户准备配置多个虚拟主机,但不限于此情境),以ip形式访问(应该在域名访问的情况下也存在,这点没去验证)。

具体问题

访问包含多个元素的页面(指不仅仅是静态html页面,客户端往往会向服务器请求多个元素,如图片,css格式等等),客户端访问到的页面不完整,缺乏图片样式等元素,返回502 bad gateway错误。

问题分析

一开始接触这个问题是,以为是host字段值非法,被后端服务器给屏蔽了,当初这样认为的理由如下:
1. 假设nginx监听的地址是1.1.1.1:2001,代理的地址是2.2.2.2,代理服务器配置在upstream里,如下:
listen 1.1.1.1:2001;

upstream backend1 {
server 2.2.2.2;
}

proxy_set_header Host $host;
proxy_pass http://backend1;
2. 在上述配置下,通过wireshark抓包,客户端访问nginx代理,也就是1.1.1.1:2001时,请求的host为,Host:1.1.1.1,如果没设置proxy_set_header, nginx访问后端server的host为,Host:backend1

(Nginx官方文档提到:Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous level if and only if there are no proxy_set_header directives defined on the current level. By default, only two fields are redefined:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

如果设置了proxy_set_header Host $host,这时nginx访问后端server的host为1.1.1.1。不论哪种情况,如果后端server出于安全考虑对请求包host字段做了限制(只有为2.2.2.2,即server本身的地址才合理),那么所有host字段不正确的访问都会被deny或重定向或其他处理掉,不会正常访问,所以遇到这个问题时,开始以为是后端的server作了限制。
3. 后来思考,如果后端server真对访问包的host字段作了限制,应该不会有页面加载不全的情况,毕竟很少有server对某部分元素做限制而某部分不做。通过进一步抓包分析,client在第一次访问包含多个元素的页面后,server会将这个页面中包含的其他元素地址告诉client,以便client继续请求获取来得到一个信息完整的网页,而server告诉client的其他元素的地址的ip:port恰恰与nginx与server通信的host字段相同(可以理解,nginx做反向代理),如果host中没设置端口,默认是80(这就是为什么nginx监听80端口往往没有问题),client会依据这个返回的地址来获取页面元素。
4. 所以在上面的情况,如果设置了proxy_set_header Host $host,client访问页面其他元素的地址将是http://1.1.1.1/…,可以看到,还是通过nginx代理,但问题来了:nginx监听的是1.1.1.1:2001,而新来的访问是1.1.1.1:80(http端口默认80,https默认443),所以无法通过nginx来代理请求。

解决方式

解决办法也很简单,就是proxy_set_header Host $host:$server_port,这样会将nginx监听的端口加上去。


后记

虽然这次证明并非是因server对Host字段限制而影响的访问,但个人认为host字段的限制问题是值得注意的,nginx官方也推荐对于非法host的访问是直接deny的。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了nginx页面加载不全或提示502bad gateway,nginx反向代理端口号丢失,包括了bad gateway方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn