记一次惊心动魄的上线问题

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

posted @ 2019-01-02 16:44  TBHacker  阅读(329)  评论(0编辑  收藏  举报