部署一個微信小程序2 | 搭建小程序開發環境

接上篇,原本以為一個上午就能搞定的小程序,沒想到從零開始部署這么的麻煩,為此我也是給胖樹同學捏一把汗,等我幫他把小程序的demo做出來之后,我應該會告訴他從入門到放棄的方法吧。


image.png

但是既然已經開始了,就善始善終吧,上篇把微信小程序部署需要的前提比如云服務器、域名、證書都申請配置好了,而且也都實名認證好了,同時也通過一個小的Web服務程序證明了環境已經配置成功。這一節就開啟注冊開發者賬號和配置小程序開發環境等等工作吧。

Step1 注冊開發者賬號

  • 微信公眾平臺注冊小程序的賬號,注意,在微信公眾平臺中,訂閱號、小程序的賬號即便相同也是分開管理的,必須單獨注冊小程序的賬號。
  • 官方視頻教程:注冊開發者賬號

Step2 配置小程序開發者賬號信息

  • 登陸微信公眾平臺,進入 【設置】-【開發設置】-【服務器域名】-【開始配置】
  • 掃碼完成身份校驗后,request合法域名和socket合法域名都需要填寫在上一節中準備好的域名地址。就填前兩項就好。


    image.png

Step3 安裝小程序開發工具并運行第一個Demo

  • 下載
    1.小程序開發工具 :下載后安裝在自己電腦上
    2.實驗配套源碼lab-weapp-client:下載后解壓

  • 啟動開發工具,微信掃碼登陸,選擇【本地小程序項目】-【添加項目】
    1.APPID:在公眾平臺的【設置】-【開發設置】-【開發者ID】中復制過來
    2.項目名稱:自己填
    3.項目目錄:選擇剛剛解壓的源碼目錄(包含了app.js的那個目錄)
    4.官方視頻教程:運行配套小程序代碼

  • 在開發工具中給Demo源碼配置域名:在開發工具的 編輯 面板中,選中 app.js 進行編輯,需要修改小程序通信域名,比如下面這樣,改完記得保存。

App({
    config: {
        host: 'www.yourdomain.com' // 這個地方填寫你的域名
    },
    onLaunch () {
        console.log('App.onLaunch()');
    }
});
小程序開發工具界面

Step4 搭建HTTP服務

Node+Express可以搭建一個HTTP服務器

4.1安裝NodeJS

sudo apt-get update  
sudo wget https://mc.qcloudimg.com/static/archive/262420521a966befe17dfa0070ddb272/node-v6.11.0.tar.gz
sudo tar xvf node-v6.11.0.tar.gz
cd node-v6.11.0
sudo ./configure
sudo make   #這一步時間比較久
sudo make install  
sudo cp /usr/local/bin/node /usr/sbin/

查看版本測試一下看是否安裝完成

node -v

4.2 創建HTTP Server

創建要給服務器專用工作目錄,進入目錄

sudo mkdir -p /data/release/webapp
cd /data/release/webapp

在工作目錄下創建package.json文件,修改文件訪問權限

sudo touch package.json
sudo chmod a+r+w package.json

vim編輯package.json,添加服務器包和版本號,然后保存退出,參考示例

#  /data/release/webapp/package.json 文件目錄
{
    "name":"webapp"
    "version":"1.0.0"
}

創建app.js

cd /data/release/webapp
sudo touch app.js
sudo chmod a+r+w app.js

編輯app.js

// 引用 express 來支持 HTTP Server 的實現
const express = require('express');

// 創建一個 express 實例
const app = express();

// 實現唯一的一個中間件,對于所有請求,都輸出 "Response from express"
app.use((request, response, next) => {
    response.write('Response from express');
    response.end();
});

// 監聽端口,等待連接
const port = 8765;
app.listen(port);

// 輸出服務器啟動日志
console.log(`Server listening at http://127.0.0.1:${port}`);

4.3 運行HTTP服務

安裝npm和PM2。pm2 是一個帶有負載均衡功能的Node應用的進程管理器.
當你要把你的獨立代碼利用全部的服務器上的所有CPU,并保證進程永遠都活著,0秒的重載, PM2是完美的。它非常適合IaaS結構,但不要把它用于PaaS方案。這里有詳細用法

sudo apt-get install npm
sudo npm install -g pm2    #這一步可以用國內的鏡像npm install pm2 -g --registry=https://r.cnpmjs.org/
#PM2安裝的時間比較長

用npm來安裝Express,然后用PM2來啟動HTTP服務

cd /data/release/webapp
sudo npm install express --save
pm2 start app.js

現在,HTTP 服務已經在 http://<自己的 CVM IP 地址>:8765運行

然后我們可以用PM2來進行Node進程的運行,監控和管理

pm2 logs    #查看服務輸出的日志
pm2 restart app    #重啟服務
http服務中

Step5 搭建HTTPS服務

微信小程序要求和服務器的通信都通過HTTPS進行

5.1 安裝和啟動Nginx

sudo apt-get install nginx -y    #安裝
sudo /etc/init.d/nginx start    #啟動 Nginx

此時訪問 http://<域名>可以看到 Nginx 測試頁面

5.2 配置 HTTPS 反向代理

修改 /etc/nginx 目錄的讀寫權限

sudo chmod a+rw /etc/nginx

將之前下載的 SSL 證書(解壓后 Nginx 目錄分別以 crt 和 key 作為后綴的文件)通過拖動到左側文件瀏覽器 /etc/nginx 目錄的方式來上傳文件到服務器上。

證書管理處下載證書,找到nginx的對應的csr和key文件,把他們倆復制到CVM主機的/etc/nginx/文件夾下。

image.png

如果復制失敗,應該是權限問題,可以先復制到用戶目錄文件夾/home/ubuntu/下,再在終端里移動文件到/etc/nginx/下

在 /etc/nginx/conf.d 目錄創建 ssl.conf 文件

cd /etc/nginx/conf.d
sudo touch ssl.conf
sudo chmod a+rw ssl.conf

修改ssl.conf 文件為如下內容

server {
        listen 443;
        server_name www.example.com; # 改為綁定證書的域名
        # ssl 配置
        ssl on;
        ssl_certificate 1_www.example.com_bundle.crt; # 改為自己申請得到的 crt 文件的名稱
        ssl_certificate_key 2_www.example.com.key; # 改為自己申請得到的 key 文件的名稱
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass http://127.0.0.1:8765;
        }
    }

保存配置文件,讓 Nginx 重新加載配置使其生效:

sudo nginx -s reload

在瀏覽器打開https://<你的域名>,如果訪問正常,說明HTTPS服務已經安裝好。注意,如果打開的是https://<你的IP>,會顯示此網站不安全,那是因為沒有對應的證書,屬于正常的。


https服務中

Step6 在小程序中測試HTTPS訪問

打開配套的小程序Demo,點擊 實驗一:HTTPS,點擊 發送請求 來測試訪問結果。
如果服務器響應成功,請點擊下一步。
PS:在小程序里我用的是上一節Step6購買的那個已經配置https網站的主機,并沒有用前幾部配置好的機器,在小程序里訪問的只能是在開發設置中已經綁定好了的合法域名。


實驗一:HTTPS訪問

Step7 安裝和配置MongoDB

MongoDB 是一款 NoSQL 數據庫,支持 JSON 格式的結構化文檔存儲和查詢,對 JavaScript 有著友好的支持

sudo apt-get install mongodb-server mongodb -y    #安裝MongoDB
sudo mongod --version    #安裝結束后查看版本檢查是否成功
sudo mongo --version

啟動MongoDB

sudo mkdir -p /data/mongodb    #創建目錄用來存儲數據
sudo mkdir -p /data/logs/mongodb    #創建目錄用來存儲日志
sudo mongod --fork --dbpath /data/mongodb --logpath /data/logs/mongodb/webapp.log     #啟動,首次啟動大概花費1min

檢查是否啟動成功:MongoDB 默認監聽 27017 端口等待連接,下面的命令查看當前 27017 端口被哪個進程占用,如果是 MongoDB 的進程,則表示啟動成功

netstat -ltp | grep 27017
image.png

添加 MongoDB 用戶,先登陸本地mongoDB服務

sudo mongo

登錄后創建用戶,注意保存好創建的用戶名和密碼

use webapp;
db.createUser({ user: 'webapp', pwd: 'webapp-dev', roles: ['dbAdmin', 'readWrite']});
exit   #創建后推出命令行工具

Step8 實現小程序會話

首先安裝兩個模塊

cd /data/release/webapp
sudo npm install connect-mongo wafer-node-session --save

實現小程序會話
在工作目錄創建配置文件 config.js

cd /data/release/webapp
sudo touch config.js
sudo chmod a+rw config.js

修改config.js為下面的配置,注意替換掉的App ID和AppSecret,也注意修改mongoDB的賬號和密碼

module.exports = { 
    serverPort: '8765', 

    // 小程序 appId 和 appSecret 
    // 請到 https://mp.weixin.qq.com 獲取 AppID 和 AppSecret
    appId: 'YORU_APP_ID', 
    appSecret: 'YOUR_APP_SECRET', 

    // mongodb 連接配置,生產環境請使用更復雜的用戶名密碼
    mongoHost: '127.0.0.1', 
    mongoPort: '27017', 
    mongoUser: 'webapp', 
    mongoPass: 'webapp-dev', 
    mongoDb: 'webapp'
};

編輯 app.js,添加會話實現邏輯

// 引用 express 來支持 HTTP Server 的實現
const express = require('express');
// 引用 wafer-session 支持小程序會話
const waferSession = require('wafer-node-session'); 
// 使用 MongoDB 作為會話的存儲
const MongoStore = require('connect-mongo')(waferSession); 
// 引入配置文件
const config = require('./config'); 

// 創建一個 express 實例
const app = express();

// 添加會話中間件,登錄地址是 /login
app.use(waferSession({ 
    appId: config.appId, 
    appSecret: config.appSecret, 
    loginPath: '/login',
    store: new MongoStore({ 
        url: `mongodb://${config.mongoUser}:${config.mongoPass}@${config.mongoHost}:${config.mongoPort}/${config.mongoDb}` 
    }) 
})); 

// 在路由 /me 下,輸出會話里包含的用戶信息
app.use('/me', (request, response, next) => { 
    response.json(request.session ? request.session.userInfo : { noBody: true }); 
    if (request.session) {
        console.log(`Wafer session success with openId=${request.session.userInfo.openId}`);
    }
}); 

// 實現一個中間件,對于未處理的請求,都輸出 "Response from express"
app.use((request, response, next) => {
    response.write('Response from express');
    response.end();
});

源碼編寫完成后,重啟服務:

pm2 restart app

重啟后,使用配套的小程序完成會話測試:打開配套小程序 - 點擊 實驗二:會話 - 獲取會話,如果能看到自己的微信頭像,那就表示會話已經成功獲取了。


至此,服務器運行端口、小程序配置、MongoDB 連接配置都已經配置完畢。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,787評論 18 139
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,736評論 24 1,002
  • 你說,過去就過去了。 我說,現在是過去的現在。 你說,記憶丟掉就算了。 我說,我想找回。 你說,執念太深,也許會傷...
    阮柒月閱讀 279評論 0 0
  • 回家的路上開始下小雨了,沿途無人及開始打雷閃電了,我一點也不害怕且心里也充滿了開心。到家后雨開始更大更強烈,雨...
    94b12bf49730閱讀 208評論 0 0
  • 讀普希金的《冬天的早晨》,詩人描寫細膩,抒情飽滿,一個北國冬日里清晨的美好躍然紙上,浮現眼前。我自己也不自覺地越來...
    可比克克閱讀 461評論 4 6