记一次阿里云负载均衡502问题排查
一.问题描述
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 更合适