【关于个人阿里云服务器项目部署遇到的问题和linux的一些指令】
这次突然想记录一下如何把自己的小项目部署在自己的小小服务器上,可能涉及mysql8.0密码重置,文件传递解压,端口修改等,对于我出现的问题可以选择性跳过,不然可能流程会略长。
运行环境:linux服务器:centos7.6 ;MySQL 8.0.21,tomcat 9 xshell 6
注: 因为主要目的是记述整体流程,所有有些地方会留下参考链接一带而过,不过踩到坑的地方肯定会着重解释的,如果我的流程和踩到的坑能帮到大家我就很开心了。
经过整理,帖子要点如下:
Tips:
1-3:xshell操作与文件传输(上传tomcat-linux版 解压运行)
4 :mysql8重置密码以及一些小坑
5-6:打包方式与sqlyog操作服务器中的数据库
7-8:在linux上运行项目遇到的坑(包括端口修改,yaml踩坑)
注意:项目部署的前提如下:
通过购买或者白嫖获得一个阿里云服务器,然后开放相关端口以供访问;
然后进行服务器环境配置(jdk,tomcat,mysql等),可以自己一个个配,也可以选择用宝塔面板进行傻瓜安装,( 见Kuang神的宝塔部署环境教程:https://www.bilibili.com/video/BV177411K7bH),或者用docker也可以,本篇不会着重写环境配置,在遇到坑的时候可能才会提到环境问题;
服务器准备妥当后建议安装Xshell和xftp,前者可以在window系统下对linux服务器进行远程指令操作,后者可以上传文件。
1.确保服务器开启后,打开xshell,ALT+N 新建连接
![](https://img2020.cnblogs.com/blog/1805670/202105/1805670-20210530113959298-1039443932.png)
主机就是你服务器信息中的外网ip,点击连接后输入用户名和密码即可连接成功,用户名一般都是root,密码是阿里云服务器密码可以自己重置密码;
2.然后嘞,我点击图中箭头所指的绿油油就可以进行文件传输了
文件传输界面:
左侧是本地window环境下的文件,右侧是linux服务器里的文件(home文件一般是放一些用户的文件),可以从左侧选择文件或者直接拖拽文件到右侧某文件夹下 来上传。
emm,注意tomcat有的是windows版本,所以注意要上传linux版的,tomcat9的下载链接如下:
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.46/bin/apache-tomcat-9.0.46.tar.gz
PS:用rz指令也可以上传文件,yum install -y lrzsz 执行后即可使用rz等指令, 输入rz可以通过打开的界面选择要上传的文件,默认上传到root下;输入sz xxx.txt 然后选择要下载到哪个路径即可。
3.解压tomcat9压缩包并查看:(我就是犯傻了,第一次传了一个windows版的hhh)
解压后:ls -ll为查看当前路径下的详细信息
运行tomcat前有个小问题需要确认一哈:java环境是否配置完毕:
jdk安装完成以后,在命令输入java -version,看到下面这种配置信息即为配置成功
进入刚才的tomcat目录下的bin目录,在键入./startup.sh,即可启动tomcat,输入./shutdown.sh即可关闭tomcat,
cd为切入至某路径;cd ..为返回上一层目录;
./表示当前目录,直接输入startup.sh可能会提示你没这个命令哦.
4.mysql8密码重置(如无需要请跳过这一步)
确认mysql版本:mysql -V (注意是大写的V!!)
确认mysql状态:service mysqld status
如图:
然后登陆mysql:mysql -u root -p
输入密码,
哦?密码错误,如果忘了需要重置密码,流程如下(ps:linux输入密码是不可见的,所以第一次输入时不要惊讶, 输完密码回车就好)
(1)输入如下指令进入配置文件编辑, 顺便提一下vim指令下按a是进入文本编辑,按esc可以退出文本编辑状态,然后再输入:wq回到控制台;
#vim /etc/my.cnf(注:windows下修改的是my.ini),然后找到 [mysqld]文本段,在该文本段内的任意一行添加 skip-grant-tables 不用加逗号,意思是登录时跳过密码验证;
改完后按esc,再输入:wq即可回到主页面。
如图所示:可以在鼠标绿色光标位置输入skip-grant-tables
(2)回到主页面后 重启mysql:service mysqld restart
登录mysql:mysql -u root -p
输入密码处直接回车,发现直接就进入mysql内了,如图
(3)现在已经进入mysql了,这个时候mysql8的处理方式和低版本不一样,需要清空authentication_string字段,
update user set authentication_string='' where user='root';
然后按 exit 回到主页面,再次根据(1)的流程进入文本模式,但是这次我们要把之前添加的 skip-grant-tables 删掉;
然后重启mysql,
service mysqld restart
再进入mysql,
mysql -u root -p
密码处依然直接回车就可以,然后执行修改密码语句,注意新密码应该包括大小写字母和特殊字符,而且至少八位,mysql8麻烦就麻烦在这个烂密码和时区上了。。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
好了,重启mysql后就可以用新密码登录了~
呐,最后(3)这步我就不放截图了,因为断掉连接重新测试密码前忘记截图了。。懒得重新走一遍流程了, 不过指令都写上了;
当然,若某一步遇到提示no database selected,表示未选择数据库,输入 use mysql; 即可(
PS:和普通linux指令不同,进入数据库后,其mysql操作指令需要打分号作为结尾,比如show databases;或者describe tablename;等等)
PPS:Xshell环境下的linux命令中,单引号请替换为双引号,不然可能会无法识别。
5.IDEA给web项目打包 (war/jar)
打包过程不去多说,百度上面有很多教程,
比如:https://blog.csdn.net/qq_34872748/article/details/100390922
或者用maven也可以打包:
maven打包后生成位置默认是target文件夹下
然后把war文件上传到服务器的tomcat的webapps下,如果是jar位置就比较随意了...
6.用本地Navicat(或者sqlyog)连接Linux上的mysql
这一步是为了方便操作服务器上的数据库,只部署项目的话可以跳过。
Navicat,sqlyog,都是一种可视化的mysql操作工具;我们可以借助这些工具对服务器上的数据库进行操作。
我用的sqlyog,遇到的问题以及结局方法如下图:
sqlyog新建连接后 点击连接可能会提示 xxxxxx ip不被允许到这个mysql服务,
解决办法:
进入mysql后输入如下指令并执行
use mysql; update user set host='%' where user='root';
最后别忘了重启mysql服务!
7.war/jar包上传后发现浏览器无法访问...
一步步排查,先从项目开始:
我的项目用的springboot,springboot自带嵌入式的tomcat,会不会有什么影响呢,我决定百度一下;发现还是有一些地方需要修改:
在pom中<modelVersion>标签之上或附近的位置添加<packaging>war</packaging>标签,因为boot默认的打包方式是jar,上面第五步也提到过非maven打包方式,目前来看似乎都可以(大概),二者生成位置不一样,一个是out文件夹,一个是target内。
需要移除嵌入式tomcat插件:
在pom.xml文件中找到spring-boot-starter-web,然后修改成如下:
并添加servlet-api的依赖
<!--添加servlet-api的依赖, scope保证其只在编译时起作用--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
利用maven打包:如图,点击右侧的maven栏,选择package后点击绿三角(可能打包过程会出现测试报错,这个可以通过在pom的plugin中添加相关代码跳过测试,此处略,根据报错百度即可)
上图的包生成位置在target文件夹下;
===war包的话利用xftp把war文件上传到服务器tomcat的webapps下,然后确认tomcat已启动,tomcat启动会会自动解压部署,现在可以试着通过浏览器进行访问了,
war包发版如下:
1.停止服务:
在/tomcat/bin路径下执行./shutdown.sh
2.在tomcat/webapps 路径下上传新包,备份旧包
3.启动服务: 还是bin目录下./startup.sh 或 sh startup.sh
===jar包的话应该是没有位置要求,找一个你中意的地方然后在此文件夹下执行命令:
java -jar xxxxx.jar
想要关闭窗口也可以运行就用下面的指令,
nohup java -jar XXX.jar >temp.txt & PS:XXX是上传后的jar包名
拿项目上的文档举个栗子:
nohup java -jar -Xms512m -Xmx1536m -Dspring.profiles.active=default hict-service.jar > app.log 2>&1 &
①可以指定spring.profiles.active参数控制多环境配置
②nohup : 不挂断运行命令(以守护进程形式运行)
③-Xms -Xmx : 指定堆空间初始和最大大小
④-Dspring.profiles.active:指定环境,启动时会动态替换配置项spring.profiles.active的值
⑤& : 进程在后台运行
⑥ >
8.遇到的一些问题
(1)修改端口号:
mmp,每次都是jsvc.exec这个老流氓占8080端口,kill没用,正好 tomcat也经常会用到很多,需要多准备几个端口号,所以我开了个8083,方法如下:
假设tomcat所在目录为/home/apache-tomcat/
1、打开tomcat配置文件
#vim home/apache-tomcat/conf/server.xml
2、打开Tomcat配置文件之后按 /8080 快速检索
3、修改端口,按 i或a 编辑,将8080 修改为 8083
4、按:wq 保存并退出
5、 重启tomcat
#/var/apache-tomcat/bin/shutdown.sh
#/var/apache-tomcat/bin/startup.sh
嗯?修改端口号后测试http://120.26.57.239:8081/居然不通过,阿里云安全组也添加了8083端口,so,重启无效后我手动添加了安全组,然后再将tomcat重启,这次可以访问。
关于手动指令添加安全组的操作如下:(我的linux环境是CentOS 7.6,请根据自己的环境选择)
我们先进入tomcat安装目录的bin下,然后输入
firewall-cmd --zone=public --add-port=8083/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports #这一步是查看目前防火墙public下所有已开启的端口
操作参考链接如下,老哥写的很详细,有centos6,7的:
https://www.cnblogs.com/zlslch/p/6441447.html
(2)改完端口号继续尝试运行:
你大爷的,还敢说占用?
百度了一下,可以用这个指令:java -Dserver.port=8083 -jar demo2.jar
直接锁死运行这个jar包的端口,哼,这次可以运行了
(3)到上一步为止,应该说是基本成功了,之所以说是基本,原因是我虽然可以运行项目,但访问请求有一些是404和500,ps:项目中我写了一个专门的404页面,所以呢,虽然项目可以在linux上运行了,但是好像请求出了问题,下一步要解决的就是这个咯。
(4)好了,今天来排错。看了一下控制台,点击跳转的时候报错是mysql问题:Access denied for user 'root'@'localhost' (using password: YES
大致上就是说我项目请求mysql数据库连接失败??我本地测试的时候项目是没有问题的,而且...excuse 咪?我自己linux密码都改完了你跟我说不行?再次去项目里查看jdbc的部分,哦, localhost应该换成我服务器的id,然后运行还是报错,还是这个错,再去手动mysql -u root -p,输入密码,账户和密码是没问题的。
等等,我之前一直用的本地mysql测试项目,还没有用aliyun服务器上的mysql运行过,大意了!
先用侧边栏的database进行测试连接 TestConnection,OK,虽然有200多ms的延迟,但是可以连接。然后运行项目,出现了新问题:
ERROR org.springframework.boot.SpringApplication - Application run failed
org.yaml.snakeyaml.constructor.ConstructorException: could not determine a constructor for the tag xxxx
in 'reader', line 4, column 15:password :xxxx
看起来是yaml的问题,但是我用本地数据库就可以运行,用服务器上的数据库就yaml报错????这不科学,所以问题应该还是在yaml中的数据库配置这一部分,果然,我在网上找了很久,终于在知乎上找到了类似的问题与解决办法:https://zhuanlan.zhihu.com/p/98137490
原因是mysql密码包含特殊字符。。。导致yaml识别出现问题,解决办法就是把密码用单引号或者双引号扩住,要不就干脆舍弃yaml使用properties。
如图:
这个问题看似是yaml搞鬼,实际上还和mysql有关。。你想啊,mysql8以前都不强求要包含数字字母和特殊字符组合的,没有特殊字符不也就没这么多烂事了。
最后附上我的沙雕banner图和运行图
浏览器访问途径为 http://你的ip:8083/jar或war包名
附上一些别人的帖子,可以看看:
https://blog.csdn.net/weixin_43968663/article/details/103290840
https://www.cnblogs.com/zlslch/p/6441447.html
https://www.zhangshengrong.com/p/2EaE0wpd1M/
https://zhuanlan.zhihu.com/p/98137490