慕慕生鮮上線&&騰訊雲伺服器配置準備
1.購買伺服器並配置環境
1.1 購買
- 618購買了騰訊雲伺服器三年最低配置(1核2G 1Mbps 50G雲盤),一時激動忘記了購買前領優惠券,痛失25元。
1.2 環境配置
系統是 CentOS Linux release 7.5.1804 x84-64:cat /etc/redhat-release
,由於騰訊雲伺服器的映象環境需要付費使用,因此手動安裝 Java1.8,Tomcat9,MySQL8,Redis5。
1.2.1 安裝Java 1.8
這裡安裝的是Oracle JDK1.8 而非 OpenJDK 1.8,實際使用沒有多大區別,不過前者只供個人使用,後者可以供商業使用。由於Oracle官網需要登陸,沒從官網獲取對應的二進位制包,而是找到對應的
mkdir /usr/local/java8 mv jdk-8u212-linux-x64.tar.gz /usr/local/java/ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/local/java8/ // 配置環境變數 vim /etc/profile //在末尾新增 export JAVA_HOME=/usr/local/java8/jdk1.8.0_212 export JRE_HOME=${JAVA_HOME}/jre expor CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH //生效 source /etc/profile //驗證 java -version //還可以新增軟連線(並不必須) ln -s /usr/local/java8/jdk1.8.0_212/bin/java /usr/bin/java
1.2.2 安裝Tomcat
SpringBoot已經內建了Tomcat伺服器,為什麼還要安裝呢?這引出了我這兩天未能解決的問題:用 jar包方式 未能成功上線執行,留到後面章節再說。
這裡為了和 SpringBoot 2.2.1 適配,版本是 apache-tomcat-9.0.48 。官網:下載 binary Distributions→ Core→ tar.gz 或 zip ,上傳至伺服器。
mkdir /usr/local/tomcat9 tar -zxvf apache-tomcat-9.0.48.tar.gz -C /usr/local/tomcat9 //啟動 cd /usr/local/tomcat9/apache-tomcat-9.0.48/bin ./startup.sh //可以檢視 8080埠是否監聽和佔用 netstat -tuplpn | grep 8080 lsof -i :8080
安裝完成後,可以通過修改 conf/server.xml 來自定義配置Tomcat,其中可以配置其預設埠 從 8080 改為 80
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
.....
同時因為我的專案是SpringBoot 打成 mall-0.0.1-SNAPSHOT.war,因此 如果要訪問 應該是 http://[IP]:[port]/mall-0.0.1-SNAPSHOT。同樣可以通過修改配置檔案,避免在URL中寫專案名的麻煩:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!--新增如下程式碼-->
<Context path="" docBase="mall-0.0.1-SNAPSHOT" debug="0"/>
將 http://{my-IP}:{my-Port}/mall-0.0.1-SNAPSHOT 對映為 http://[my-IP]:[my-Port]/
但是此時還無法在網頁上訪問,需要配置 騰訊雲伺服器外層安全組和自身的防火牆,將80埠開發。安全組設定參考官網文件 ,重點介紹一下開放防火牆指定埠:
// 檢視防火牆設定
firewall-cmd --state
// 如果沒有開啟,就開啟
systemctl start firewalld.service
// 設定開機自啟
systemctl enable firewalld.service
//永久設定開放80埠
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
// 檢視哪些埠是開啟狀態
firewall-cmd --list-port
這樣埠開放後,就可以通過 訪問 http://{my-IP}:80訪問專案(如果沒有對前面的專案URL對映,訪問的應該是Tomcat的頁面)。
1.2.3 安裝MySQL8
參考之前的帖子
1.2.4 安裝 redis-5.0.5
參考 長沙大鵬 -Linux安裝部署Redis(超級詳細),關鍵命令如下:
wget https://download.redis.io/releases/redis-5.0.2.tar.gz
// 安裝依賴
yum install -y gcc-c++
mkdir /usr/local/redis
tar -zxvf redis-5.0.2.tar.gz -C /usr/local/redis
cd /usr/local/redis/redis-5.0.2
//編譯
make
//安裝
cd ../
mkdir {bin,etc,data}
cd redis-5.0.2/src
make PREFIX=/usr/local/redis install //結果安裝的redis程式儲存/usr/local/redis/bin中
cp /usr/local/redis/redis-5.0.2/redis.conf /usr/local/redis/etc/
// 修改 redis.conf,具體可以參考 https://www.cnblogs.com/hunanzp/p/12304622.html
vi redis.conf
///////主要是修改以下內容
daemonize yes //1.可以後臺執行
supervised systemd //2.這樣後面可以用 systemctl 控制
# bind 127.0.0.1 ::1
protected-mode no //3.這兩行保證 可以從外網訪問redis
requirepass 1234567 //4.自行設定是否需要設定密碼,預設是註釋掉的
logfile "/usr/local/redis/redis_6379.log" //5.redis日誌儲存檔案,需要自己手動建立 touch /usr/local/redis/redis_6379.log
//開啟redis
bin/redis-server etc/redis.conf
lsof -i:6379
//關閉redis
bin/redis-cli -a your-password shutdown
2.SpringBoot打成 WAR包
SpringBoot版本:2.2.1
2.1 Jar包不成功
本來 SpringBoot 自帶 Tomcat,直接打成 jar包就可以運行了。但是不知為何,我執行之後出現問題:一直報錯:顯示埠被佔用
為此我在 StackOverflow上提問 。似乎是作者之一回答讓我更新到2.2.7版本,看是否能解決,因為之前的版本似乎有這方面的bug。我試過,結果打包之後直接 Tomcat無法執行,鬱悶了一下午。最後嘗試不用內建的,而使用獨立的Tomcat來執行,這樣出什麼問題,在日誌上都能顯示出來,而不像一個黑盒子。
2.2 war包部署
參考SpringBoot學習日記-部署與監控 和 Spring Boot 2 實戰:以 War 包的形式部署
1.修改 pom檔案
<!--1. 顯式宣告打 war包,如果之前沒寫,預設應該是jar包-->
<packaging>war</packaging>
<!--2. 排除內建的 Tomcat,關鍵是 provided,表面打包的時候不會帶上-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--3. 打包時跳過 test,可加可不加-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
2.將原來的 入口類 projectApplication.java
修改為繼承 SpringBootServletInitializer
抽象類
原來的入口類:
public class MallApplication {
public static void main(String[] args) {
SpringApplication.run(MallApplication.class, args);
}
}
現在的入口類:
public class MallApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MallApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MallApplication.class, args);
}
}
然後在IDEA編輯器中 可以先 Build→Build Project ,然後使用Maven工具中 clean package 兩個命令,直接獲得 war包,然後上傳到 Tomcat伺服器中的 webapps
。當Tomcat啟動後,war包會自動解壓成包。
2.3 檔案對映
由於是獨立的Tomcat的伺服器,因此 application.properties
中的一些設定,比如 server.port
,比如檔案對映。但是可以在Tomcat server.xml
中可以如同前面對映專案名一樣設定。參考spring boot更改tomcat的靜態資源路徑
<Context path="/images" docBase="/root/imooc_mall/images" reloadable="true" debug="0"/>
這樣 http://{ip}:80/images
對映到 /root/imooc_mall/images
。
最後部署成功,訪問 http://101.34.56.200/ 就可以訪問部署的專案了,花了幾天的時間終於成功部署了自己做的專案。
BTW :
後續的一些問題亟待解決:
- 生成付款二維碼圖片儲存在/root/imooc_mall下面了;
- 商品上傳的圖片也不在指定的位置;
- 前端出現了問題,但是前端好像是webpack React,比較難辦;
- 之前後端的商品排序按照綜合和價格沒有起作用,後面要解決一下;
- 支付介面無法真正實現。