记录一次云服务器部署环境搭建

需求

将sprinboot项目、vue项目部署到云服务器

技术栈:springBoot sprinbSecurity mybatis-plus vue gradle docker nginx git node jdk

操作系统:Ubuntu 22.04

ssh工具:Tabby

安装必要软件

Node和npm

从 Ubuntu 软件源安装 Node.js 和 npm

在写作的时候,包含在 Ubuntu 20.04 软件源中的 Node.js 版本是12.22.9,这是一个长期版本。

安装非常直接。运行下面的命令更新软件包索引,并且安装 Node.js 和 npm:

1
2
sudo apt update
sudo apt install nodejs npm

上面的命令将会安装一系列包,包括编译和安装从 npm 来的本地扩展。

一旦完成,运行下面的命令,验证安装过程:

1
2
root@hecs-296785:~# node -v
v12.22.9

jdk

1):官方下载对应的.gz包,这里以jdk-8u181-linux-x64.tar.gz为例

2):创建一个目录用于存放解压后的文件,并解压缩到该目录下

1
2
sudo mkdir /usr/lib/jvm
sudo tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/lib/jvm

3):修改环境变量

1
sudo vim ~/.bashrc

4):文件末尾追加如下内容

1
2
3
4
5
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

5):使环境变量生效

1
source ~/.bashrc

8):测试是否安装成功

1
java -version

nginx

Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它,运行下面的命令:

1
2
sudo apt update
sudo apt install nginx

一旦安装完成,Nginx 将会自动被启动。你可以运行下面的命令来验证它:

1
sudo systemctl status nginx
配置防火墙

现在你已经在你的服务器上安装和运行了 Nginx,你需要确保你的防火墙被配置好,允许流量通过 HTTP(80)和 HTTPS(443)端口。假设你正在使用UFW,你可以做的是启用 ‘Nginx Full’ profile,它包含了这两个端口:

1
sudo ufw allow 'Nginx Full'

想要验证状态,输入:

1
sudo ufw status
验证安装

想要测试你的新 Nginx 安装,在你的浏览器中打开http://YOUR_IP,你应该可以看到默认的 Nginx 加载页面,

Nginx 配置文件结构以及最佳实践
  • 所有的 Nginx 配置文件都在/etc/nginx/目录下。
  • 主要的 Nginx 配置文件是/etc/nginx/nginx.conf
  • 为每个域名创建一个独立的配置文件,便于维护服务器。你可以按照需要定义任意多的 block 文件。
  • Nginx 服务器配置文件被储存在/etc/nginx/sites-available目录下。在/etc/nginx/sites-enabled目录下的配置文件都将被 Nginx 使用。
  • 最佳推荐是使用标准的命名方式。例如,如果你的域名是mydomain.com,那么配置文件应该被命名为/etc/nginx/sites-available/mydomain.com.conf
  • 如果你在域名服务器配置块中有可重用的配置段,把这些配置段摘出来,做成一小段可重用的配置。
  • Nginx 日志文件(access.log 和 error.log)定位在/var/log/nginx/目录下。推荐为每个服务器配置块,配置一个不同的accesserror
  • 你可以将你的网站根目录设置在任何你想要的地方。最常用的网站根目录位置包括:
    • /home/<user_name>/<site_name>
    • /var/www/<site_name>
    • /var/www/html/<site_name>
    • /opt/<site_name>

Gradle

下载gradle
1
wget https://downloads.gradle.org/distributions/gradle-7.6.1-bin.zip /tmp
1
sudo unzip -d /opt/gradle /tmp/gradle-7.6.1-bin.zip
设置环境变量

需要配置PATH环境变量以包含Gradle bin目录。使用你喜欢的文本编辑器,然后在/etc/profile.d目录中创建一个名为gradle.sh的新文件,使用vim创建文件/etc/profile.d/gradle.sh,粘贴以下内容gradle.sh文件中。

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/profile.d/gradle.sh

//添加
export GRADLE_HOME=/opt/gradle/gradle-7.5.1
export PATH=${GRADLE_HOME}/bin:${PATH}

sudo chmod +x /etc/profile.d/gradle.sh

source /etc/profile.d/gradle.sh

gradle -v

打包&部署后端项目

gradle配置文件

gradle 中的sourceCompatibility 与 targetCompatibility 的区别

sourceCompatibility:指定编译编译.java文件的jdk版本;targetCompatibility:确保class文件与targetCompatibility指定版本,或者更新的java虚拟机兼容,

有这么几个原则,是不能违背的,总结起来就是这样

代码用的语言特性对应的JavaVersion
≦ sourceCompatibility
≦ targetCompatibility
≦ Gradle使用的JavaVersion
≦ 客户端环境的JavaVersion

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
plugins {
id 'org.springframework.boot' version '2.6.11'
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
id 'java'
}

group = 'com.lcf'
//version = '0.0.1-SNAPSHOT'
sourceCompatibility = "17"

repositories {
mavenCentral()
}

bootJar {
archivesBaseName = 'blue-server' // jar包名
manifest {
attributes "Manifest-Version": 1.0,
'Start-Class': 'com.lcf.BlueApplication' // springboot项目的启动类
}
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.7.5'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.21'
implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.2'
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.7.3'
implementation group: 'com.baomidou', name: 'mybatis-plus-generator', version: '3.3.0'

implementation group: 'org.apache.velocity', name: 'velocity-engine-core', version: '2.3'

compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.24'

implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.10.5'

implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'

implementation group: 'com.auth0', name: 'java-jwt', version: '3.19.2'

// https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2
implementation group: 'com.alibaba.fastjson2', name: 'fastjson2', version: '2.0.20'

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'

implementation 'org.hyperledger.fabric:fabric-gateway:1.2.2'
compileOnly 'io.grpc:grpc-api:1.54.1'
runtimeOnly 'io.grpc:grpc-netty-shaded:1.54.1'
implementation 'com.google.code.gson:gson:2.10.1'

// https://mvnrepository.com/artifact/cn.hutool/hutool-all
implementation 'cn.hutool:hutool-all:5.8.21'
}

test {
useJUnitPlatform()
}


定制dockerfile镜像

docker镜像学习文档https://docker-practice.github.io/zh-cn/image/

1
2
3
4
5
FROM openjdk:8
MAINTAINER lcf
ADD blue-server.jar blue-server.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","blue-server.jar"]

定制项目部署脚本

后端项目部署之前要做的:
  • 更新仓库代码
  • 打包最新代码
  • 重新构建docker镜像
  • 删除先前的docker容器
  • 重新构建docker容器
  • 创建最新的docker容器
  • 输出执行成功提示信息

bash脚本内容如下

1
2
3
4
5
6
7
8
9
#!/bin/sh
cd blue-server
gradle bootJar
cd build/libs
docker build -t blue-server .
docker stop blue-server
docker rm blue-server
docker run -d --restart=always --name blue-server -p 8080:8080 blue-server
echo 'sucessful----------------------------------------------------------------------------------------------------------------------------------'
前端项目部署需要做的
  • 更新仓库代码
  • 打包最新的代码文件