Linux部署后端服务器

最近在做微信小程序的项目,我负责后端的部分。由于项目组人数比较少,所以采用前后端分离的开发模式开发整个项目。在开发过程中难免需要为前端人员提供接口与数据,所以项目过程中将测试程序部署到服务器,让前端通过域名访问的形式来访问接口、接发数据是很有必要的。我在部署的过程中遇到了不少困难,但是在通过查阅资料后找到了最简洁的部署方式,便记录下来帮助有需要的读者。

由于微信小程序不需要部署前端项目,只需要将后端部署在服务器上即可,故以下内容仅涉及如何部署一个后端接口服务器

一、Jar 包

我使用 SpringBoot 框架开发 Java 后端程序。SpringBoot 框架基于 Maven 进行项目管理,并且自带 Tomcat 服务器,通过 Maven 的 【package】功能可以很容易将项目打包成 Jar 的形式。

1. 1 VSCode

如果你使用 VSCode 开发代码的话,【Maven for Java】插件提供了图形化的管理界面。开发完成后,依次点击左下角的【MAVEN】->【Your_Project_name】->【Lifecycle】->【package】,即可将程序打包成 Jar 包。

1. 2 命令行

如果你使用其他的开发工具开发,也可以使用命令行的格式对项目打包。进入到项目路径下,打开终端输入:

1
mvn package -f "d:\path\to\your\project\pom.xml"

通过上面两种方式打包完成后,Jar 包会被存放在 "d:\path\to\your\project\target" 路径下,命名为 Your_Project_name.jar

二、Nginx

由于生成的 Jar 自带 Tomcat 服务器,启动之后默认端口为 localhost:8080,所以我们可以不用单独设置 Tomcat 服务器。

虽然说我们不部署前端程序,Tomcat 服务器也可以直接被访问,但是我们依然可以使用 Nginx 作为 Tomcat 的代理服务器。

Nginx 用来作为 Tomcat 代理服务器有很多优点:

  • (如果你要部署前端项目)Nginx 可以非常高效地处理静态文件,可以减轻 Tomcat 服务器的压力。
  • Nginx 可以为 Tomcat 提供反向代理,隐藏 Tomcat 的真实地址,提升了安全性。
  • Nginx 可以做负载均衡,当有多个 Tomcat 服务器时可以均匀分配业务,提升了性能和拓展性。

安装好 Nginx 后,需要配置 Nginx 实现后端代理功能。在 Linux 终端中输入命令:

1
sudo vim /etc/nginx/sites-enabled/default

具体文件路径可以自行查找。在打开的文件夹中找到并修改为以下字段:

1
2
3
4
5
6
7
8
9
10
11
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name Your_Domain;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
proxy_pass http://localhost:8080; # Tomcat监听的地址
}

其中:

  • server_name:修改为你的域名网址
  • 注释掉 try_files $uri $uri/ =404;
  • 添加 proxy_pass http://localhost:8080;,用于反向代理 Tomcat 服务器

配置好后,在终端中输入以下指令用于重载配置:

1
2
sudo nginx -t
sudo systemctl restart nginx

三、启动 Jar 包

配置好 Nginx 后,只需要操作 Java 启动 Jar 包就行了。默认 Linux 安装的版本可能不是适配的版本,请前往 Oracle 官网下载适配版本。

你可以在终端中输入 uname -m 查看服务器架构。

3. 1 手动启动

将你的文件上传到 Linux 服务器,进入到 Jar 包所在的路径下,输入指令:

1
nohup java -jar your_project_name.jar &> project.log &

其中:

  • nohup 表示程序将以后台运行的方式启动
  • 程序输出的内容将存放到 project.log 文件夹下

此时你的服务器应该能正常通过域名访问了。

3. 2 自动启动

如果你想你的服务器自动启动,可以通过 Linux 的 systemctl 来管理服务。

首先需要新建一个 Shell 脚本,用于输出日志文件和启动程序:

1
sudo vim start_app.sh

然后在文件中输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# 定义日志文件路径
LOG_DIR="/path/to/your/log"
CURRENT_LOG="$LOG_DIR/CURRENT_LOG.log"
# 如果日志文件存在,则重命名为程序退出的时间
if [ -f "$CURRENT_LOG" ]; then
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
mv "$CURRENT_LOG" "$LOG_DIR/id_$TIMESTAMP.log"
fi
# 创建新的日志文件
touch "$CURRENT_LOG"
# 更改日志文件的权限
chmod 644 "$CURRENT_LOG"
# 启动Java应用并将输出重定向到日志文件
/path/to/your/java -jar your_project_name.jar >> "$CURRENT_LOG" 2>&1

其中程序如果退出,脚本则会将日志文件保存成【时间.log】的形式,方便对日志文件进行管理。

保存之后,赋予执行权限:

1
sudo chmod +x start_app.sh

创建好执行脚本后,新建一个服务单元文件:

1
sudo vim /etc/systemd/system/your_project_name.service

然后在文件中输入:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Intelligent Diagnosis Java App
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/app
ExecStart=/path/to/your/shell/start_app.sh
SuccessExitStatus=143
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

其中:Description 表示启动时显示的描述信息,After 表示开启网络连通之后才会启动程序的功能,User 表示服务通过哪个用户启动,WorkingDirectory 表示服务工作路径,ExecStart 表示执行的指令 ,SuccessExitStatus 表示服务成功退出时的状态码,Restart 表示断线自动重连,RestartSec 表示重连的间隔时间(s),WantedBy 表示多用户模式下运行时自动启动。

保存退出后,在终端中输入以下指令是配置生效:

1
2
sudo systemctl daemon-reload
sudo systemctl restart your_project_name

你可以输入以下指令查看程序是否正常运行:

1
sudo systemctl status your_project_name

四、总结

本文仅仅设计一个小型个人项目的服务器该如何部署,如果需要部署更大的项目,或者设置更复杂的服务器集群,特别是本文配置 Nginx 服务器的部分难免有考虑不周的地方,具体方法请参考其他博客或者期待博主以后的更新^^,不过应该能应付单个服务器的部署了。感谢你看到这里,希望我的解决方法能给你的问题带来一点启示。


Linux部署后端服务器
https://watercuckoo.top/Linux部署后端服务器/
作者
WaTerBirD
发布于
2024年2月26日
许可协议