记一次惊心动魄的上线问题
项目上线了,跑了一段时间,就出现卡死的情况。
一看服务器的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,有点意思。