项目上线了,跑了一段时间,就出现卡死的情况。
一看服务器的CPU或者内存并没有多高。 后来重启了一下Nginx和php-fpm后就正常了。 通过查看Nginx错误日志104: Connection reset by peer
,发现需要修改配置。 nginx的buffer太小,timeout太小。 client_header_buffer_size 5m;large_client_header_buffers 4 5m;client_body_buffer_size 20m;fastcgi_buffer_size 128k;fastcgi_buffers 4 128k;fastcgi_busy_buffers_size 256k;gzip_buffers 16 8k;proxy_buffer_size 64k;proxy_buffers 4 128k;proxy_busy_buffers_size 256k;keepalive_timeout 240;fastcgi_connect_timeout 600;fastcgi_send_timeout 600;fastcgi_read_timeout 600;proxy_connect_timeout 600s;proxy_send_timeout 1200;proxy_read_timeout 1200;
修改后,重启Nginx。
风平浪静的时间久了。 可是,过了一段时间,又出现问题了。日志继续监控者。
后来继续排查,发现接口中使用了Curl方法。
优化前 ,
// 通过POST方式发送json数据static public function doPostJson($url = '', $param = [] ,$contentType = 'json') { $ch = curl_init(); // 请求地址 curl_setopt($ch, CURLOPT_URL, $url); // 请求参数类型 $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param); // 关闭https验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // post提交 if($param){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $param); } // 返回的数据是否自动显示 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行并接收响应结果 $output = curl_exec($ch); // 关闭curl curl_close($ch); return $output !== false ? $output : false;}
优化后,
// 通过POST方式发送json数据static public function doPostJson($url = '', $param = [] ,$contentType = 'json',$timeout=3) { $ch = curl_init(); // 请求地址 curl_setopt($ch, CURLOPT_URL, $url); // 请求参数类型 $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param); // 关闭https验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT , $timeout); // post提交 if($param){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $param); } // 返回的数据是否自动显示 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行并接收响应结果 $output = curl_exec($ch); // 关闭curl curl_close($ch); return $output !== false ? $output : false;}
之前没有timeout设置,导致获取别人信息的时候会一直无法结束。多个这样的curl操作之后,直接导致nginx的buffer被用完了,直接死掉。
至此,终于风平浪静了。 发现问题,解决问题。需要经验。 平时写代码规范,少留坑。话说,不经历大风大浪也不知道该如何优化。 首页访问时间长,占用Nginx服务,可以放入Redis缓存当中。 Nginx错误日志,可以排查问题所在。 Mysql慢查询日志,可以优化查询Sql,添加索引。 查询慢,会用户体验不好,加大资源消耗。(CPU,内存) 如果用户量大,日志文件会快速堆积,导致服务器空间不足。 需要定期清理,写shell脚本。 这次经理,惊心动魄,学会了发现问题,解决问题。 感受了,代码,服务器环境,数据库优化,系统架构等方面的知识。 感受到了日志对于排查错误的重要性。 日志,让问题更加的直观。 日志,可以更好的监控用户量。 量大了,问题都出现了。 百万pv,需要一个优秀的系统架构,强大的服务器,健壮的代码,优质的算法。 百万pv,有点意思。