1. 程式人生 > 其它 >慕慕生鮮上線&&騰訊雲伺服器配置準備

慕慕生鮮上線&&騰訊雲伺服器配置準備

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官網需要登陸,沒從官網獲取對應的二進位制包,而是找到對應的

網盤資源 (提取碼:f2y8),上傳到伺服器。

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 &quot;%r&quot; %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 :

後續的一些問題亟待解決:

  1. 生成付款二維碼圖片儲存在/root/imooc_mall下面了;
  2. 商品上傳的圖片也不在指定的位置;
  3. 前端出現了問題,但是前端好像是webpack React,比較難辦;
  4. 之前後端的商品排序按照綜合和價格沒有起作用,後面要解決一下;
  5. 支付介面無法真正實現。