【踩坑記錄】記第一次部署專案到騰訊雲伺服器
【踩坑記錄】記第一次部署專案到騰訊雲伺服器
1.前言
任務:已知騰訊雲伺服器的ip、賬號、密碼,將快遞e棧專案部署到騰訊雲。
必備技能:用Xshell訪問Linux伺服器(熟悉各種操作的指令);用SecureFX向Linux伺服器上傳檔案(如:Java的jdk安裝包、Tomcat安裝包、專案的war包等),也可用該軟體進行檔案的刪除、重新命名等操作。
在完成該任務期間,踩了很多個坑,從一個坑裡走出來,然後又進入了另一個坑。一回生,二回熟,將第一次部署專案的經驗教訓記錄下來,避免以後同一個跟頭栽兩次。
如有表述不當的地方,歡迎指正。
2.踩坑記錄
踩坑1:伺服器上的jdk、tomcat安裝哪個版本?
先給出結論,然後慢慢解釋。
結論:伺服器安裝的jdk需要與自己電腦寫專案時所用的jdk一致;伺服器tomcat版本<=伺服器jdk版本即可。
我自己寫專案程式碼的時候,電腦上使用的是jdk和tomcat版本是:
jdk:11.0.6
tomcat:9.0.37
一開始,我給伺服器安裝jdk和tomcat時,安裝的是jdk1.8,tomcat8。
我將war包傳到了伺服器並解壓後,通過瀏覽器訪問該專案,報404錯誤,注意:是可以通過url"ip地址:8080"訪問tomcat主頁的。
檢視tomcat的logs資料夾下的日誌,發現報錯:
java.lang.UnsupportedClassVersionError:com/czn/filter/AccessControlFilter :
Unsupported major.minor version 55.0 (unable to load class[com.czn.filter.AccessControlFilter])
意思是:
編譯好的.class檔案,當時編譯的時候所用的jdk版本(在我自己電腦上編譯的),與現在伺服器上要執行.class檔案的jdk的版本不一致,即:我的電腦的jdk跟伺服器的jdk版本不一致。
再解釋地詳細點:
1.在用idea將專案打包成war包時,使用的是編譯好的.class檔案,而不是.java原始檔,是在我自己的電腦上進行編譯,使用的是我的電腦上的jdk。伺服器如果想要正確執行這些.class檔案,就需要有正確版本的jdk。.class檔案當時編譯和執行所用的jdk必須版本一致。這裡其實體現了初學Java時所學的一個概念:“一次編譯,到處執行”,用Windows版本的jdk11編譯的.class檔案,既可以在Windows上執行,也可以在安裝有Linux版本jdk11的Linux作業系統上執行。
2.報錯中的55是什麼?
每一個jdk版本都對應著一個major.minor version:
(注意:jdk8就是jdk1.8)
我們記住jdk6對應50,然後就能夠以此類推,版本+1,major.minor version也+1,可以推算出,55對應的jdk版本為11,我的電腦用的jdk版本確實為11。
於是,我就在伺服器上重新安裝了jdk11,但還是不能訪問專案。原因:我安裝jdk1.8的時候,使用的方式是上傳安裝包並解壓,然後配置環境變數:在etc/profile檔案裡設定JAVA_HOME。我安裝jdk11的時候,用yum方式安裝的。雖然我在命令列裡輸入java -version,顯示的版本號是11,但實際上tomcat用的jdk還是之前的1.8版本。
怎麼檢視tomcat的所用的jdk版本?
進入tomcat安裝資料夾的bin目錄下 執行./version.sh
資料
yum方式安裝的jdk在哪個位置?
yum方式是自動安裝的,沒有指定安裝的路徑。在/usr/lib/jvm目錄下。
修改tomcat所用的jdk版本:
修改etc/profile檔案裡JAVA_HOME對應的jdk路徑,從jdk1.8的路徑改成了jdk11的路徑。
修改後的etc/profile:
再次檢視tomcat所用jdk版本:
可以看到JRE_HOME還有JVM Version那裡的jdk版本都為11。
至於tomcat的版本,tomcat8可以執行jdk8及其以上版本的jdk,tomcat的版本沒問題,可以跟自己電腦上tomcat版本不一樣。
踩坑2:程式碼中的URI使用絕對路徑還是相對路徑?
結論:建議URI都以斜槓/開頭,斜槓/代表:http://ip地址:8080/。
URI會出現在:html、jsp頁面裡的Ajax,servlet的註解,如:
上邊兩個圖片中的程式碼對應的是登入功能,用登入功能來說明路徑問題。訪問部署在伺服器上的專案,使用者輸入使用者名稱、密碼後,點選“登入”按鈕:
如果URI是以斜槓開頭(如圖所示:“/admin/login.do”),那麼完整的請求地址為:
http://ip地址:8080/admin/login.do
如果將Ajax中的URI改為“login.do”,假設伺服器上war包解壓後的資料夾叫做e,那麼完整的請求地址為:
http://ip地址:8080/e/admin/login.do
而實際上這是個不存在的請求地址,不對應任何servlet,會報404錯誤。
可以理解為斜槓/代表http://ip地址:8080/
經驗1:發生錯誤時,請檢視tomcat的執行日誌
用idea執行tomcat時,可以在控制檯看到System.out.println列印的內容,以及一些報錯的資訊。在伺服器上執行tomcat,如果出現了錯誤,去哪裡檢視這些資訊呢?
tomcat的logs資料夾下放著tomcat執行日誌,可以檢視catalina.out日誌檔案。比如,我一開始連線的mysql不是該騰訊雲伺服器上的mysql,而是另一個遠端資料庫,每次一點選登入,就報500錯誤:空指標異常,始終找不到根本原因,最後檢視catalina.out日誌檔案,發現報錯:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ‘root’@‘81.70.95.7’ to database ‘0818-chenzuona’
原來根本原因是一直都沒連線上資料庫。
後來在該騰訊雲伺服器上安裝了mysql,使專案訪問本地mysql就沒有問題了。
清空catalina.out日誌檔案:
catalina.out日誌檔案可能會很大,因為它記錄了若干天的執行情況,使用cat指令檢視時,可能載入很久,可以使用以下指令先對其進行清空:
echo “”>catalina.out
實時檢視catalina.out日誌檔案:
資料
5.部署流程
5.1 伺服器安裝Java的jdk
2種方式:
yum
上傳安裝包然後解壓
詳見:資料
5.2 伺服器安裝tomcat
上傳tomcat安裝包到伺服器上,然後解壓,指令如下:
tar -xzvf apache-tomcat-8.5.11.tar.gz
進入到tomcat的bin資料夾,開啟tomcat的指令:
./startup.sh
關閉tomcat的指令:
./shutdown.sh
網頁測試:在瀏覽器上輸入http://ip地址:8080/,看是否能顯示tomcat主頁。
5.3 伺服器安裝MySQL
步驟1: 檢測系統是否自帶安裝mysql
[root@localhost /]# yum list installed | grep mysql
步驟2: 刪除系統自帶的mysql及其依賴(防止後面安裝發生衝突)
[root@localhost /]# yum -y remove mysql-libs.x86_64
步驟3: 給CentOS新增rpm源,並且選擇較新的源,RPM軟體包管理器縮寫
[root@localhost /]# wget --no-check-certificate dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
步驟4: 安裝第一步下載的rpm檔案
[root@localhost /]# yum install mysql-community-release-el6-5.noarch.rpm
此處需要輸入"y"
[root@localhost /]# yum repolist enabled | grep mysql //列出你所有的yum repo檔案
步驟5: 使用yum安裝mysql
[root@localhost /]# yum install mysql-community-server
此處輸入3次“y”
安裝完畢
步驟6: 啟動mysql服務
[root@localhost /]# service mysqld start
步驟7: 檢視mysql是否自啟動,並且設定開啟自啟動
[root@localhost /]# chkconfig --list | grep mysqld
0 1 2 3 4 5 6 代表centOS啟動狀態
[root@localhost /]# chkconfig mysqld on
步驟8: 修改字符集為UTF-8
[root@localhost /]# vim /etc/my.cnf
在[mysqld]部分新增:
character-set-server=utf8
在檔案末尾新增[client]段,並在[client]段新增:
default-character-set=utf8
esc退出編輯 :wq儲存退出
修改完成後儲存重啟服務
[root@localhost /]# service mysqld restart
步驟9: 修改預設配置
[root@localhost /]# mysql_secure_installation
按照提示進行配置,這裡預設root使用者的密碼空,直接回車即可。此處輸入內容:“y”,“y”,“n”,“y”,“y”
步驟10: 授權遠端登入
方案1: 實現遠端連線(授權法)- 將許可權改為ALL PRIVILEGES
[root@localhost /]# mysql -uroot -p
mysql> use mysql;
Database changed
mysql> flush privileges;
//mysql 新設定使用者或更改密碼後需用flush privileges重新整理MySQL的系統許可權相關表,否則會出現拒絕訪問
mysql> select host,user,password from user;
這樣機器就可以以使用者名稱root密碼root遠端訪問該機器上的MySql.
方案2: 實現遠端連線(改表法)
use mysql;
update user set host = ‘%’ where user = ‘root’;
fiush privileges
這樣在遠端就可以通過root使用者訪問Mysql
5.4 將專案打包成war包,並上傳到webapps資料夾下
war包組成部分: 一是WebContent,二是classess。
- WebContent目錄代表其是一個web專案, 主要存放的是前端程式碼、Web.xml、lib等檔案。
- classes目錄是編譯過後的java檔案的二進位制檔案.( .class ) 後臺邏輯都是由這裡管控。
idea打包war包:資料
war包上傳到tomcat的webapps資料夾下。先關閉tomcat,再重新啟動tomcat。webapps資料夾下就會有一個war包解壓後得到的資料夾。
5.5 使通過伺服器訪問專案的url不帶專案名
通過http://ip地址:8080/就能訪問專案,不用加專案名字,有2種方法。
方法1:
把tomcat的webapps資料夾下,原來的ROOT資料夾重新命名成其他名字,或者刪除掉。將war包解壓後的資料夾重新命名為ROOT。
其實原來的ROOT資料夾放的就是tomcat的主頁。
方法2:
修改tomcat的conf資料夾下的server.xml檔案。
在Host節點下加上:
<Context path="" docBase="解壓後war包的絕對路徑" debug="0" reloadable="true"/>
詳見:資料
5.6 資料庫連線池配置檔案druid.properties的修改
自己電腦上的mysql,和伺服器上的mysql可能有些不一樣,比如:資料庫名字、密碼等,如果不一樣的話,記得修改druid.properties。
#使用本地資料庫:e
#對於我的電腦的mysql來說,密碼為空。對於安裝在騰訊雲伺服器上的mysql來說,密碼為123456。
url=jdbc:mysql://localhost:3306/e?useUnicode=true&characterEncoding=utf-8
username=root
password=123456
#password=
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
minIdle=5
maxWait=3000
5.7 navicat不同資料庫中資料的遷移
如果想要把自己電腦上mysql裡的資料表,弄到伺服器mysql裡,可以通過navicat。首先要通過navicat連線上伺服器的mysql。
點選:“工具”-“資料傳輸”
詳見:資料
相關文章
- vuePC專案踩坑記錄Vue
- React專案踩坑記錄React
- 專案踩坑記錄, 長期更新
- 伺服器重新部署踩坑記伺服器
- django專案部署到centos,踩的坑DjangoCentOS
- Solr 部署與使用踩坑全記錄Solr
- ONNX模型轉Openvino部署踩坑記錄模型
- Java筆記---部署 JavaWeb 專案到雲伺服器Java筆記Web伺服器
- 滾動到頂部踩坑記錄
- 使用vue-cli3建立專案,踩坑記錄Vue
- laravel踩坑記錄Laravel
- sealos踩坑記錄
- DietPi踩坑記錄
- Sentry 部署踩坑記
- 豐田專案踩坑手記(REACT)React
- # Laravel 5.5 升級到 6.0 踩坑記錄Laravel
- strtotime 踩坑記錄
- ABP框架踩坑記錄框架
- Electron工程踩坑記錄
- gorm踩坑記錄(一)GoORM
- MySQL_踩坑記錄MySql
- AS上傳Library到JCenter 教程+踩坑記錄
- qiankun微前端從搭建到部署大型踩坑記錄片(一鏡到底)前端
- Laravel7 踩坑記錄Laravel
- node link 踩坑記錄
- ES6踩坑記錄
- Go json 踩坑記錄GoJSON
- Taro 小程式 踩坑記錄
- Mac下Charles踩坑記錄Mac
- 微信小程式踩坑記錄微信小程式
- React同構踩坑記錄React
- iOS11踩坑記錄iOS
- list複製踩坑記錄
- Laravel Homestead踩坑記2——建立專案Laravel
- 【踩坑筆記】專案出現Permission denied筆記
- 專案中請求第三方介面踩坑記錄
- 看spring cloud開源專案Pig的雲踩坑記SpringCloud
- 記錄使用 guzzlehttp 異常捕獲踩坑記錄HTTP