【Java】部署SpringBoot项目到Linux服务器前世今生详解
使用 SpringBoot,不要用 Gradle-Kotlin!!!
简直他娘的坑死个人,打的jar包,种种问题。要么打不了包,打了又找不到 Main,找到了Main运行又失败。搞了两天放弃了。
新建了个项目,使用Java的 Gradle ,覆盖了build.gradle.kts 和 settings.gradle.kts,然后打包,直接就成功了。我贼他***,搞死个人了。
参考
Linux目录详解,软件应该安装到哪个目录:
https://blog.csdn.net/m0_37629753/article/details/125484894
linux 常用命令:
1)连接linux:ssh root@192.169.9.1 把IP地址换成自己的服务器ip地址
2)将本地jar包拷贝到远程服务器命令:scp -P 22 jdk.tar.gz root@33.101.12.1:/usr/local
3)查看进程号:ps -aux
4)查看被占用端口: netstat -anpt | grep 80 后面的表示指定端口号
5)杀死 进程的,关闭程序 :kill -9 22899
6)查看正在启动过程的日志: tail -500f nohup.out
7)查看java 运行的几个进程 pid: ps -ef | grep java
8)jps -l : 显示全部的java进程
阿里云完整镜像:
maven {url 'https://maven.aliyun.com/repository/central'}
maven {url 'https://maven.aliyun.com/repository/public'}
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven {url 'https://maven.aliyun.com/repository/spring'}
maven {url 'https://maven.aliyun.com/repository/spring-plugin'}
maven {url 'https://maven.aliyun.com/repository/apache-snapshots'}
一、 Linux 安装 Java17
参考:https://www.cnblogs.com/chaosmoor/p/15897693.html
Step 1: 下载 JDK
注意:下载与 Linux 系统对应的版本
查看 Linux 版本
uname -a
官方下载链接:
https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
Step 2:上传到 Linux
上传文件到服务器
scp -P 22 jdk-17.0.2_linux-x64_bin.tar.gz@33.222.111.111://software/java
将下载的 jdk-17.0.2_linux-x64_bin.tar.gz 文件上传至 Linux 服务器,我这里选择的是 /software/java 文件夹
Step 3:解压缩
解压缩到指定目录
mkdir /usr/local/java/
tar -xzvf /software/java/jdk-17.0.2_linux-x64_bin.tar.gz -C /usr/local/java/
Step 4:配置环境变量
vim /etc/profile
按 “i” 编辑,
贴上如下内容(注意jdk的路径地址跟你下载的版本对应):
按 “ESC” 退出编辑模式,“:wq” 保存并退出
export JAVA_HOME=/usr/local/java/jdk-17.0.2
export PATH=$PATH:$JAVA_HOME/bin;
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar;
加载配置:
source /etc/profile
Step 5:测试
删除压缩包
rm -rf /software/java/jdk-17.0.2_linux-x64_bin.tar.gz
二、部署服务器
0. 打包
打包时出错: Entry META-INF/MANIFEST.MF is a duplicate but no duplicate handling strategy has been set.
解决方案,在 build.gradle 添加如下代码:
tasks.withType<Jar> {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes["Main-Class"] = "com.lyl.byyouxxx.ByYouXXXApplicationKt"
}
}
1. 上传 Springboot 的 jar 包到服务器
先创建文件夹
mkdir /opt/xxx
mkdir /opt/xxx/dev
上传 jar 包
scp -P 22 xxx_dev.jar root@33.111.111.2222:/opt/xxxx/dev
2. 运行 jar 包
使用以下命令在后台运行 jar 文件,并指定服务器的 IP 地址和端口号:
执行启动部署命令:nohup 表示后台启动,不显示日志,& 符号放在启动参数后面表示设置此进程为后台进程。
nohup java -jar xxx_dev.jar >/dev/null 2>&1 &
2.1 封装成sh脚本一键启动
#! /usr/bin/env bash
echo "\n*****************xxx-service**************"
serviceId="xxx_dev.jar"
jvmStr="-Xms256m -Xmx256m"
pid=$(ps -ef | grep -w ${serviceId} | grep -v bash | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]
then
echo "服务已启动 $serviceId Stating pid : $pid"
kill -9 $pid
echo -e "$serviceId 关闭此服务"
sleep 2
nohup java -jar $jvmStr ./$serviceId > /dev/null 2>&1 &
echo "正在重启服务..."
else
nohup java -jar $jvmStr ./$serviceId > /dev/null 2>&1 &
echo "正在启动服务..."
fi
sleep 8
# 循环检查进程是否存在,最多尝试 5 次,每次间隔 2 秒
for i in {1..5}
do
sleep 2
pid=$(ps -ef | grep -w ${serviceId} | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]
then
echo "*****************xxx-service启动成功**************"
exit 1
fi
done
echo "*****************xxx-service启动失败**************"
2.2 封装成sh脚本一键关闭
#!/bin/bash
echo "**************关闭此服务************"
serviceId="demo.jar"
pid=`ps -ef | grep $serviceId | grep -v grep | awk '{print $2}'`
if [ $pid ];then
echo -e "$serviceId Stating pid : $pid"
kill -9 $pid
echo -e "$serviceId stop"
else
echo "$serviceId is closed"
fi
三、Nginx 配置
nginx服务常用操作:
#查看nginx服务状态
systemctl status nginx.service
#启动nginx服务
systemctl start nginx.service
#停止nginx服务
systemctl stop nginx.service
#重启nginx服务
systemctl restart nginx.service
#重新读取nginx配置(这个最常用, 不用停止nginx服务就能使修改的配置生效)
systemctl reload nginx.service
1. 安装 Nginx
sudo yum install nginx
2. 配置 Nginx
找到 Nginx 的配置文件 /etc/nginx/nginx.conf 并打开。
vim /etc/nginx/nginx.conf
配置如下文件:
server {
listen 80;
server_name www.project1.com;
location / {
proxy_pass http://127.0.0.1:8080; # 8080 为 project1 项目的端口号
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name www.project2.com;
location / {
proxy_pass http://127.0.0.1:8081; # 8081 为 project2 项目的端口号
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存 Nginx 配置文件,重启 Nginx 服务。您可以使用以下命令来重启 Nginx:
sudo systemctl restart nginx
3. 开放防火墙端口
如果您的 CentOS 系统开启了防火墙,则需要开放相应的端口,例如 80 和 443(如果您的项目需要使用 HTTPS 协议)。
您可以使用以下命令开放这些端口:
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload
如果您使用的是其他端口号(不是 HTTP 的 80 端口),则需要根据具体情况打开对应的端口。例如,要打开 8080 端口:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
执行命令时出现了异常 :
3.1 FirewallD is not running 原因与解决方法
原因是:防火墙没有启动
3.1.1 启动FirewallD服务命令:
systemctl start firewalld.service #开启服务
systemctl enable firewalld.service #设置开机启动
3.1.2 查看FirewallD防火墙状态:
systemctl status firewalld
3.1.3 重新执行上面的打开端口号的命令
3.2 FirewallD 常用的命令:
firewall-cmd --state ##查看防火墙状态,是否是running
systemctl status firewalld.service ##查看防火墙状态
systemctl start firewalld.service ##启动防火墙
systemctl stop firewalld.service ##临时关闭防火墙
systemctl enable firewalld.service ##设置开机启动防火墙
systemctl disable firewalld.service ##设置禁止开机启动防火墙
firewall-cmd --permanent --query-port=80/tcp ##查看80端口有没开放
firewall-cmd --reload ##重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --get-zones ##列出支持的zone
firewall-cmd --get-services ##列出预定义的服务
firewall-cmd --query-service ftp ##查看ftp服务是否放行,返回yes或者no
firewall-cmd --add-service=ftp ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent ##永久添加80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent ##移除80端口
iptables -L -n ##查看规则,这个命令是和iptables的相同的
man firewall-cmd ##查看帮助
参数含义:
--zone #作用域
--permanent #永久生效,没有此参数重启后失效
4. 设置域名解析
5. 阿里云ESC 服务器需要设置 安全组规则 才能访问
四、配置 https
1. 下载证书
2. 上传文件
将下载好的证书上传到nginx安装目录的conf下:
# 我的是这个目录
cd /etc/nginx/
# 创建一个文件来放证书
mkdir xxx
上传文件:
scp -P 22 xxx.lylyl.cn.key root@11.101.1.24:/etc/nginx/xxx/
scp -P 22 xxx.lylyl.cn.pem root@11.101.1.24:/etc/nginx/xxx/
你也可以把压缩包上传,然后解压。
我这里为了方便,就单个上传了。
3. 配置 nginx.conf
# 进入到目录
cd /etc/nginx/
# 进入 nginx.conf 编辑
vim nginx.conf
按 i 进入编辑,修改为如下内容,根据自己的配置,自行修改:
server {
listen 80;
server_name xxx.lylyl.cn;
return 301 https://xxx.lylyl.cn;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxx.lylyl.cn;
ssl_certificate xxx/xxx.lylyl.cn.pem;
ssl_certificate_key xxx/xxx.lylyl.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
保存 Nginx 配置文件,重启 Nginx 服务。您可以使用以下命令来重启 Nginx:
sudo systemctl restart nginx
4. 配置后台安全组
- 感谢你赐予我前进的力量