Linux中部署微服务项目教程
作者:Dong雨
部署项目步骤
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出错:
- 错误信息显示无法解析主机
mirrorlist.centos.org
,这通常是因为 CentOS 7 的官方仓库已经停止维护,导致无法访问。
解决方法
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
- 清理并重建 Yum 缓存:
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
-d
:以后台的方式运行。--name mysql
:指定容器的名称为 mysql。-e MYSQL_ROOT_HOST='%'
:允许 root 用户在任何主机访问。-p 3306:3306
:将容器的 3306 端口挂载到宿主机的 3306 端口上。-e MYSQL_ROOT_PASSWORD=root
:指定 root 的密码为 root。
通过 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
docker run
: 创建并启动一个新的容器。-p 6379:6379
: 将容器的6379端口映射到宿主机的6379端口,以便外部可以访问Redis。--name redis
: 为容器指定一个名称,这里是“redis”。-d
: 后台运行容器。redis
: 使用Redis镜像。redis-server --requirepass "123456"
: 在容器中执行redis-server
命令,并设置Redis的访问密码为"123456"。
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
-d
: 后台运行容器。-p 8848:8848
: 将容器的 8848 端口映射到宿主机的 8848 端口,这是 Nacos 的默认管理界面端口。-p 9848:9848
: 将容器的 9848 端口映射到宿主机的 9848 端口,这是 Nacos 2.X 新增的端口,用于 gRPC 通信。--name nacos2
: 为容器指定名称为nacos2
。-e MODE=standalone
: 设置 Nacos 运行为单机模式。-e TIME_ZONE='Asia/Shanghai'
: 设置容器的时区为亚洲/上海。nacos/nacos-server:v2.1.2
: 使用 Nacos 2.1.2 版本的 Docker 镜像。
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]
- 在 Docker 中登录时,使用的是
root@%
用户,密码为 aaa。 - 在本地连接时,使用的是
root@localhost
用户,密码为 bbb。
统一密码:
登录 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 工具可以提高查找效率,但是有判断的选择解决方案。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。