在绕了无数弯路之后,我终于把项目部署到了云服务器上,并且运行成功,登录注册功能都正常。
如果让我再做一次,我肯定会熟悉很多,应该半小时之内能完成。但是一开始我连自己要做什么都不清楚,误打误撞,浪费了特别多时间,以至于花了三四天。
也许不能算浪费吧,毕竟在不停的碰壁中,我对maven、spring boot、数据库、centos的使用都更熟悉了,把书读厚又读薄了,学的还挺多的。测试成功的那一刻,所有之前的烦躁都变成了成就感和一点失落。
中间还有很多问题被绕过了、没有解决,写完本文后我再细细学。
学习过程中依然参考了特别多的文章/问答,实在没法一一引用了。
零、遗留问题
上次把学习笔记和运行成功的示例代码传到GitHub上了,但是用的是网页的途径。长远看来,我需要学会用git命令行来提交仓库,但是我操作还不是很熟练,所以在做这次的小任务之前,先了解一下git的功能、用法和原理。
听说git是Linus花了两个星期用C写成的,太强了。
1. git入门
前置知识:
- 非对称加密。
- 公钥,私钥,数字签名,数字证书。
- ssh协议。
常用命令:
clone
, status
, add
, mv
, rm
, commit
, push
等等。
git的原理:
*待续。可能不写。
也许使用git是不必了解原理的,但我真的很好奇。
2. Unix入门
Unix基础
在操作系统课上学过,不再详述。
Linux常用命令
在ICS课上学过,不再详述。
3. 在服务器上运行
租赁服务器
这次选择了腾讯云的轻量应用服务器。没什么理由,比较随便。
- 在腾讯云网站选择计算-轻量应用服务器。
- 地域就近选择北京,降低访问时延(虽然我现在暂时在老家,但长远来看主要还是会在北京)。
- 镜像选择系统镜像-CentOS 7.6。
- 套餐有通用型和存储型两种,不知道选什么,但我应该不是用来存储的,猜测存储型会有比较大的访问比较慢的硬盘(可能是HDD?),所以选通用型。选择了90元/月的版本,买了三个月。因为我是学生,认证后可以打一折,共计27元。
- 实例名称随意,购买数量一个。
*这里显然还有很多问题,比如轻量应用的意思,镜像的意思,应用镜像和系统镜像这两种类型的区别,不同具体镜像的区别,等等。除此之外,我还对云服务器的原理非常好奇。难道我真的独占一个物理的服务器吗?这样对供应商来说似乎难以管理并且成本太高。我猜测他们应用了虚拟化的技术,但暂时想不出更细节的实现方式。
现在最紧迫的任务是赶紧把SpringBootDemo部署上去……本来这几天因为回家、面试之类的事情已经耽误了很多时间,为了学git又耽误了一些时间,我更没时间解决次要矛盾了。这些问题等我部署完了再来细细了解。
搭建Java开发环境
在腾讯云-云产品-轻量应用服务器这里找到刚刚租的服务器,显示的信息包括CPU 1核 - 内存 2GB - 系统盘 60GB,以及公网IP。
连接到服务器
参考的教程主要是腾讯云的一篇官方文档。
- 重置密码。
*密码和密钥的区别暂时没搞懂。部署完了就学。 - 开放22端口。这个是创建实例时默认开放的。
- 打开PuTTY。在主机名处输入公网IP,端口22不需修改,连接类型选择SSH,Save Sessions(保存会话)处输入会话名称以便下次直接双击登录。点击右侧的Save保存这些设置,下次就可以直接点击会话名来连接。
- 第一次登录时,可能弹出下面这种警告:
根据前面对于公钥、私钥、数字签名、数字证书的了解,我认为该警告出现的原因是:服务器的公钥是未经受信任的机构认证的,并且也不在受信任公钥的缓存中。putty给出服务器的指纹(这基本上就是公钥,只是公钥太长了,用指纹代替),由用户自己判断要不要相信。
今天我选择相信,因为大概不会有人闲到在岌岌无名的我和空无一物的云服务器之间发动中间人攻击,而腾讯云作为供应商是可以相信的。 - 连接成功后,弹出命令行窗口,提示
login as:
,此时输入用户名。然后提示输入密码,于是输入。
这里的用户名和密码是要在网页上用重置密码来设置的。一开始是空的,不知道能不能登录。 - 连接成功,出现
root@VM-8-3-centos ~]#
的提示。 - 某些路由器/防火墙会追踪所有穿过它们的连接,一旦某个连接上一段时间没有任何流量,路由器/防火墙会认为该连接已经死亡,于是将其切断。这会导致putty触发错误
Network Error: Software Caused Connection Abort
。为避免这种情况,可以配置putty,使其每隔一小段时间就发送空的数据包,保持连接活跃。具体方法为主界面-Connection-设定Seconds between keepalives为某个数字(比如5),并且开启Enable TCP keepalives。为了避免重复设置,把这些都保存在刚才设置的session里。
安装JDK
- 升级包仓库,保证下载到最新的软件:
sudo yum update
- 一开始是想在Oracle官网获得JDK 11.0.11的下载链接,选择Linux x64 RPM Package版本,下载它:
wget https://download.oracle.com/otn/java/jdk/11.0.11%2B9/ab2da78f32ed489abb3ff52fd0a02b1c/jdk-11.0.11_linux-x64_bin.rpm
下载完发现只有4.1k,肯定是错了,具体为啥不知道。
查找后发现yum
自带安装Java的功能,使用
yum search java
能查找所有yum能安装的、名字里有java
的库。跳出来好多好多,其中包括java-11-openjdk-devel.x86_64
,符合需求,所以安装它。
yum install java-openjdk-devel.x86_64
这次在询问前显示安装包大小为170多M,应该是对的了。
- 配置全局变量。使用的编辑器依然是无敌的vim。输入
vi /etc/profile
编辑配置文件。按下i
进入输入模式,在配置文件中添加以下三行:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
可能vim对老手来说很强力吧,但对我来说真的好难用啊。
*这几行的意思只能猜个大概,具体的还得了解。
- 输入
java -version
,显示
openjdk version "11.0.11" 2021-04-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.11+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.11+9-LTS, mixed mode, sharing)
大概是安装成功了。
……
过了一天,不知道怎么,我好像是安装了两个版本的Java,分别是8和11。输入java -version
,跳出来的是8;试图安装11,被告知already installed。查看JAVA_HOME
的值,指向的是版本11。
我感到非常费解,google也查不到类似的问题,想先把版本8卸载试试,于是自己在/usr/lib/jvm
胡乱删了一些名字带有java-1.8.1
的文件和文件夹,然后再用java -version
命令,被告知No such file or directory
。这样姑且算卸载成功了吧……?但是用sudo yum install java-11-openjdk-devel
又被告知已经安装……
后来查到有个reinstall
的命令,我就用它又试着安装了一下版本11,终于成功。
*到底为什么呢?
配置MySQL
MariaDB是MySQL的一个分支,也是CentOS中默认的MySQL安装包。使用命令sudo yum install mysql
即可一步到位地安装。
如果要使用其他版本,可以去官方的MySQL Yum Repository
获得下载链接,然后用wget
命令下载一个.rpm文件,用md5sum
来检查它的完整性,用sudo rpm -ivh
来解压、安装。
接下来安装MySQL服务器。用sudo yun install mysql-server
即可。
*安装的这两个部分的关系还没搞懂。
下面几行命令分别是对数据库执行启动、检查状态、停止、重启:
sudo systemctl start mysqld
sudo systemctl status mysqld
sudo systemctl stop mysqld
sudo systemctl restart mysqld
*这里的systemctl
是控制systemd系统和管理服务的命令,具体的使用还有待学习。
为了添加demo程序能够使用的数据库和数据表,需要进入MySQL的命令行。用mysql -u root -p
登录,接下来就是数据库的操作了,无非是create database
、user
、create table
之类的,不详述。
添加好表之后,用上面的命令启动一下数据库。
*安装maven
这一步根本不需要做,但我一开始不知道自己要做什么,还以为要把代码上传到服务器上再编译,那么maven就是必要的了,没有maven服务器肯定不知道怎么编译,也不会读pom.xml
文件……这么想着,我就找了很久怎么在centos上安装maven,好巧不巧还真有很多教程,我就跟着做了很久,大概有半天都浪费在这上面了。
最后倒是装上了,甚至还真的编译成功了(编译的时候花了半个多小时下载各种依赖),然后又不知道怎么run了……
反正这些工作都是白费力气,不写了。
安装git
*这一步不知道是不是必要的。我部署的方式是把项目打包成一个.war
,上传到GitHub,然后再在服务器上clone下来运行。在我的方式中GitHub这一步完全是多余的,除了作为中介没有任何作用,所以我觉得实际的开发中应该有好得多的部署方式,能把文件直接传到服务器上,但不知道具体是啥。
还是按最简单的方式,不写了。
现在环境终于搭建好了,万事俱备,只差war包。
打包的方法参考Building Java Projects with Maven,在pom.xml
的build部分里新增一个插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.demo.SpringBootApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
*这里似乎有很多相似的插件可用,比如上面这个,其实不是我实际用的。我用的是似乎是maven-assembly-plugin
,但我一时找不到我用的那个怎么写了(刚换了电脑)。这些插件的用法乃至整个pom.xml
文件的用法我都得再好好了解。
运行
是最简单的一步。把war包传到服务器上,然后java -jar {nameOfWar}
即可。
这里我遇到了一个问题:JRE的版本太低。所以我前面才要把版本从8升到11。
*jar和war的区别还没搞懂。
终于成功了。
接下来试着从本地连接。在request URL处填写http://{IP_of_Server}:8080
加上其他部分(端口默认是8080),发送请求试试:
发出注册、登录等请求,相应都符合预期。在服务器上查看数据表,注册的信息也都存好了。
大功告成。
*其实有个不符合预期的地方……就是我登录时,选择Body的form-data才能并且一定能得到正确响应,像以前和教程里写的那样则永远返回账号密码错误。还得研究。