记一次阿里云负载均衡502问题排查

作者: wencst 分类: linux,云计算 发布时间: 2019-09-11 17:02 阅读: 5,578 次

一.问题描述

1.环境

阿里云负载均衡

CentOS7

Apache

2.现象

使用Apache搭建了一个服务,两个负载均衡中配置http协议转发,两个使用的不同的域名,不同的端口,一个成功,一个报502 Bad Gateway。

二.排查步骤

1.检查两个负载均衡的配置是否一致

一检查果然存在不一致的地方,成功的配置是TCP协议的,失败的配置为HTTP协议的。

按理说服务应该是HTTP协议的服务,为什么HTTP协议的转发却不行呢?

2.检查端口是否是http协议

为了保险,检查一下端口是否是http协议,检查方法也比较简单,百度搜来的乱七八糟的都不靠谱,还是基于我的上一篇文章《网络相关操作》中检查端口开放的方法,使用nmap命令进行检查。

查看80端口确实是http协议的端口,一度怀疑人生。

3.检查网页是否可以正常打开

由于服务器是CentOS的服务器,所以使用curl命令尝试打开:

curl -sSL http://10.1.189.196

网页正常打开,二度怀疑人生。

4.检查域名解析问题

由于访问网页可以正常返回,开始怀疑是不是域名解析的问题,或者做了哪些限制。

正向检察:在负载均衡上将此域名指向地址改为一个已存在且访问正常的地址,发现访问正常。

反向检查:在服务器上,手动修改hosts文件将10.1.189.196指向域名,发现访问正常。

说明域名和安全配置都不是问题的根源,这个在预料之中,不用三度怀疑人生。

5.查找阿里云官方文档

https://help.aliyun.com/document_detail/27702.html?spm=a2c4g.11186623.2.21.1dfd4354FXi0ka#concept-u5c-f2d-xdb

官方文档对于返回502有一些解释和检测步骤。略过前面的N多步骤,比如查看端口是否打开、查看防火墙等等,因为有一个服务可以正常访问,所以排除这些问题。

最后一个检测端口方法,windows使用telnet,linux使用curl方法,抱着试试看的态度检测了一下。

对于七层协议:

Windows:直接在ECS上访问ECS的内网IP测试是否正常,本例中为:http://10.11.192.1

Linux:使用curl -I命令查看状态是否为HTTP/1.1 200 OK,本例是:curl -I 10.11.192.1

执行了一下curl -I命令,发现返回的是403 forbidden。好吧,问题找到症结。

三.解决方法

于是查找Apache的配置文档,根路径返回403,说明安装默认配置有问题。

根路径配置为/etc/httpd/conf.d/welcome.conf

<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

OK,403文件找到了,修改方法有两种,第一种就是将此处改为正常返回(不推荐,有可能影响正常业务),第二种就是解决403的问题(推荐)。

按照/etc/httpd/conf/httpd.conf文件中的配置,DocumentRoot “/var/www/html”,也就是说根路径指向/var/www/html路径下的index.html文件。

而Apache安装时,此路径默认是没有任何文件的,所以在打开根路径时是找不到根路径对应文件,默认返回错误,即403。

不评价Apache这个默认配置是否合理的问题,单纯从修改问题的角度,在/var/www/html路径下新建一个index.html文件即可,哪怕是空的文件也行。

问题解决,终于没有让我三度怀疑人生。

 

后记:

1.解析为什么TCP协议的会成功?答:因为阿里云负载均衡tcp和http的健康检查机制不一样,tcp只要端口开放即可

2.curl -sSL和curl -I的用法区别:前者注重内容,并不包含状态,后者关注的是返回状态,并不包含内容,因此如果检测问题用 -I 更合适

 

如果文章对您有用,扫一下支付宝的红包,不胜感激!

欢迎加入QQ群进行技术交流:656897351(各种技术、招聘、兼职、培训欢迎加入)



Leave a Reply