开发者社区> 问答> 正文

500/502/504错误排查



对于配置负载均衡之后,访问网站出现500 Internal Server Error, 502 Bad Gateway, 504 Gateway Timeout等错误,有可能由多种原因导致,例如运营商拦截,客户端异常行为导致云盾封堵,负载均衡配置错误或者健康检查失败,后端ECS Web应用访问问题。
本文档列举了此类问题的可能原因、解决方案以及排查步骤。


  1. 可能原因以及解决方案
  • 排查步骤
  • 提交工单



  • 可能原因以及解决方案



    1. 源站域名没有备案或者域名没有在高防或者安全网络配置七层转发
      解决方案:请将域名备案。如果负载均衡在高防或者安全网络,配置对应的域名规则。

    2. 客户端源IP地址被云盾拦截
      测试其他ISP运营商的客户端是否有相同问题,如果仅仅是某个固定运营商网络的客户端访问有问题,一般是运营商封堵导致。
      解决方案:通过工单反馈阿里云售后支持抓包确认是否有封堵行为,如果确认,请联系运营商解决该问题。

    3. 后端ECS安全防护软件阻挡
      100.64.0.0/10、10.158.0.0/16、10.159.0.0/16和10.49.0.0/16,这些IP段属于负载均衡服务器IP段,主要用于健康检查和转发请求,如安装安全软件或者系统内部防火墙,可以将此IP段添加白名单,避免出现500或502错误。
      解决方案:配置杀毒、防火墙软件白名单,或者卸载此类软件快速测试。

    4. 后端ECS Linux内核参数配置错误
      对于后端ECS为Linux系统,改成TCP模式时需要注意关闭系统内核参数中rp_filter相关设置。
      解决方案:将系统配置文件/etc/sysctl.conf的以下三个配置的值为0,然后执行sysctl -p。 net.ipv4.conf.default.rp_filter = 0
    5. net.ipv4.conf.all.rp_filter = 0
    6. net.ipv4.conf.eth0.rp_filter = 0


    后端ECS性能瓶颈
    例如CPU高,外网带宽跑满均可能导致访问异常。
    解决方案:检查后端ECS性能,解决性能瓶颈问题,如果是整体系统容量不够,可以通过扩容后端ECS 的数量消除问题。

    健康检查失败导致负载均衡出现502错误
    关于健康检查失败,参考 健康检查异常排查进行排查。
    此外,未开启负载均衡的健康检查,同时服务器中Web服务无法正常处理HTTP请求,比如Web服务未运行,也会出现502错误。

    健康检查正常但Web应用报502错误
    502 Bad Gateway错误提示表明负载均衡可以将来自客户端的请求转发到后端服务器中,但是服务器中Web应用处理异常抛出该提示,所以排错的方向是针对服务器中Web应用的配置以及运行情况进行分析。例如Web应用处理HTTP请求的时间超过了负载均衡的timeout时间。在七层HTTP模式下,后端对PHP请求的处理时间超过proxy_read_timeout60秒,此时会出现负载均衡抛出的504 Gateway Time-out。对于四层监听,超时时间为900秒。
    解决方案:确保Web服务以及依赖正常运行,检查PHP请求处理情况,优化后端PHP请求处理。下面以Nginx+php-fpm为例进行分析说明:

    1. 处理PHP请求的进程数达到上限。
      • 当前服务器中PHP请求总数已经达到了php-fpm中max_children设置的上限,如果后续有新的PHP请求到达服务器中,这种情况下通常会有502与504错误随机出现:

    • 如果已有的请求被马上处理完成,新请求被继续处理,一切正常;

    • 如果已有的PHP请求处理较慢,新的PHP一直处于等待状态,直至超过Nginx的 fastcgi_read_timeout的值,就会出现504 Gateway timeout的错误;

    • 如果已有的PHP请求处理较慢,新的PHP处于等待状态,超过了Nginx的request_terminate_timeout的值,就会出现502 Bad Gateway的错误。
    1. PHP脚本执行时间处理超时,即如果php-fpm处理PHP脚本的时长超过了nginx中 request_terminate_timeout设置的值,会报错502,同时在Nginx日志中可以查看到如下错误日志记录:
    1. [error] 1760#0: *251777 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: “GET /timeoutmore.php HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”
    1. 健康检查针对的是静态页面,实际处理动态请求的进程异常,比如php-fpm未启动运行。


    HTTP模式下配置过大Head头信息
    过大的Head头信息也可能导致负载均衡无法正确处理相关数据,进而引发502错误。
    解决方案:减少通过 Head 头传递的数据量或者换成TCP监听。

    业务访问逻辑问题
    确保不存在负载均衡后端ECS在服务器内部再通过负载均衡公网IP地址访问的情况。该情况下,后端业务服务器通过负载均衡地址访问自身所监控的端口后,根据负载均衡调度策略的不同,可能会将相应的请求调度到自身服务器上。导致出现自己访问自己的情况,造成死循环,进而导致相应的请求出现500或502错误。
    解决方案:确保负载均衡场景应用正确,避免后端ECS服务器需要访问负载均衡公网IP地址的情况。


    排查步骤


    • 检查500/502/504错误截图,判断是负载均衡问题,高防/安全网络配置问题,还是后端ECS配置问题。

    • 如果有高防/安全网络,请确认高防或者安全网络的七层转发配置正确。

    • 请确认是所有客户端都有问题,还仅仅是部分客户端有问题。如果仅仅是部分客户端问题,排查是否该客户端被云盾阻挡,或者是否是负载均衡域名或者IP被ISP运营商拦截。

    • 检查负载均衡状态,是否有后端ECS健康检查失败的情况,如果有健康检查失败,解决健康检查失败问题。

    • 直接在本地绑定域名的Host到源站(后端ECS)的IP地址测试,确认是否是后端问题。如果5XX错误间断发生,很可能是后端某一台ECS服务器的配置问题。

    • 尝试将负载均衡端口类型,由七层修改成四层,看问题是否会复现。

    • 检查后端ECS服务器的当前的性能状态,是否有CPU、内存、磁盘、网络瓶颈。

    • 如果确认是后端服务器问题,请检查后端ECS Web服务器日志是否有相关错误,Web服务是否正常运行,确认Web访问逻辑是否有问题,卸载服务器上杀毒软件重启测试。

    • 检查后端ECS Linux操作系统的TCP内核参数是否配置正确。
        



    提交工单


    请根据上述排查步骤中的指导逐条排查,详细记录排查测试结果。提交工单时,请您提供上述信息以便售后支持尽快协助您解决问题。
    如问题还未解决,请联系 售后技术支持

    展开
    收起
    行者武松 2017-10-18 17:16:27 7773 0
    0 条回答
    写回答
    取消 提交回答
    问答排行榜
    最热
    最新

    相关电子书

    更多
    网络流量异常行为分析系统 立即下载
    低代码开发师(初级)实战教程 立即下载
    阿里巴巴DevOps 最佳实践手册 立即下载