记一次阿里云环境搭建

在阿里云上现在购买esc好像默认是专有网络,以前使用的是经典网络。如果现在有两台服务器分别不在同一个账号上,那么需要配置高速通道。不过还好的是对于同一个地区高速通道并不要钱。

在其中一台服务器上部署测试环境,同时搭建jenkins用来自动化打包和发布。

先安装JDK、Tomcat、Nginx,不会有什么问题。

Tomcat根目录启动

下载Tomcat解压后删除webapps目录下所有文件。
修改conf/server.xml文件,在Host节点下添加<Context path="" reloadable="true" docBase="/home/xxxx/xxx.war" />,用于指定war路径,启动tomcat后,直接访问就是在根目录。

参考:

  • 将Web应用部署到Tomcat根目录的三种方法

防火墙设置

在默认情况下阿里云是屏蔽了端口的访问,所以需要在阿里云–>安全组规则中配置开放端口,常用的端口有443、22、23、3306、80端口。

默认情况下,阿里云使用使用centos7镜像是关闭了防火墙。

启动防火墙,同时设置为开机启动

1
2
3
4
5
6
7
8
9
10
11
12
#centos7启动防火墙
systemctl start firewalld.service
#centos7停止防火墙/关闭防火墙
systemctl stop firewalld.service
#centos7重启防火墙
systemctl restart firewalld.service


#设置开机启用防火墙
systemctl enable firewalld.service
#设置开机不启动防火墙
systemctl disable firewalld.service

如果开启了防火墙,那么除了在阿里云安全组规则中配置开放端口,本机的防火墙也需要配置端口开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
firewall-cmd --zone=public --add-port=80/tcp --permanent
#说明:
#–zone #作用域
#–add-port=80/tcp #添加端口,格式为:端口/通讯协议
#–permanent 永久生效,没有此参数重启后失效

#多个端口:
firewall-cmd --zone=public --add-port=80-90/tcp --permanent

# 删除端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent

#centos7查看防火墙所有信息
firewall-cmd --list-all
#centos7查看防火墙开放的端口信息
firewall-cmd --list-ports
#centos7以下使用netstat -ant,7使用ss
ss -ant

参考:

  • centos 7 firewall(防火墙)开放端口/删除端口/查看端口

jenkins部署

jenkins直接下载war启动,之后依据提示走流程。
在使用jenkins部署项目时,在项目打包完成后,需要重启服务器,因为jenkins和目标服务器不在同一服务器上,所以需要使用jenkins远程执行命令。

无密码访问

其实直接使用jenkins中ssh插件就可以远程执行命令,这里使用的是ssh免密码。
在jenkins服务器上执行命令ssh-keygen -t rsa生成密钥和公钥,把生成的id_rsa.pub上传到目标服务器~/.ssh/authorized_keys文件中,如果文件不存在,直接新建文件,如果文件存在,直接添加到文件末尾。
或者通过命令ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.0.1上传到目标服务器。

设置authorized_keys文件权限chmod 644 authorized_keys
设置.ssh目录权限chmod 700 -R .ssh

这样就可以无密码访问远程服务器。

参考:

  • linux远程登录ssh免密码

在使用jenkins时,因为设置了无密码访问,所有可以通过scp直接上传war包,之后通过ssh执行远程命令。

ssh远程执行

在使用ssh远程执行命令时,缺少环境变量。
解决办法是在执行远程shell时,source ~/.bash_profile,因为之前JDK之类的环境变量是在.bash_profile文件中,所以先刷新环境变量,之后在执行相关的命令。

tomcat重启

在部署项目时,需要对tomcat进行重启,使用如下脚本执行:

1
2
3
4
5
6
7
8
9
10
11
12
export BUILD_ID=dontkillme	#避免启动时被jenkins杀掉
/home/xxxx/apache-tomcat-9.0.7/bin/./shutdown.sh
sleep 3
tomcat_process=`ps aufx|grep tomcat | grep manage | awk '{print $2}'`
if test -n "$tomcat_process"
then
kill -9 $tomcat_process
echo "kill tomcat"
fi
#`ps aufx|grep tomcat | grep manage | awk '{print $2}' |xargs kill -9`
#ps axuf|grep tomcat|grep -v grep |grep manage|awk '{print "kill -9 " $2}'|sh
/home/xxxx/apache-tomcat-9.0.7/bin/./startup.sh

tomcat序列化

在之前测试和使用tomcat时,都是直接killtomcat进程然后重启tomcat,现在是通过tomcat命令重启。
在tomcat关闭时,会把session中的对象序列化放入work目录中session.ser文件,在重启tomcat时,会把对象重新反序列化到session中,又因为在项目中对象的一些基本属性是放入了一个公用的父类里面,子类继承时,虽然子类实现了序列化接口,但是在使用Java序列化时,如果父类没有实现序列化接口,反序列化时,并不会反序列化父类,所以这里因为父类没实现导致反序列化时丢失部分属性,导致使用到父类属性的功能失效。

验证码乱码

在项目部署后,有个验证码功能,在使用验证码时,发现返回的验证码乱码无法识别,这是因为使用验证码时使用的字体在服务器上没有,导致验证码乱码。解决办法:

1
2
yum install fontconfig-devel 
yum groupinstall fonts

如上安装字体。

tomcat启动慢

在使用过程中,tomcat每次启动特别慢,网络上说是因为一个tomcat在生成随机数导致系统变慢。解决办法:

1
2
yum install rng-tools
systemctl start rngd

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server{
listen 80;
server_name www.xxxx.com;
# 强制转跳https
return 301 https://$server_name$request_uri;
#error_page 497 https://$host$uri?$args;
}
server{
listen 80;
# 强制添加www
server_name xxxx.com;
return 301 https://www.xxxx.com;
}
# 设置https
server{
listen 443 ssl;
server_name www.xxx.com;
ssl on;
ssl_certificate cert/214591366330598.pem;
ssl_certificate_key cert/214591366330598.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect default;
}
}

阿里云高速通道

在使用jenkins发布war包时,如果走外网,那么因为带宽的原因,导致传输速度特别慢,所以需要使用阿里云高速通道。
参考:

  • 跨账号VPC互连

数据库迁移

在迁移数据时为了方便,直接拷贝原有数据库文件到新mysql中。
但是在使用过程中发现提示找不到table。
因为之前数据库中使用的InnoDB引擎,还需要拷贝ibdata1文件,暂停mysql后,删除现在ib_logfile*文件,重启mysql

参考:

  • [Mysql table ‘’ doesn`t exist](http://www.cnblogs.com/brucexuyg/archive/2012/06/22/2558755.html)

其他命令

打war包
jar -cvf test.war *

解压war包
jar xvf temp.war