Linux中部署微服務(wù)項(xiàng)目教程
部署項(xiàng)目步驟
1.下載JDK17
進(jìn)入 /usr/local 目錄,創(chuàng)建 java 文件夾。并將 JDK17 上傳到 java 目錄下。
上傳成功后,通過(guò)cd命令進(jìn)入Java文件夾目錄,解壓 JDK17 壓縮包,命令
unzip zulu17.44.53-ca-jdk17.0.8.1-linux_x64.zip。
如果報(bào)錯(cuò)說(shuō) unzip 命令不存在,安裝該命令:yum install -y unzip zip。
解壓后的目錄:

為了簡(jiǎn)單,就不配置環(huán)境變量了,直接拿實(shí)際引用執(zhí)行 Java 相關(guān)命令。
另外執(zhí)行一條命令,修改文件名,讓它看著沒(méi)那么長(zhǎng):
mv zulu17.44.53-ca-jdk17.0.8.1-linux_x64 jdk17.0.8.1
2. Nginx 軟件
1.更新系統(tǒng)軟件包列表。
sudo yum update
2.安裝 Nginx 命令。
sudo yum install nginx
安裝Nginx出錯(cuò):

- 錯(cuò)誤信息顯示無(wú)法解析主機(jī)
mirrorlist.centos.org,這通常是因?yàn)?CentOS 7 的官方倉(cāng)庫(kù)已經(jīng)停止維護(hù),導(dǎo)致無(wú)法訪問(wèn)。
解決方法
1. 更換 Yum 源
由于 CentOS 7 的官方倉(cāng)庫(kù)已經(jīng)停止維護(hù),需要更換為可用的鏡像源。以下是具體步驟:
- 備份原有配置文件:
cd /etc/yum.repos.d cp CentOS-Base.repo CentOS-Base.repo.backup
- 編輯配置文件:
vi CentOS-Base.repo
- 修改內(nèi)容:
將 mirrorlist 注釋掉,并添加 baseurl 指向國(guó)內(nèi)鏡像源,例如阿里云鏡像源:
[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 的默認(rèn)倉(cāng)庫(kù)中,需要安裝 EPEL(Extra Packages for Enterprise Linux)源:
sudo yum install epel-release
3.安裝 Nginx
安裝 EPEL 源后,可以安裝 Nginx:
sudo yum install nginx
4.Nginx 開機(jī)自啟。
sudo systemctl start nginx sudo systemctl enable nginx
3.項(xiàng)目打包上傳
通過(guò)命令創(chuàng)建項(xiàng)目相關(guān)文件夾。
mkdir -p /home/shortlink/logs
Maven 執(zhí)行 clean install 邏輯,將 SpringBoot 可執(zhí)行 Jar 生成。shortlink-all 下執(zhí)行 mvn clean install,可以通過(guò)命令行或者工具欄。

將 項(xiàng)目jar包上傳到服務(wù)器 /home/shortlink 目錄下。
4.前端上傳
進(jìn)入到前端項(xiàng)目目錄下,執(zhí)行 npm run build 命令。如果是 Windows 系統(tǒng)用戶,記得去 CMD 命令行里執(zhí)行。出現(xiàn)dist目錄即代表成功。
將該 dist 目錄上傳到云服務(wù)器 /home/shortlink 目錄下。上傳前記得壓縮下 dist 目錄,上傳方便些,上傳成功后再解壓。
執(zhí)行解壓縮命令:unzip dist.zip 完成壓縮包解壓。
5.安裝中間件環(huán)境
以 Docker 形式指導(dǎo)如何安裝所依賴的中間件。
1.安裝 yum-utils
以 yum 安裝為例子進(jìn)行安裝,安裝 yum-utils,使用 yum-config-manager 工具設(shè)置 yum 源,后面兩個(gè)是 devicemapper 驅(qū)動(dòng)依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
2.使用阿里源訪問(wèn)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
出現(xiàn)以下內(nèi)容則表示成功。

3.安裝docker
yum install docker-ce #(這樣寫默認(rèn)安裝最新版本) yum install docker-ce-<VERSION_STRING> (指定安裝版本) 例: yum install docker-ce-18.03.1.ce
安裝成功提示信息如下:

4.啟動(dòng)并加入開機(jī)啟動(dòng)
systemctl start docker 啟動(dòng) systemctl restart docker 重啟 systemctl enable docker 開機(jī)啟動(dòng)
執(zhí)行 docker version 查看 Docker 版本號(hào)。
5.驗(yàn)證是否安裝成功
執(zhí)行命令:docker run hello-world 測(cè)試是否安裝成功。

若進(jìn)行到這一步?jīng)]有問(wèn)題的話就說(shuō)明 Docker 已經(jīng)安裝成功了 。
5.配置可用鏡像
注意,現(xiàn)在 Docker 拉取鏡像被限制了,我們需要額外執(zhí)行以下邏輯:

(這個(gè)問(wèn)題通常是由于網(wǎng)絡(luò)連接問(wèn)題導(dǎo)致的,特別是在國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下,訪問(wèn)國(guó)外的 Docker Hub 倉(cāng)庫(kù)可能會(huì)遇到速度慢或連接超時(shí)的情況。)
第一種:
# 創(chuàng)建目錄
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服務(wù)
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:以后臺(tái)的方式運(yùn)行。--name mysql:指定容器的名稱為 mysql。-e MYSQL_ROOT_HOST='%':允許 root 用戶在任何主機(jī)訪問(wèn)。-p 3306:3306:將容器的 3306 端口掛載到宿主機(jī)的 3306 端口上。-e MYSQL_ROOT_PASSWORD=root:指定 root 的密碼為 root。

通過(guò) MySQL 客戶端工具連接并導(dǎo)入數(shù)據(jù)庫(kù)和數(shù)據(jù)。
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: 創(chuàng)建并啟動(dòng)一個(gè)新的容器。-p 6379:6379: 將容器的6379端口映射到宿主機(jī)的6379端口,以便外部可以訪問(wèn)Redis。--name redis: 為容器指定一個(gè)名稱,這里是“redis”。-d: 后臺(tái)運(yùn)行容器。redis: 使用Redis鏡像。redis-server --requirepass "123456": 在容器中執(zhí)行redis-server命令,并設(shè)置Redis的訪問(wèn)密碼為"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: 后臺(tái)運(yùn)行容器。-p 8848:8848: 將容器的 8848 端口映射到宿主機(jī)的 8848 端口,這是 Nacos 的默認(rèn)管理界面端口。-p 9848:9848: 將容器的 9848 端口映射到宿主機(jī)的 9848 端口,這是 Nacos 2.X 新增的端口,用于 gRPC 通信。--name nacos2: 為容器指定名稱為nacos2。-e MODE=standalone: 設(shè)置 Nacos 運(yùn)行為單機(jī)模式。-e TIME_ZONE='Asia/Shanghai': 設(shè)置容器的時(shí)區(qū)為亞洲/上海。nacos/nacos-server:v2.1.2: 使用 Nacos 2.1.2 版本的 Docker 鏡像。

6.啟動(dòng)項(xiàng)目
1. 啟動(dòng)后端項(xiàng)目
進(jìn)入 /home/shortlink 文件夾下,開始啟動(dòng)后端項(xiàng)目。
nohup /usr/local/java/jdk17.0.8.1/bin/java \ -Xms2048m -Xmx2048m \ -Dshort-link.domain.default=修改為服務(wù)器外網(wǎng)IP:8003 \ -jar /home/shortlink/shortlink-aggregation.jar > logs/shortlink-aggregation.file 2>&1 &
執(zhí)行 tail -f logs/shortlink-aggregation.file 命令查看日志是否啟動(dòng)成功。
依次啟動(dòng)網(wǎng)關(guān)項(xiàng)目。
nohup /usr/local/java/jdk17.0.8.1/bin/java \ -Xms1024m -Xmx1024m \ -jar /home/shortlink/shortlink-gateway.jar > logs/shortlink-gateway.file 2>&1 &
執(zhí)行 tail -f logs/shortlink-aggregation.file 命令查看日志是否啟動(dòng)成功。

2.Nginx 掛載前端項(xiàng)目
修改 Nginx 的配置,讓前端可以訪問(wèn)。
sudo vim /etc/nginx/nginx.conf
將默認(rèn) 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;
}
}
}保存退出文件編輯狀態(tài),重載 Nginx 的配置。
sudo systemctl reload nginx
7.錯(cuò)誤總結(jié)
小伙伴們可以看看自己哪里錯(cuò)誤了,可以借鑒一下,不一定非要一致,主要提供一個(gè)思路。
1.前端頁(yè)面格式錯(cuò)亂
The stylesheet http://localhost/assets/index-1aa0ed73.css was not loaded because its MIME type, “application/octet-stream”, is not “text/css”.
MIME類型不匹配:服務(wù)器返回的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.檢查軟件與項(xiàng)目的密碼
先查看項(xiàng)目配置文件的各種密碼(redis,mysql等)是否和虛擬機(jī)上安裝軟件時(shí)的密碼一致。
3.Redisson錯(cuò)誤
后端啟動(dòng)僅顯示此錯(cuò)誤信息:
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容器狀態(tài),服務(wù)狀態(tài),版本號(hào),日志。如果不一致,更改。
# 查看Redis容器狀態(tài) docker ps -a | grep redis # 查看Redis版本號(hào)(注意自己redis容器的名稱) docker exec redis redis-server -v # 查看Redis日志 docker logs redis # 檢查Redis服務(wù)狀態(tài) docker exec -it redis redis-cli PING # 實(shí)時(shí)查看日志 docker logs -f redis
本人情況,這些完全正確。排除redis的錯(cuò)誤。繼續(xù)排查。
4.nacos錯(cuò)誤
找不到原因,所以只能慢慢排查,突然發(fā)現(xiàn)瀏覽器輸入http://xxx:8848/nacos,登錄失敗,由于通過(guò) docker ps 命令查看 nacos 狀態(tài)一直正常就沒(méi)注意。通過(guò)查看 nacos 的日志發(fā)現(xiàn)確實(shí)出現(xiàn)了問(wèn)題。錯(cuò)誤原因是什么數(shù)據(jù)庫(kù)發(fā)生了錯(cuò)誤,改了 nacos 配置中數(shù)據(jù)庫(kù)的用戶和密碼沒(méi)用,不管了,直接刪除,重新下載 nacos ?;謴?fù)正常。
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 omitted5. 數(shù)據(jù)庫(kù)連接錯(cuò)誤
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 中登錄時(shí),使用的是
root@%用戶,密碼為 aaa。 - 在本地連接時(shí),使用的是
root@localhost用戶,密碼為 bbb。
統(tǒng)一密碼:
登錄 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;
總結(jié)
當(dāng)前的錯(cuò)誤可能是其他錯(cuò)誤引起的,首先檢查錯(cuò)誤信息有關(guān)的配置,如果實(shí)在找不到考慮其他錯(cuò)誤引起的。
學(xué)會(huì)查看錯(cuò)誤日志返回的信息,而不是簡(jiǎn)單的通過(guò)狀態(tài)來(lái)判斷運(yùn)行情況。
如果實(shí)在是什么都找不到問(wèn)題,就按照步驟一個(gè)一個(gè)去查看軟件的運(yùn)行情況。
使用 AI 工具可以提高查找效率,但是有判斷的選擇解決方案。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux下查看CPU型號(hào),內(nèi)存大小,硬盤空間的命令(詳解)
下面小編就為大家?guī)?lái)一篇Linux下查看CPU型號(hào),內(nèi)存大小,硬盤空間的命令(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
linux最快的文本搜索神器ripgrep(grep的最好代替者)
這篇文章主要介紹了linux最快的文本搜索神器ripgrep(grep的最好代替者),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
linux VPS主機(jī)上備份網(wǎng)站和數(shù)據(jù)庫(kù)的方法
現(xiàn)在看到越來(lái)越多的VPSer開始使用VPS,在使用VPS的時(shí)候一個(gè)很重要的任務(wù)就是VPS提供備份,雖然一些IDC也提供VPS的備份服務(wù),但要不就是收費(fèi),都不太適合我們這些VPSer們使用。2010-12-12
Linux下刪除亂碼文件和目錄的實(shí)現(xiàn)方式
這篇文章主要介紹了Linux下刪除亂碼文件和目錄的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Linux系統(tǒng)下如何實(shí)現(xiàn)修改主機(jī)名
這篇文章主要介紹了Linux系統(tǒng)下如何實(shí)現(xiàn)修改主機(jī)名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

