Sonar – ERROR: Failed to upload report – An error has occurred

最近在搭建Sonarqube的时候遇到一个问题,用Sonar-scanner扫描一个项目的时候出现了如下的错误

INFO: CPD calculation finished
INFO: Analysis report generated in 1439ms, dir size=17 MB
INFO: Analysis reports compressed in 1804ms, zip size=6 MB
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 1:59.037s
INFO: Final Memory: 37M/1535M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
ERROR: Failed to upload report - An error has occurred. Please contact your administrator
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.

然后按照提示加了-X去看debug的log,500错误?赶紧看了看 (sonar安装路径)\logs\web.log

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7138130 > 4194304). 
                              You can change this value on the server by setting the max_allowed_packet' variable.
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3681)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2512)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
	at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:136)
	at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:136)
	at org.sonar.db.ce.CeTaskInputDao.insert(CeTaskInputDao.java:53)
	... 48 common frames omitted

数据库?怎么数据库进来捣乱了,可怕!顺便吐槽下Sonarqube对DB的支持…

#----- MySQL >=5.6 && <8.0
# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions

(冷静下来...)

问题找到了:Mysql参数设置问题
max_allowed_packet可以先再mysql用这个命令查下:mysql> SHOW VARIABLES LIKE ‘max_allowed_packet’;
需要修改的话,可以修改my.ini中的:max_allowed_packet = 128M(你想要的大小,这里我设置的是128M)

我的max_allowed_packet,原来默认是4M,改成128M之后问题解决了

PS:记得重启MySql, 还有Sonarqube!! (我没有重启Sonarqube,它还是认为是4M,再吐槽下)

PPS: 顺便提下在window下,Mysql 5.7的my.ini在C:\ProgramData\MySQL\MySQL Server 5.7这个路径

windows10操作系统下:
1. 由于我们使用MySql 时,需要修改mysql 的 my.ini 的配置文件。
2. 但是 mysql 5.7 的 my.ini 位置并不在 C:\Program Files\MySQL\MySQL Server 5.7 此目录的my-default.ini 并不是我们要的:
3. 如果安装在C盘的: 我们要进入 C:\ProgramData\MySQL\MySQL Server 5.7 此目录即可看到my.ini 此时你可以修改次配置啦!

为Nginx加上SSL支持

在加入SSL支持之前需要准备点东西:

1.去到正规渠道申请SSL证书

Q:为什么要去正规的渠道申请? A:因为自己签发的证书浏览器是不会认可的,仍然会显示不安全

我这里是去腾讯云申请一个,免费的DV SSL, 好处是免费,但是只能够签发一个域名,且子域名也是有且仅此一个(例如:www.acg00.com)

2.申请到证书之后是两个文件

xxxx.crt     xxxx.key

3.编辑nginx相应的vhost的config文件

例如打个比方xxx.com.conf文件

// OUTPUT CODE
server
{
listen 80;
server_name xxxx.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/xxx;
}

修改成如下

// OUTPUT CODE
//上面这一个是用于http到https的转发
server
{
listen 80;
server_name www.acg00.com acg00.com;
return 301 https://$server_name$request_uri;
}
server
{
listen 443;
server_name xxxx.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/xxx;
ssl on;
ssl_certificate ./ssl/xxxx.crt;
ssl_certificate_key ./ssl/xxxx.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}

ssl_certificate
证书其实是个公钥,它会被发送到连接服务器的每个客户端。

ssl_certificate_key
私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中,这种方式也只有公钥证书才发送到client。

ssl_protocols
指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。

ssl_ciphers
选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher ‘RC4:HIGH:!aNULL:!MD5’(后面是你所指定的套件加密算法) 来看所支持算法。

ssl_prefer_server_ciphers
on设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。

ssl_session_cache shared
设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,和off差不多,停用缓存。如shared:SSL:10m表示我所有的nginx工作进程共享ssl会话缓存,官网介绍说1M可以存放约4000个sessions。 详细参考serverfault上的问答ssl_session_cache。

ssl_session_timeout
客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。

4.修改完成后重启nginx即可

5.验证是否生效,如不生效可能是防火墙将相应的https端口挡住了,放行即可