最近做了一個springboot+vue的前后端分離項目,把它部署到Linux虛擬機上。下面是我的步驟和遇到的問題,需要的朋友可以看下(看的時候注意要全部看完到底部,因為我習慣是把我遇到的問題放到最后面的,不是到了哪一步遇到了問題就順便講下)。
1.打包前后端項目
后端我使用的是idea編輯器,所以打包只要點擊下圖就可以了。
就生成了下面這個jar包
好,后端打包完成,接下來打包前端項目。
我前端使用的編輯器是webstorm。打包方式也很簡單,只要在終端中執行:npm run build命令即可,如下圖
之后便會生成一個 dist 文件夾,如下圖
2.將文件放到虛擬機上
在Linux的目錄下 mkdir 建一個放這兩個打包文件的文件夾(我的是marble),之后用rz命令,或者 filezilla 等上傳工具,找到你本地的那個后端jar和前端dist,上傳到marble
如下圖:
3.我這里使用nginx進行代理,把前端部署到nginx上。那你需要在你的Linux上安裝一個nginx,nginx的安裝我就不再贅述,沒有安裝朋友的可以參考這個:
https://www.cnblogs.com/qwg-/p/13054715.html
安裝完成之后,別着急,需要重新配置一下nginx的配置文件。
說明:這里要講下,前端是通過nginx代理的,后端啟動jar包,前端的請求使用nginx代理發送到后端.
找到你的nginx的安裝目錄下的 conf/nginx.conf文件(默認的位置是:/usr/local/nginx/conf 下的nginx.conf),配置成以下即可。
稍微解釋一下:
upstream javaboy.org{
server 127.0.0.1:8088;
}
這個javaboy.org只是個名字,你隨便怎么起都可以,同理,下面的proxy_pass http://javaboy.org用的就是上面的這個,也就是說,我們使用nginx的默認的80端口,訪問這個接口的時候,nginx就會給把請求代理到后端的那個8088接口上。這個8088是后端項目的端口
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|html) {
#所有靜態文件直接讀取硬盤
root /marble/dist/;
expires 30d; #緩存30天
}
這個就是說,以 js|css|ico|png|jpg|eot|svg|ttf|woff|html 這種結尾的頁面,就不用請求后端,直接前端展示。
那下面的root /marble/dist/,就是我上面說的我的前端打包成的 dist 在Linux的位置,這個要改成你自己的前端打包文件 dist 在Linux的路徑。
配置完成以后記得要重新啟動nginx,配置文件才會生效。
4.啟動后端的jar包
這里先進入到你的jar包所在位置(我的是marble文件夾),執行命令:nohup java -jar xxx.jar &
這個命令如果不太了解的可以看下這個:https://www.cnblogs.com/qingmuchuanqi48/p/11723541.html
執行這個命令以后會有個下一行:
nohup: 忽略輸入並把輸出追加到"nohup.out,這個意思是說你的啟動項目日志在你的jar包同級目錄nohup.out文件內(執行上面的啟動命令,它會自動給你創建一個nohup.out文件),你可以通過vi nohup.out 看到你的日志。
jar包啟動完成,nginx啟動完成,就可以在你window的瀏覽器上輸入:
這里說明一下,前端的IP是你的Linux的IP ,為什么不寫端口,因為我們使用的是nginx默認的80端口,后面的index.html頁面是因為vue項目是一個單頁面應用,也就是下圖的:
等項目出現頁面,成功請求到后端的數據,就說明部署成功!
下面說下我遇到的問題
問題1:
我用的數據庫不是我Linux上的數據庫,而是我window本地mysql數據庫,然后我把后端springboot的配置url 的地址換成window的IP地址
,發現報一個沒有訪問權限的錯誤,錯誤的截圖我忘記寫了,但是解決方案我記得,在數據庫執行以下SQL:
GRANT ALL `user`PRIVILEGES ON *.* TO 'root'@'%'
IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES
說明一下: user是你的用戶登錄的那張表的表名,后面的123456是你的root用戶的密碼。
問題2
假如一直登錄不成功,可以嘗試關閉一下你的window防火牆和Linux的防火牆,因為比如我的mysql在window,而我window瀏覽器需要訪問Linux,那么這兩者的防火牆可能
會阻擋住互相的訪問。