Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux中部署微服务项目

Linux中部署微服务项目教程

作者:Dong雨

文章详细介绍了部署项目的全流程,包括JDK安装、Nginx配置、项目打包上传、前端部署、Docker环境搭建、MySQL/Redis/Nacos安装及启动,以及常见错误排查方法,如检查MIME类型、密码一致性、日志分析等,提供系统部署与问题解决思路

部署项目步骤

1.下载JDK17

进入 /usr/local 目录,创建 java 文件夹。并将 JDK17 上传到 java 目录下。

上传成功后,通过cd命令进入Java文件夹目录,解压 JDK17 压缩包,命令

unzip zulu17.44.53-ca-jdk17.0.8.1-linux_x64.zip。

如果报错说 unzip 命令不存在,安装该命令:yum install -y unzip zip

解压后的目录:

为了简单,就不配置环境变量了,直接拿实际引用执行 Java 相关命令。

另外执行一条命令,修改文件名,让它看着没那么长:

mv zulu17.44.53-ca-jdk17.0.8.1-linux_x64 jdk17.0.8.1

2. Nginx 软件

1.更新系统软件包列表。

sudo yum update

2.安装 Nginx 命令。

sudo yum install nginx

安装Nginx出错:

解决方法

1. 更换 Yum 源

由于 CentOS 7 的官方仓库已经停止维护,需要更换为可用的镜像源。以下是具体步骤:

  cd /etc/yum.repos.d
  cp CentOS-Base.repo CentOS-Base.repo.backup
  vi CentOS-Base.repo

将 mirrorlist 注释掉,并添加 baseurl 指向国内镜像源,例如阿里云镜像源:

  [base]
  name=CentOS-$releasever - Base
  #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
  baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

  [updates]
  name=CentOS-$releasever - Updates
  #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
  baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

  [extras]
  name=CentOS-$releasever - Extras
  #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
  baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
  gpgcheck=1
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  :wq
  sudo yum clean all
  sudo yum makecache
2. 安装 EPEL 源

Nginx 不在 CentOS 的默认仓库中,需要安装 EPEL(Extra Packages for Enterprise Linux)源:

sudo yum install epel-release
3.安装 Nginx

安装 EPEL 源后,可以安装 Nginx:

sudo yum install nginx
4.Nginx 开机自启。
sudo systemctl start nginx
sudo systemctl enable nginx

3.项目打包上传

通过命令创建项目相关文件夹。

mkdir -p /home/shortlink/logs

Maven 执行 clean install 逻辑,将 SpringBoot 可执行 Jar 生成。shortlink-all 下执行 mvn clean install,可以通过命令行或者工具栏。

 将 项目jar包上传到服务器 /home/shortlink 目录下。

4.前端上传

进入到前端项目目录下,执行 npm run build 命令。如果是 Windows 系统用户,记得去 CMD 命令行里执行。出现dist目录即代表成功。

将该 dist 目录上传到云服务器 /home/shortlink 目录下。上传前记得压缩下 dist 目录,上传方便些,上传成功后再解压。

执行解压缩命令:unzip dist.zip 完成压缩包解压。

5.安装中间件环境

以 Docker 形式指导如何安装所依赖的中间件。

1.安装 yum-utils

以 yum 安装为例子进行安装,安装 yum-utils,使用 yum-config-manager 工具设置 yum 源,后面两个是 devicemapper 驱动依赖

yum install -y yum-utils device-mapper-persistent-data lvm2
2.使用阿里源访问
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

出现以下内容则表示成功。

3.安装docker
yum install docker-ce #(这样写默认安装最新版本)
yum install  docker-ce-<VERSION_STRING> (指定安装版本) 
例: yum install docker-ce-18.03.1.ce

安装成功提示信息如下:

4.启动并加入开机启动
systemctl start docker     启动  
systemctl restart docker   重启
systemctl enable docker    开机启动

执行 docker version 查看 Docker 版本号。

5.验证是否安装成功

执行命令:docker run hello-world 测试是否安装成功。

 若进行到这一步没有问题的话就说明 Docker 已经安装成功了 。

5.配置可用镜像

注意,现在 Docker 拉取镜像被限制了,我们需要额外执行以下逻辑:

(这个问题通常是由于网络连接问题导致的,特别是在国内网络环境下,访问国外的 Docker Hub 仓库可能会遇到速度慢或连接超时的情况。)

第一种:

# 创建目录
sudo mkdir -p /etc/docker

# 写入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
    	"https://docker.unsee.tech",
        "https://dockerpull.org",
        "https://docker.1panel.live",
        "https://dockerhub.icu"
    ]
}
EOF

# 重启docker服务
sudo systemctl daemon-reload && sudo systemctl restart docker

第二种:

    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
6. 安装 MySQL
docker run --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_HOST='%' \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36

通过 MySQL 客户端工具连接并导入数据库和数据。

7.安装 Redis
docker run \
-d -p 8848:8848 \
-p 9848:9848 \
--name nacos2 \
-e MODE=standalone \
-e TIME_ZONE='Asia/Shanghai' \
nacos/nacos-server:v2.1.2

8.安装 Nacos
docker run \
-d -p 8848:8848 \
-p 9848:9848 \
--name nacos2 \
-e MODE=standalone \
-e TIME_ZONE='Asia/Shanghai' \
nacos/nacos-server:v2.1.2

6.启动项目

1. 启动后端项目

进入 /home/shortlink 文件夹下,开始启动后端项目。

nohup /usr/local/java/jdk17.0.8.1/bin/java \
-Xms2048m -Xmx2048m \
-Dshort-link.domain.default=修改为服务器外网IP:8003 \
-jar /home/shortlink/shortlink-aggregation.jar > logs/shortlink-aggregation.file 2>&1 &

执行 tail -f logs/shortlink-aggregation.file 命令查看日志是否启动成功。

依次启动网关项目。

nohup /usr/local/java/jdk17.0.8.1/bin/java \
-Xms1024m -Xmx1024m \
-jar /home/shortlink/shortlink-gateway.jar > logs/shortlink-gateway.file 2>&1 &

 执行 tail -f logs/shortlink-aggregation.file 命令查看日志是否启动成功。

2.Nginx 挂载前端项目

修改 Nginx 的配置,让前端可以访问。

sudo vim /etc/nginx/nginx.conf

 将默认 Nginx http/server配置改为下述配置:

http {
    # 只要保证 server 里的配置在 nginx 的 http 配置下就好
		server {
        listen       80;
        server_name  localhost;

         location / {
            root   /home/shortlink/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location /api {
            proxy_read_timeout 10s;
            proxy_pass http://127.0.0.1:8000/api;
        }
    }
}

保存退出文件编辑状态,重载 Nginx 的配置。

sudo systemctl reload nginx

7.错误总结

小伙伴们可以看看自己哪里错误了,可以借鉴一下,不一定非要一致,主要提供一个思路。

1.前端页面格式错乱

The stylesheet http://localhost/assets/index-1aa0ed73.css was not loaded because its MIME type, “application/octet-stream”, is not “text/css”.

MIME类型不匹配:服务器返回的MIME类型为application/octet-stream,而浏览器期望的是text/css

解决:

nginx配置文件

cd /etc/nginx
include /etc/nginx/mime.types ;
default_type application/octet-stream;
types {
           text/css css;
       }
sudo systemctl reload nginx

2.检查软件与项目的密码

先查看项目配置文件的各种密码(redis,mysql等)是否和虚拟机上安装软件时的密码一致。

3.Redisson错误

后端启动仅显示此错误信息:

Caused by: org.redisson.RedissonShutdownException: Redisson is shutdown
        at org.redisson.command.RedisExecutor.execute(RedisExecutor.java:129) ~[redisson-3.27.2.jar!/:3.27.2]
        at org.redisson.command.CommandAsyncService.async(CommandAsyncService.java:622) ~[redisson-3.27.2.jar!/:3.27.2]
        at org.redisson.command.CommandAsyncService.writeAsync(CommandAsyncService.java:583) ~[redisson-3.27.2.jar!/:3.27.2]
        at org.redisson.spring.data.connection.RedissonConnection.write(RedissonConnection.java:738) ~[redisson-spring-data-32-3.27.2.jar!/:3.27.2]
        ... 12 common frames omitted

首先检查redis是否连接成功,查看redis容器状态,服务状态,版本号,日志。如果不一致,更改。

# 查看Redis容器状态
docker ps -a | grep redis

# 查看Redis版本号(注意自己redis容器的名称)
docker exec redis redis-server -v

# 查看Redis日志
docker logs redis

# 检查Redis服务状态
docker exec -it redis redis-cli PING

# 实时查看日志
docker logs -f redis

本人情况,这些完全正确。排除redis的错误。继续排查。

4.nacos错误

找不到原因,所以只能慢慢排查,突然发现浏览器输入http://xxx:8848/nacos,登录失败,由于通过 docker ps 命令查看 nacos 状态一直正常就没注意。通过查看 nacos 的日志发现确实出现了问题。错误原因是什么数据库发生了错误,改了 nacos 配置中数据库的用户和密码没用,不管了,直接删除,重新下载 nacos 。恢复正常。

   at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:376)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:465)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:475)
        at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:508)
        at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:515)
        at com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl.findConfigMaxId(ExternalStoragePersistServiceImpl.java:674)
        at com.alibaba.nacos.config.server.service.dump.processor.DumpAllProcessor.process(DumpAllProcessor.java:51)
        at com.alibaba.nacos.config.server.service.dump.DumpService.dumpConfigInfo(DumpService.java:282)
        at com.alibaba.nacos.config.server.service.dump.DumpService.dumpOperate(DumpService.java:195)
        ... 62 common frames omitted

5. 数据库连接错误

Caused by: java.sql.SQLException: Access denied for user 'root'@'1.7.0.1' (using password: YES)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.0.33.jar!/:8.0.33]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.33.jar!/:8.0.33]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-j-8.0.33.jar!/:8.0.33]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:446) ~[mysql-connector-j-8.0.33.jar!/:8.0.33]

统一密码:

登录 MySQL:

mysql -u root -pLiu.2004310

修改 root@localhost 的密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'aaa';
FLUSH PRIVILEGES;

修改 root@% 的密码:

ALTER USER 'root'@'%' IDENTIFIED BY 'aaa';
FLUSH PRIVILEGES;

总结

当前的错误可能是其他错误引起的,首先检查错误信息有关的配置,如果实在找不到考虑其他错误引起的。

学会查看错误日志返回的信息,而不是简单的通过状态来判断运行情况。

如果实在是什么都找不到问题,就按照步骤一个一个去查看软件的运行情况。

使用 AI 工具可以提高查找效率,但是有判断的选择解决方案。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文