任务简述

虽然一直在 Windows 进行编码,但最终项目是要部署到 Linux 服务端上的,本次将演示在 Linux 上部署简单项目的过程,本次服务器端为使用 Hype-V 装的 Ubuntu 18.04.6 LTS,如果使用云服务提供商的产品,部分步骤可以被省略。

安装 JDK

更新

1
2
sudo apt-get update
sudo apt-get upgrade

注意更换 apt-get 源(修改 /etc/apt/sources.list 中的内容为国内镜像源)

安装 JDK 8

1
sudo apt install openjdk-8-jdk

完成后 java -version 能输出版本信息,表示安装成功

配置环境变量

虽然此种方法不需要配置环境变量就可以使用,但由于别的程序的需要,保险起见,还是进行配置

1
2
user@user-Virtual-Machine:~$ whereis java
java: /usr/bin/java /usr/share/java /usr/lib/jvm/java-8-openjdk-amd64/bin/java /usr/share/man/man1/java.1.gz

通过 whereis java 的返回结果观察到 JDK 的安装目录为 /usr/lib/jvm/java-8-openjdk-amd64

在 /etc/profile 文件末尾加上

1
2
export  JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

通过 source /etc/profile 重新加载配置文件

开放端口

systemctl status firewalld 查看防火墙运行状态

1
2
3
4
5
6
7
8
9
10
11
12
user@user-Virtual-Machine:~$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-05-18 14:19:43 CST; 1h 56min ago
Docs: man:firewalld(1)
Main PID: 558 (firewalld)
Tasks: 2 (limit: 1033)
CGroup: /system.slice/firewalld.service
└─558 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid

May 18 14:19:42 user-Virtual-Machine systemd[1]: Starting firewalld - dynamic firewall daemon...
May 18 14:19:43 user-Virtual-Machine systemd[1]: Started firewalld - dynamic firewall daemon.

后续需要用到 80、3306 和 8080 端口,此处提前打开

1
2
3
4
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=6379/tcp --permanent

重启防火墙并查看开放的端口

1
2
3
4
user@user-Virtual-Machine:~$ sudo firewall-cmd --reload
success
user@user-Virtual-Machine:~$ sudo firewall-cmd --zone=public --list-ports
8080/tcp 3306/tcp 80/tcp 6379/tcp

安装 MySQL

安装服务端和客户端

1
2
sudo apt-get install mysql-server
sudo apt-get install mysql-client

安装完成后检查状态 service mysql status

1
2
3
4
5
6
7
8
9
10
11
12
13
user@user-Virtual-Machine:~/my$ systemctl status mysql.service
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-05-18 14:51:33 CST; 1h 34min ago
Process: 8801 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
Process: 8792 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 8803 (mysqld)
Tasks: 31 (limit: 1033)
CGroup: /system.slice/mysql.service
└─8803 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

May 18 14:51:33 user-Virtual-Machine systemd[1]: Starting MySQL Community Server...
May 18 14:51:33 user-Virtual-Machine systemd[1]: Started MySQL Community Server.

配置远程登录

MySQL 的配置文件位于 /etc/mysql/mysql.conf.d/mysqld.cnf

打开配置文件,将 bind-address = 127.0.0.1 改为 bind-address = 0.0.0.0

常用 MySQL 命令

设置服务开机自启动

1
sudo service mysql enable

启动服务

1
sudo service mysql start

重启服务

1
sudo service mysql restart

停止服务

1
sudo service mysql stop

创建用户与授权

初次安装完成 root 用户没有密码,直接登入

1
sudo mysql -u root -p

修改密码并开放权限

1
2
3
4
5
set global validate_password_length=4
set global validate_password_policy=LOW;
set password = password("1234");
grant all on *.* to 'root'@'%' identified by 'root';
flush privileges;

创建用户

1
CREATE USER 'username'@'%' IDENTIFIED BY 'password';

host:指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符 %

用户授权

1
GRANT privileges ON databasename.tablename TO 'username'@'%';

privileges:用户的操作权限,如 SELECT,INSERT,UPDATE 等,如果要授予所的权限则使用 ALL
databasename:数据库名
tablename:表名
如果要授予该用户对所有数据库和表的相应操作权限则可用 *.*

注意:用以上命令授权的用户不能给其它用户授权,如果想让被授权的用户可以将他的拥有的权限授给其他用户,用以下命令

1
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

刷新授权

1
flush privileges;

导入 SQL 文件

1
source /path/filename;

部署项目

手动部署

使用 mvn package ,将本机项目打包成 jar 包传输到服务器中,使用 nohup java -jar name.jar &> hello.log & 后台运行 jar 包并将日志输出到指定文件。

本机在浏览器中输入服务器端 IP 地址和 8080 端口号访问。

自动部署

准备一个 git 仓库

安装 Git

1
sudo apt install git

安装 Maven

1
sudo apt install maven

获取代码

1
2
cd usr/local
git clone https://github.com/***/***.git

编写自动部署脚本

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
#!/bin/sh
echo 启动
echo 准备停止正在运行的项目
APP_NAME=xxx

tpid=`ps -ef | grep $APP_NAME | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ]; then
echo 正在停止
kill -15 $tpid
fi
sleep 2
tpid=`ps -ef | grep $APP_NAME | grep -v grep | grep -v kill | awk '{print $2}'`
if [ ${tpid} ]; then
echo 正在强制停止
kill -9 $tpid
else
echo 已停止
fi

echo 正在从仓库拉取代码
git pull
echo 拉取完成
echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true`
cd target
echo 正在启动项目
nohup java -jar xxx.jar &> hello.log &
echo 启动完成

运行脚本即可自动打包部署

配置 Nginx

1
sudo apt-get install ngnix

nginx文件结构

1
2
3
4
5
6
/usr/sbin/nginx/  #主程序
/etc/nginx/ #配置文件
/etc/nginx/conf.d/*.conf; #配置文件
/etc/nginx/sites-enabled/*; #配置文件
/usr/share/nginx/ #静态文件
/var/log/nginx/ #日志文件

将前端打包的文件复制到 dist 目录下

在 /etc/nginx/sites-available/default 中编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
upstream targetserver {
server 172.27.134.45:8080;
server 172.27.134.46:8080;
}
server {
listen 80;
root html/dist;
index index.html;
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://targetserver;
}
}

重新加载配置文件

1
sudo nginx -s reload

本机在浏览器中输入服务器端 IP 地址和 80 端口号访问。