Docker+nginx部署SpringBoot+vue前后端分離項目(保姆及入門指南)

前后分離項目部署

  • 項目回顧
  • 工具
  • 上線準備
  • 1、win
    • 1.1、前端
    • 1.2、后端
  • 2、linux環境
    • 2.1、安裝docker
    • 2.2、安裝docker compose
    • 2.3、編寫Dockerfile文件
    • 2.4、編寫docker-compose.yml文件
    • 2.5、修改application-pro.yml
    • 2.6、準備好nginx的掛載目錄和配置
    • 2.7、部署后端服務

項目回顧

書接上文,我們使用springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一個前后端分離的博客項目
csdn鏈接:https://blog.csdn.net/weixin_45683778/article/details/139002415
github地址:https://github.com/huang-hanson/vueblog

項目展示地址:http://47.116.123.21:81/blogs

這部分介紹如何部署我們的項目

工具

  • xshell 7 綠色破解版
  • Navicat 11 簡體中文

上線準備

這里我們同步演示怎么部署到win環境和linux(centos7)系統中,前端服務器采用nginx部署并使用docker統一管理前后端服務器。
所以我們會用到:

  • nginx
  • docker compose

1、win

win環境我就用本機來演示了,我們需要分別打包前后端,前后端打包都是一條命令即可,只不過我們打包之前注意需要配置好線上的環境參數等

1.1、前端

先來配置一下后端的調用路徑,因為現在部署在本地localhost,所以在axios.js中,我們配置好鏈接,因為等下后端部要也是本機,所以我這里直接這樣配置就好了,如下:

  • srclaxios.js
axios.defaults.baseURL = "http://localhost:8082"

在這里插入圖片描述

上面配置的就是前端訪問后端接口的服務。

然后前端部署還需要考慮一個問題:打包之后項目資源引用路徑,比如我們打包后鏈接是否需要帶項目名稱等。按照Vue官方的部罷說明,我們添加一個vue.config.js文件,

  • vueblog-vue/vue.config.js
module.exports = {publicPath: '/'
}

在這里插入圖片描述

當然了,pubicPath默認其實是空的,也就是publicPath:",兩個效果貌似其實是一樣的,哈哈哈,我只是提醒一下有這回事而已,嘿嘿。

設置完畢之后,我們執行打包命令:

#打包命令
npm run build

命令執行之后,我們在項目根目錄下就可以找到一個dist的目錄,這個就是打包之后的文件夾里面有個index.html,但是我們點擊直接打開是看不到任何內容的,這時候,我們需要部署到nginx中。

注:首次打包需要npm install一下
在這里插入圖片描述

在這里插入圖片描述

首先我們下載一個nginx,下載地址:http://nginx.org/en/download.html,這里我們下載nginx/Windows-1.26.0版本,下載之后解壓zip。根據我們對nginx的熟悉,靜態文件我們放在html文件夾下面,所以先把html文件夾中的index.html50x.html刪掉,然后把打包出來的dist文件夾內的所有文件都復制到nginxhtml中,如圖:

在這里插入圖片描述
在這里插入圖片描述

雙擊nginx.exe啟動nginx,然后瀏覽器輸入http://localhost,出現了我們熟悉的界面,雖然沒有博客數據,鏈接也自動跳轉到了http://localhost/blogs,

在這里插入圖片描述
我們點擊任意一個鏈接或者按鈕或者劇新界面,這時候出現了404:

在這里插入圖片描述
刷新之后nginx就找不到路由了,這是為啥,得和你們科普一下,vue項目的入口是index.html文件,nginx路由的時候都必領要先經過這個文件,所以我們得給nginx定義一下規則,讓它匹配不到資源路徑的時候,先去讀取index.html,然后再路由。所以我們配置一下nginx.conf文件。具體操作就是找到location,添加上一行代碼try_files $uri $uri/ /index.html last;如下:

  • nginx-1.26.0/conf/nginx.conf
location / {root html;try_files $uri $uri/ /index.html last;index index.html index.htm;
} 

在這里插入圖片描述

這一行代碼是什么意思呢?
try_files的語法規則:格式1:try_files file…uri,表示按指定的們file順序查找存在的文件,并使用第一個找到的文件進行請求處理,last表示匹配不到就內部直接匹配最后一個。

重啟nginx之后,鏈接再刷新都正常啦。但是沒有數據,所以我們去部署一下后端。windows環境nginx的重啟我一般都是打開任務管理器直接干掉nginx進程,然后再重新雙擊的~~

在這里插入圖片描述
重啟之后,這樣就能找到我們的資源路徑了(例如:通過logs,跳轉到登錄頁)

在這里插入圖片描述
在這里插入圖片描述

前端已經部署完畢,但是沒有數據進來,現在部署后端。

1.2、后端

后端的打包就簡單多了,應該大家都挺熟悉的,注意配置redis、mysql的鏈接密碼啥的,然后執行命令,本機測試,redis和mysql我都已經提前安裝好的了,sql文件也在vueblog-java的resources日錄下

對了,pom.xml文件里面,spring-boot-maven-plugin之前注釋掉了,現在一定要打開。不然執行jar會找不到主類。

  • pom.xml
    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

在這里插入圖片描述

執行打包命令:

#跳過測試打包
mvn clean package -Dmaven.test.skip=true

得到target下的vueblog-0.0.1-SNAPSHOT.jar,然后再執行命令

或者直接通過maven工具

在idea右側直接運行clean–>test–>package,左邊會出現target文件和jar包
在這里插入圖片描述

java jar vueblog-0.0.1-SNAPSHOT.jar --spring.profiles.active=default

后端上線之后,我們再訪問下前端,發現已經可以正常瀏覽網頁啦!spring.profiles.active表示指定環境配置文件。

在這里插入圖片描述
在這里插入圖片描述
圖中后端啟動完成,端口為8082,刷新前端頁面

在這里插入圖片描述

到此,win部署完成。

2、linux環境

linux環境部署相對復雜一點,因為我們還要部署redis、mysql等。我們使用docker compose來編排我們的服務,一起性搞定部罷。
二話不說,我們先來安裝一下docker和docker compose,對于docker知識還不是特別懂的同學,建議自行去補習補習哈。

2.1、安裝docker

#安裝
yum install docker#檢驗安裝是否成功
[rootalocalhost opt]# docker--version
Docker version 26.0.0, build 2ae903e#啟動
systemctl start docker

2.2、安裝docker compose

可以參考:https://docs.docker.com/compose/install/

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose或者sudo wget "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64" -O /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose#檢查是否安裝成功
docker-compose --version

在這里插入圖片描述

2.3、編寫Dockerfile文件

因為我們的項目需要成為docker的鏡像,所以我們必須先編寫Dockerfile文件構建我們的項目鏡像然后進行編排,Dockerfile文件可以幫我們進行構建。

在這里插入圖片描述

  • Dockerfile
FROM openjdk:8EXPOSE 8080ADD vueblog-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"]

2.4、編寫docker-compose.yml文件

我們需要用到的軟件與服務分別有nginx、mysq、redis、還有我們的springboot項目,所以編寫如下:

  • docker-compose.yml
version: '3'services:nginx: # 服務名稱image: nginx:latest # 最新版本的nginxports:#- 80:80 # 把docker容器的80端口映射到宿主機的80端口- 81:81volumes:- /root/nginx/html:/usr/share/nginx/html  # 將docker中額html文件夾映射到宿主機的/root/nginx/html目錄下- /root/nginx/nginx.conf:/etc/nginx/nginx.conf  # 將docker中額nginx.conf配置文件映射到宿主機的/root/nginx/nginx.conf目錄下privileged: true # 這個必須要加,解決nginx的文件調用權限問題mysql:image: mysql:5.7.27ports:#- 3306:3306- 8081:3306environment:- MYSQL_ROOT_PASSWORD=adminredis:image: redis:latestcommand: redis-server /etc/redis/redis.confvolumes:- ./redis/data:/data- /root/redis/redis.conf:/etc/redis/redis.conf  # 將docker中額nginx.conf配置文件映射到宿主機的/root/nginx/nginx.conf目錄下ports:- 6379:6379vueblog:image: vueblog:latestbuild: .   # 這個不能從docker hub中去拉取,需要自己構建,會去尋找同級下的Dockerfile文件(文件中的jar包)進行構建ports:- 8082:8082depends_on:- mysql- redis

上面注釋寫的很明白

2.5、修改application-pro.yml

然后我們再回頭看看applicaiion-pro.yml文件,mysql和redls的鏈接之前還是localhost,現在我們需要修改成容器之間的調用,如何知道mysql和redis的鏈接地址呢?docker compose就幫我們解決了這個問題,我們可以使用鏡像容器的服務名稱來表示鏈接。比如docker-compose.yml中mysql的服務名稱就叫mysql、redis就叫redis。

# DataSource Config
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://mysql:8081/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghaiusername: rootpassword: admin
shiro-redis:enabled: trueredis-manager:host: redis:6379

2.6、準備好nginx的掛載目錄和配置

docker-compose.yml中已經提到

  • 宿主機的掛載目錄:/root/nginx/htmI
  • 掛載配置:/root/nginx/nginx.conf

所以我們在root目錄下新建nginx目錄,并進入nginx目錄下新建html目錄和一個nginx.conf配置文件。

在這里插入圖片描述
axios.js文件中url需要改成你的linux機器ip

在這里插入圖片描述
重新前端代碼打包,壓縮后托到html文件夾下面

在這里插入圖片描述

將dist文件下面的文件全部轉移到html下

在這里插入圖片描述

編寫nginx.config配置文件,其中可以參考win下的配置文件

將location 的html地址改成掛載的目錄

# user root;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {# listen       80;listen       81;server_name  localhost;location / {root   /usr/share/nginx/html;try_files $uri $uri/ /index.html last;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

在這里插入圖片描述

2.7、部署后端服務

一切準備就緒之后,我們就開始編排部署了哈。

首先本地打包vueblog項目,vueblog-0.0.1-SNAPSHOT.jar,并上傳到linux中,同時docker-compose.ymlDockerfile也上傳到同一目錄下。如圖所示:

在這里插入圖片描述

然后我們執行一下編排命令:

#開始編排
cd
docker-compose up -d

其中-d表示后臺服務形式啟動

然后我們稍等片刻,特別是開始Building vueblog的時候可能時間有點長,耐心等待即可!最后提示如下·

在這里插入圖片描述

訪問連接:http://47.116.123.21:81/blogs(你自己的ip+port)我這里為了避免沖突,我將80改成了81端口
在這里插入圖片描述
發現沒有數據,需要導入sql表

DROP TABLE IF EXISTS `m_blog`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_blog` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`title` varchar(255) NOT NULL,`description` varchar(255) NOT NULL,`content` longtext,`created` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,`status` tinyint(4) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;DROP TABLE IF EXISTS `m_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(64) DEFAULT NULL,`avatar` varchar(255) DEFAULT NULL,`email` varchar(64) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`status` int(5) NOT NULL,`created` datetime DEFAULT NULL,`last_login` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `UK_USERNAME` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;INSERT INTO `vueblog`.`m_user` (`id`, `username`, `avatar`, `email`, `password`, `status`, `created`, `last_login`) VALUES ('1', 'hanson', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', NULL, '96e79218965eb72c92a549dd5a330112', '0', '2020-04-20 10:44:01', NULL);

在這里插入圖片描述
再次刷新項目就部署成功了;

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14372.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據挖掘實戰-基于內容協同過濾算法的電影推薦系統

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

【從C++到Java一周速成】章節9:構造器

章節9&#xff1a;構造器 對于一個類來說&#xff0c;一般有三種常見的成員&#xff1a;屬性、方法、構造器。 這三種成員都可以定義零個或多個。 構造方法也叫構造器&#xff0c;是一個創建對象時被自動調用的特殊方法&#xff0c;用于對象的初始化。 Java通過new關鍵字來調用…

OpenHarmony集成OCR三方庫實現文字提取

1. 簡介 Tesseract(Apache 2.0 License)是一個可以進行圖像OCR識別的C庫&#xff0c;可以跨平臺運行 。本樣例基于Tesseract庫進行適配&#xff0c;使其可以運行在OpenAtom OpenHarmony&#xff08;以下簡稱“OpenHarmony”&#xff09;上&#xff0c;并新增N-API接口供上層應…

.Net Core學習筆記 框架特性(注入、配置)

注&#xff1a;直接學習的.Net Core 6&#xff0c;此版本有沒有startup.cs相關的內容 項目Program.cs文件中 是定義項目加載 啟動的地方 //通過builder對項目進行配置、服務的加載 var builder WebApplication.CreateBuilder(args); builder.Services.AddControllers();//將…

Ubuntu服務器運行Subspace節點和Farm

提供Subspace 節點部署&性能優化&機房托管&運維監控等服務。myto88 磁盤格式化 將插入的磁盤格式化。 sudo mkfs.ext4 -m 0 -T largefile4 /dev/sd*磁盤掛載 此處為語雀內容卡片&#xff0c;點擊鏈接查看&#xff1a;https://www.yuque.com/u25096009/lvoxa…

企商在線榮登甲子光年“2024中國AI算力層創新企業”榜單

5月15日&#xff0c;「AI創生時代——2024甲子引力X科技產業新風向」大會在北京順利舉辦&#xff0c;大會發布2024【星辰100】創新企業榜。企商在線憑借全棧式一體化AI算力能力&#xff0c;與超聚變、寒武紀等企業共同入選“2024中國AI算力層創新企業”榜單。 本次大會由中國科…

AJAX(JQuery版本)

目錄 前言 一.load方法 1.1load()簡介 1.2load()方法示例 1.3load()方法回調函數的參數 二.$.get()方法 2.1$.get()方法介紹 2.2詳細說明 2.3一些例子 2.3.1請求test.php網頁并傳送兩個參數 2.3.2顯示test返回值 三.$.post()方法 3.1$.post()方法介紹 3.2詳細說明 …

什么是云計算安全?如何保障云計算安全

云計算徹底改變了數據存儲的世界&#xff0c;它使企業可以遠程存儲數據并隨時隨地從任何位置訪問數據。存和取變得簡單&#xff0c;也使得云上數據極易造成泄露或者被篡改&#xff0c;所以云計算安全就顯得非常重要了。那么什么是云計算安全&#xff1f; 其實&#xff0c;云計…

WPS PPT學習筆記 1 排版4原則等基本技巧整理

排版原則 PPT的排版需要滿足4原則&#xff1a;密性、對齊、重復和對比4個基本原則。 親密性 彼此相關的元素應該靠近&#xff0c;成為一個視覺單位&#xff0c;減少混亂&#xff0c;形成清晰的結構。 兩端對齊&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左邊&#x…

是誰的項目還在爛大街?一個基于 SpringBoot 的高性能短鏈系統

看了幾百份簡歷&#xff0c;真的超過 90% 的小伙伴的項目是商城、RPC、秒殺、論壇、外賣、點評等等爛大街的項目&#xff0c;人人都知道這些項目爛大街了&#xff0c;但大部分同學還是得硬著頭皮做&#xff0c;沒辦法&#xff0c;網絡上能找到的、教程比較完善的就這些項目了&a…

基于機器學習預測未來的二氧化碳排放量(隨機森林和XGBoost)

基于機器學習預測未來的二氧化碳排放量&#xff08;隨機森林和XGBoost&#xff09; 簡介&#xff1a; CO2排放是當今全球關注的環境問題之一。本文將使用Python對OWID提供的CO2排放數據集進行分析&#xff0c;并嘗試構建機器學習模型來預測未來的CO2排放趨勢。我們將探索數據…

kafka Kerberos集群環境部署驗證

背景 公司需要對kafka環境進行安全驗證,目前考慮到的方案有Kerberos和SSL和SASL_SSL,最終考慮到安全和功能的豐富度,我們最終選擇了SASL_SSL方案。處于知識積累的角度,記錄一下kafka keberos安裝部署的步驟。 機器規劃 目前測試環境公搭建了三臺kafka主機服務,現在將詳細…

ViLT學習

多模態里程碑式的文章&#xff0c;總結了四種多模態方法&#xff0c;根據文字和圖像特征特征抽取方式不通。 文章的貢獻主要是速度提高了&#xff0c;使用了數據增強&#xff0c;文本的mask 學習自b站朱老師的論文講解

電賽控制類PID算法實現

一、什么是PID PID&#xff08;Proportional-Integral-Derivative&#xff09;是一種經典的控制算法&#xff0c;廣泛應用在自動化控制系統中。它是通過對被控對象的測量值和設定值進行比較&#xff0c;并根據誤差的大小來調整輸出信號&#xff0c;實現對被控對象的穩定控制。 …

【C++】map和set的封裝

目錄 前言一、紅黑樹的設計1.1 紅黑樹存儲節點的設計1.2 紅黑樹的迭代器1.3 map的設計1.4 set的設計1.5關于map與set的const_iterator設計 前言 我們知道map和set的底層都是用紅黑樹實現的&#xff0c;但是set和map的結構不一樣&#xff0c;set只有一個參數K&#xff0c;而map…

前端基礎:1-2 面向對象 + Promise

面向對象 對象是什么&#xff1f;為什么要面向對象&#xff1f; 通過代碼抽象&#xff0c;進而藐視某個種類物體的方式 特點&#xff1a;邏輯上遷移更加靈活、代碼復用性更高、高度的模塊化 對象的理解 對象是對于單個物體的簡單抽象對象是容器&#xff0c;封裝了屬性 &am…

如何安裝 Docker

引言 - 介紹 Docker 技術的重要性和應用場景 - 簡要解釋 Docker 的工作原理和優勢 Docker 的安裝 Docker 在不同平臺上的安裝方法&#xff08;Windows、Mac、Linux&#xff09; Docker 是一個開源的容器化平臺&#xff0c;可以幫助開發人員和運維團隊更輕松地打包、交付和運行…

python 裝飾器 帶參數和不帶參數

裝飾器是Python語言中一種特殊的語法&#xff0c;用于在不修改原函數代碼的情況下&#xff0c;為函數添加額外的功能或修改函數的行為。通過裝飾器&#xff0c;我們可以在函數執行前后執行一些額外的代碼&#xff0c;或者修改函數的參數。 要使用裝飾器引入函數和參數&#xf…

Linux_應用篇(07) 系統信息與系統資源

在應用程序當中&#xff0c;有時往往需要去獲取到一些系統相關的信息&#xff0c;譬如時間、日期、以及其它一些系統相關信息&#xff0c;本章將向大家介紹如何通過 Linux 系統調用或 C 庫函數獲取系統信息&#xff0c; 譬如獲取系統時間、日期以及設置系統時間、日期等&#x…