【踩坑记录】记第一次部署项目到腾讯云服务器
【踩坑记录】记第一次部署项目到腾讯云服务器
1.前言
任务:已知腾讯云服务器的ip、账号、密码,将快递e栈项目部署到腾讯云。
必备技能:用Xshell访问Linux服务器(熟悉各种操作的指令);用SecureFX向Linux服务器上传文件(如:Java的jdk安装包、Tomcat安装包、项目的war包等),也可用该软件进行文件的删除、重命名等操作。
在完成该任务期间,踩了很多个坑,从一个坑里走出来,然后又进入了另一个坑。一回生,二回熟,将第一次部署项目的经验教训记录下来,避免以后同一个跟头栽两次。
如有表述不当的地方,欢迎指正。
2.踩坑记录
踩坑1:服务器上的jdk、tomcat安装哪个版本?
先给出结论,然后慢慢解释。
结论:服务器安装的jdk需要与自己电脑写项目时所用的jdk一致;服务器tomcat版本<=服务器jdk版本即可。
我自己写项目代码的时候,电脑上使用的是jdk和tomcat版本是:
jdk:11.0.6
tomcat:9.0.37
一开始,我给服务器安装jdk和tomcat时,安装的是jdk1.8,tomcat8。
我将war包传到了服务器并解压后,通过浏览器访问该项目,报404错误,注意:是可以通过url"ip地址:8080"访问tomcat主页的。
查看tomcat的logs文件夹下的日志,发现报错:
java.lang.UnsupportedClassVersionError:com/czn/filter/AccessControlFilter :
Unsupported major.minor version 55.0 (unable to load class[com.czn.filter.AccessControlFilter])
意思是:
编译好的.class文件,当时编译的时候所用的jdk版本(在我自己电脑上编译的),与现在服务器上要运行.class文件的jdk的版本不一致,即:我的电脑的jdk跟服务器的jdk版本不一致。
再解释地详细点:
1.在用idea将项目打包成war包时,使用的是编译好的.class文件,而不是.java源文件,是在我自己的电脑上进行编译,使用的是我的电脑上的jdk。服务器如果想要正确执行这些.class文件,就需要有正确版本的jdk。.class文件当时编译和执行所用的jdk必须版本一致。这里其实体现了初学Java时所学的一个概念:“一次编译,到处运行”,用Windows版本的jdk11编译的.class文件,既可以在Windows上运行,也可以在安装有Linux版本jdk11的Linux操作系统上运行。
2.报错中的55是什么?
每一个jdk版本都对应着一个major.minor version:
(注意:jdk8就是jdk1.8)
我们记住jdk6对应50,然后就能够以此类推,版本+1,major.minor version也+1,可以推算出,55对应的jdk版本为11,我的电脑用的jdk版本确实为11。
于是,我就在服务器上重新安装了jdk11,但还是不能访问项目。原因:我安装jdk1.8的时候,使用的方式是上传安装包并解压,然后配置环境变量:在etc/profile文件里设置JAVA_HOME。我安装jdk11的时候,用yum方式安装的。虽然我在命令行里输入java -version,显示的版本号是11,但实际上tomcat用的jdk还是之前的1.8版本。
怎么查看tomcat的所用的jdk版本?
进入tomcat安装文件夹的bin目录下 执行./version.sh
资料
yum方式安装的jdk在哪个位置?
yum方式是自动安装的,没有指定安装的路径。在/usr/lib/jvm目录下。
修改tomcat所用的jdk版本:
修改etc/profile文件里JAVA_HOME对应的jdk路径,从jdk1.8的路径改成了jdk11的路径。
修改后的etc/profile:
再次查看tomcat所用jdk版本:
可以看到JRE_HOME还有JVM Version那里的jdk版本都为11。
至于tomcat的版本,tomcat8可以运行jdk8及其以上版本的jdk,tomcat的版本没问题,可以跟自己电脑上tomcat版本不一样。
踩坑2:代码中的URI使用绝对路径还是相对路径?
结论:建议URI都以斜杠/开头,斜杠/代表:http://ip地址:8080/。
URI会出现在:html、jsp页面里的Ajax,servlet的注解,如:
上边两个图片中的代码对应的是登录功能,用登录功能来说明路径问题。访问部署在服务器上的项目,用户输入用户名、密码后,点击“登录”按钮:
如果URI是以斜杠开头(如图所示:“/admin/login.do”),那么完整的请求地址为:
http://ip地址:8080/admin/login.do
如果将Ajax中的URI改为“login.do”,假设服务器上war包解压后的文件夹叫做e,那么完整的请求地址为:
http://ip地址:8080/e/admin/login.do
而实际上这是个不存在的请求地址,不对应任何servlet,会报404错误。
可以理解为斜杠/代表http://ip地址:8080/
经验1:发生错误时,请查看tomcat的运行日志
用idea运行tomcat时,可以在控制台看到System.out.println打印的内容,以及一些报错的信息。在服务器上运行tomcat,如果出现了错误,去哪里查看这些信息呢?
tomcat的logs文件夹下放着tomcat运行日志,可以查看catalina.out日志文件。比如,我一开始连接的mysql不是该腾讯云服务器上的mysql,而是另一个远程数据库,每次一点击登录,就报500错误:空指针异常,始终找不到根本原因,最后查看catalina.out日志文件,发现报错:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ‘root’@‘81.70.95.7’ to database ‘0818-chenzuona’
原来根本原因是一直都没连接上数据库。
后来在该腾讯云服务器上安装了mysql,使项目访问本地mysql就没有问题了。
清空catalina.out日志文件:
catalina.out日志文件可能会很大,因为它记录了若干天的运行情况,使用cat指令查看时,可能加载很久,可以使用以下指令先对其进行清空:
echo “”>catalina.out
实时查看catalina.out日志文件:
资料
5.部署流程
5.1 服务器安装Java的jdk
2种方式:
yum
上传安装包然后解压
详见:资料
5.2 服务器安装tomcat
上传tomcat安装包到服务器上,然后解压,指令如下:
tar -xzvf apache-tomcat-8.5.11.tar.gz
进入到tomcat的bin文件夹,开启tomcat的指令:
./startup.sh
关闭tomcat的指令:
./shutdown.sh
网页测试:在浏览器上输入http://ip地址:8080/,看是否能显示tomcat主页。
5.3 服务器安装MySQL
步骤1: 检测系统是否自带安装mysql
[aaa@qq.com /]# yum list installed | grep mysql
步骤2: 删除系统自带的mysql及其依赖(防止后面安装发生冲突)
[aaa@qq.com /]# yum -y remove mysql-libs.x86_64
步骤3: 给CentOS添加rpm源,并且选择较新的源,RPM软件包管理器缩写
[aaa@qq.com /]# wget --no-check-certificate dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
步骤4: 安装第一步下载的rpm文件
[aaa@qq.com /]# yum install mysql-community-release-el6-5.noarch.rpm
此处需要输入"y"
[aaa@qq.com /]# yum repolist enabled | grep mysql //列出你所有的yum repo文件
步骤5: 使用yum安装mysql
[aaa@qq.com /]# yum install mysql-community-server
此处输入3次“y”
安装完毕
步骤6: 启动mysql服务
[aaa@qq.com /]# service mysqld start
步骤7: 查看mysql是否自启动,并且设置开启自启动
[aaa@qq.com /]# chkconfig --list | grep mysqld
0 1 2 3 4 5 6 代表centOS启动状态
[aaa@qq.com /]# chkconfig mysqld on
步骤8: 修改字符集为UTF-8
[aaa@qq.com /]# vim /etc/my.cnf
在[mysqld]部分添加:
character-set-server=utf8
在文件末尾新增[client]段,并在[client]段添加:
default-character-set=utf8
esc退出编辑 :wq保存退出
修改完成后保存重启服务
[aaa@qq.com /]# service mysqld restart
步骤9: 修改默认配置
[aaa@qq.com /]# mysql_secure_installation
按照提示进行配置,这里默认root用户的密码空,直接回车即可。此处输入内容:“y”,“y”,“n”,“y”,“y”
步骤10: 授权远程登录
方案1: 实现远程连接(授权法)- 将权限改为ALL PRIVILEGES
[aaa@qq.com /]# mysql -uroot -p
mysql> use mysql;
Database changed
mysql> flush privileges;
//mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问
mysql> select host,user,password from user;
这样机器就可以以用户名root密码root远程访问该机器上的MySql.
方案2: 实现远程连接(改表法)
use mysql;
update user set host = ‘%’ where user = ‘root’;
fiush privileges
这样在远端就可以通过root用户访问Mysql
5.4 将项目打包成war包,并上传到webapps文件夹下
war包组成部分: 一是WebContent,二是classess。
- WebContent目录代表其是一个web项目, 主要存放的是前端代码、Web.xml、lib等文件。
- classes目录是编译过后的java文件的二进制文件.( .class ) 后台逻辑都是由这里管控。
idea打包war包:资料
war包上传到tomcat的webapps文件夹下。先关闭tomcat,再重新启动tomcat。webapps文件夹下就会有一个war包解压后得到的文件夹。
5.5 使通过服务器访问项目的url不带项目名
通过http://ip地址:8080/就能访问项目,不用加项目名字,有2种方法。
方法1:
把tomcat的webapps文件夹下,原来的ROOT文件夹重命名成其他名字,或者删除掉。将war包解压后的文件夹重命名为ROOT。
其实原来的ROOT文件夹放的就是tomcat的主页。
方法2:
修改tomcat的conf文件夹下的server.xml文件。
在Host节点下加上:
<Context path="" docBase="解压后war包的绝对路径" debug="0" reloadable="true"/>
详见:资料
5.6 数据库连接池配置文件druid.properties的修改
自己电脑上的mysql,和服务器上的mysql可能有些不一样,比如:数据库名字、密码等,如果不一样的话,记得修改druid.properties。
#使用本地数据库:e
#对于我的电脑的mysql来说,密码为空。对于安装在腾讯云服务器上的mysql来说,密码为123456。
url=jdbc:mysql://localhost:3306/e?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
#password=
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000
5.7 navicat不同数据库中数据的迁移
如果想要把自己电脑上mysql里的数据表,弄到服务器mysql里,可以通过navicat。首先要通过navicat连接上服务器的mysql。
点击:“工具”-“数据传输”
详见:资料