使用 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. 配置后台安全组