今天在刷新公司项目页面时发现有个板块一直刷新不出数据,最后发现接口报错(504 Gateway Time-out)
通过查看代码发现有个sql语句,如下,特别慢
select `vdc1`,
       `vdc2`,
       `vdc3`,
       `vdc4`,
       `vdc5`,
       `vdc6`,
       `vdc7`,
       `vdc8`,
       `idc1`,
       `idc2`,
       `idc3`,
       `idc4`,
       `idc5`,
       `idc6`,
       `idc7`,
       `idc8`,
       `pdc1`,
       `pdc2`,
       `pdc3`,
       `pdc4`,
       `pdc5`,
       `pdc6`,
       `pdc7`,
       `pdc8`,
       `record_time`
  from `t_inverter_dc_side_data`
where `inverter_code`= '7d006910-cce1-11e6-8c15-67da3e10436c'
   and `record_time` like '2018-01-17%'
order by `record_time` desc
limit 1
 
用explain分析如下
其实是用到了索引,但是刚好这条sql语句在inverter_code和record_time这两个条件下没有根据索引找到数据,最终相当于没有根据索引去找数据(explain中的rows统计信息是估算的并非精确值),导致接口响应时间超过了PHP脚本执行的限定时间。
(推荐一篇关于explain的博客http://www.cnblogs.com/xuanzhi201111/p/4175635.html)
 
解决方法
方法一.在代码业务逻辑中添加如下条件,先去判断是否存在数据
 
select exists(select id from `t_inverter_dc_side_data` where `inverter_code` = '7d006910-cce1-11e6-8c15-67da3e10436c' and `record_time` like '2018-01-17%') as `exists`
 
方法二.添加inverter_code和record_time组合索引(效果特别明显)
添加组合索引之后的explain结果如下:
 
方法三.网上关于修改服务器相关软件参数提供的一些建议(没试过不知道是否有效)
 
情况一:
          由于nginx默认的fastcgi进程响应缓冲区太小造成, 这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示“504 Gateway Time-out”错误。
 
情况一解决办法:
          默认的fastcgi进程响应的缓冲区是8K,我们可以设置大一点,在nginx.conf里,加入:fastcgi_buffers 8 128k, 这表示设置fastcgi缓冲区为8块128k大小的空间。
 
情况一解决办法(改进):
 
       在上述方法修改后,如果还是出现问题,我们可以继续修改nginx的超时参数,将参数调大一点,如设置为60秒:
 
       send_timeout 60;
 
       经过这两个参数的调整,结果没有再提示“504 Gateway Time-out”错误,说明效果还是挺不错的,问题基本解决。
 
情况二:PHP环境的配置问题
 
       这里我们需要对php-fpm和nginx进行配置修改。因为这种情况下,也会出现“504 Gateway Time-out”错误提示。
 
情况二解决办法( php-fpm配置修改):
 
      将max_children由之前的10改为30,这样操作是为了保证有充足的php-cgi进程可以被使用。
 
      将request_terminate_timeout由之前的0秒改成60秒,这样使php-cgi进程处理脚本的超时时间提高到60秒,可以防止进程被挂起以提高利用效率。
 
情况二解决办法(nginx配置修改):
 
      为了减少fastcgi的请求次数,尽量维持buffers不变,我们要更改nginx的几个配置项,如下:
 
      将fastcgi_buffers由4 64k改为2 256k;
 
      将fastcgi_buffer_size 由64k改为128k;
 
      将fastcgi_busy_buffers_size由128k改为256k;
 
      将fastcgi_temp_file_write_size由128k改成256k。
 
情况二解决办法修改完,我们需要重新加载php-fpm和nginx的配置,然后再进行测试。之后就没有发现“504 Gateway Time-out”错误,效果也还是不错的!
 

补充:
各种以5开头的服务器相关错误提示:
 
一:500错误
 
1、500 Internal Server Error 内部服务错误:顾名思义500错误一般是服务器遇到意外情况,而无法完成请求。
 
2、500出错的可能性:
 
  a、编程语言语法错误,web脚本错误
 
  b、并发高时,因为系统资源限制,而不能打开过多的文件
 
3、一般解决思路:
 
  a、查看nginx、php的错误日志文件,从而看出端倪
 
  b、如果是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf,还是出现too many open files,那就要考虑做负载均衡,把流量分散到不同服务器上去了
 
  c、如果是脚本的问题,则需要修复脚本错误,优化代码
 
 
二:502、504错误 
 
1、502 Bad Gateway错误、504 Bad Gateway timeout 网关超时
 
2、502、504出现的可能性
 
  web服务器故障、程序进程不够
 
3、一般解决思路
 
 a、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经fastCGI使用情况等都会导致502、504错误。
 
    b、502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数 
          偏少。针对这种情况的502错误,只需增加  php-cgi的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf文件,将其中的max_children值适当增加。这个数据要依据你的服务器的配置进行设置。
         一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。
 
         /usr/local/php/sbin/php-fpm reload 然后重启一下.
 
     c、504 表示超时,也就是客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。与nginx.conf的配置也有关系。
 
 
501  服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
 
503  服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)
 
505  服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持)
 
来源:

记一次接口504 Gateway Time-out原因及解决方法的更多相关文章

  1. Nginx 502 Bad Gateway 错误的原因及解决方法

    http://my.oschina.net/zhouyuan/blog/118708 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, ...

  2. Python requests 调Jenkins登录后的接口,返回403Fobidden的原因及解决方法。

    因Jenkins启用“防止跨站点请求伪造" 解决方法: 在Manage Jenkins->Configure Global Security 设置中将“防止跨站点请求伪造”取消勾选

  3. 记一次 nginx 504 Gateway Time-out

    今天程序在执行一项excel导出任务的时候 出现了nginx超时的提示 nginx 504 Gateway Time-out 排查过程: 查看该任务 发现内容是一个数据量20000条信息 每条信息有5 ...

  4. (总结)Nginx 502 Bad Gateway错误触发条件与解决方法

    一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现.以下是从Google搜集整理的一些Nginx 502错误的排查方法,供参考: Nginx 502 ...

  5. Mac Pro的HDMI接口与WI-FI可能存在冲突的解决方法

    当我将Mac Pro通过HDMI->DVI转接头接上一台显示器时,正在使用的WI-FI网络立马不能使用,重新连接网络也不行,但断开HDMI连接后,WI-FI立马恢复正常. 在网上查,在apple ...

  6. 记一次用pip安装docker-compose报错及解决方法

    Docker-Compose 的安装 方法一 # 下载1.25.0 docker compose sudo curl -L "https://github.com/docker/compos ...

  7. Nginx报504 gateway timeout错误的解决方法

    转载文章来源:http://www.111cn.net/sys/nginx/90669.htm(若侵删) Nginx报504 gateway timeout错误引起,一个是文件配置问题,另一个是相关处 ...

  8. tomcat 504 gateway time-out

    今天有个环境ajax调用一个请求的时候,出现一个504 gateway time-out响应,原以为是nginx找不到资源的问题,恰当我们的服务器上又配置了nginx,看了配置文件,没有指向tomca ...

  9. 解决 502、504 Gateway Time-out(nginx)

    一.504 Gateway Time-out问题常见于使用nginx作为web server的服务器的网站 我遇到这个问题是在升级discuz论坛的时候遇到的 一般看来, 这种情况可能是由于nginx ...

随机推荐

  1. Java基础-常用工具类(一)

    object类 Object 类是所有类的的父类,如果一个类没有明确使用EXPENTS关键字明确标识继承另外一个类,那么这个类默认继承object类,oject类中的方法适合所有子类 1)toStri ...

  2. L293 给地球降温

    Countries look at ways to tinker with Earth’s thermostat The idea of cooling the climate with strato ...

  3. L249 语法

    Even when homeless individuals manage to find a shelter that will give them three meals a day and a ...

  4. Linux 下各个目录的作用及内容

    在 Linux 下,我们看到的是文件夹(目录): 在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱.Linux 面世不久后,对文件目录进行了标准化,于1994年对 ...

  5. python基础4文件操作

    在磁盘上读取文件的 功能都是由操作系统来实现的,不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据( ...

  6. react-navigation实现页面框架(转载)

    初始化一个RN项目 react-native init page_framework page.json { "name": "page_framework", ...

  7. PaddlePaddle Perceptron Example

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  8. 2.21 JS处理滚动条

    2.21 JS处理滚动条 前言    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了.常见场景:当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到 ...

  9. 如何更改Apache的根目录指向

    更改Apache的默认网站根目录地址方法如下: 0,先找到主目录下的apache文件,然后进行下面操作 1.找到 DocumentRoot “X:/Apache/htdocs” 将“X:/Apache ...

  10. XXS level1

    level1 (1)查看PHP源码,发现可以通过调用window,alert()完成任务 window.alert = function() { confirm("完成的不错!") ...