手把手搭建微信小程序服务。
1.安装 NodeJS 和 NPM
1 2
| curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash - yum install nodejs -y
|
安装完成后查看安装是否成功
2.创建并进入文件夹
1 2
| $ mkdir -p /data/release/weapp $ cd /data/release/weapp
|
3.新建package.json
1 2 3 4
| { "name": "weapp", "version": "1.0.0" }
|
4.添加 express 服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const express = require('express');
const app = 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.运行http
1)安装 pm2
1
| npm install pm2 --global
|
2)安装 express
1
| npm install express --save
|
3)安装完成后,使用 PM2 来启动 HTTP 服务
pm2 常用命令
要查看服务输出的日志,可以使用下面的命令:
如果要重启服务,可以使用下面的命令:
5.安装 Nginx
如果是 centOS,可以用
安装完成后启动nginx
6.准备ssl证书,方法有很多种,现在有很多免费的ssl证书
7.ssl配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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; } }
|
8.安装 mongoDB
以下是针对centOS的,其他方法之后补充。
1
| yum install mongodb-server mongodb -y
|
检查是否安装成功
1 2
| mongod --version mongo --version
|
9.启动mongoDB
1)创建目录,用于 MongoDB 数据和日志存储
1 2
| mkdir -p /data/mongodb mkdir -p /data/logs/mongodb
|
2)启动
1
| mongod --fork --dbpath /data/mongodb --logpath /data/logs/mongodb/weapp.log
|
(MongoDB 首次启动可能会花费大概 1min 时间,请耐心等待)
3)检查是否启动成功
(MongoDB 默认监听 27017 端口等待连接,下面的命令查看当前 27017 端口被哪个进程占用,如果是 MongoDB 的进程,则表示启动成功。)
1
| netstat -ltp | grep 27017
|
10.添加 MongoDB 用户
1 2 3 4
| $ mongo
> use weapp; > db.createUser({ user: 'weapp', pwd: 'weapp-dev', roles: ['dbAdmin', 'readWrite']});
|
mongo2.x 的时候用db.addUser()
创建完之后,exit 退出
11.安装 Node 模块
实现小程序的会话功能,我们需要安装 connect-mongo 和 wafer-node-session
1 2
| cd /data/release/weapp npm install connect-mongo wafer-node-session
|
12.实现小程序会话
1)在工作目录weapp创建配置文件 config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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: 'weapp', mongoPass: 'weapp-dev', mongoDb: 'weapp' };
|
2)修改 app.js,添加会话实现逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| const express = require('express');
const waferSession = require('wafer-node-session');
const MongoStore = require('connect-mongo')(waferSession);
const config = require('./config');
const app = express();
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}` }) }));
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}`); } });
app.use((request, response, next) => { response.write('Response from express'); response.end(); });
app.listen(config.serverPort);
console.log(`Server listening at http://127.0.0.1:${config.serverPort}`);
|
3)重启 pm2
13.WebSocket 服务
1)安装 Node 模块
使用 ws 模块来在服务器上支持 WebSocket 协议,下面使用 NPM 来安装:
1 2
| cd /data/release/weapp npm install ws --save
|
2)创建 websocket.js,实现 WebSocket 服务,可参考下面的代码:
websocket.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| const ws = require('ws');
exports.listen = listen;
function listen(server, sessionMiddleware) { const wss = new ws.Server({ server, path: '/ws' });
wss.on('connection', (ws,request) => {
sessionMiddleware(request, null, () => { const session = request.session; if (!session) { ws.send(JSON.stringify(request.sessionError) || "No session avaliable"); ws.close(); return; } console.log(`WebSocket client connected with openId=${session.userInfo.openId}`); serveMessage(ws, session.userInfo); }); });
wss.on('error', (err) => { console.log(err); }); }
function serveMessage(ws, userInfo) { ws.on('message', (message) => { console.log(`WebSocket received: ${message}`); ws.send(`Server: Received(${message})`); });
ws.on('close', (code, message) => { console.log(`WebSocket client closed (code: ${code}, message: ${message || 'none'})`); });
ws.send(`Server: 恭喜,${userInfo.nickName}`); }
|
修改 app.js ,调用 WebSocket 服务,可参考下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| const http = require('http');
const express = require('express');
const waferSession = require('wafer-node-session');
const MongoStore = require('connect-mongo')(waferSession);
const config = require('./config');
const websocket = require('./websocket');
const app = express();
const sessionMiddleware = waferSession({ appId: config.appId, appSecret: config.appSecret, loginPath: '/login', store: new MongoStore({ url: `mongodb://${config.mongoUser}:${config.mongoPass}@${config.mongoHost}:${config.mongoPort}/${config.mongoDb}` }) }); app.use(sessionMiddleware);
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}`); } });
app.use((request, response, next) => { response.write('Response from express'); response.end(); });
const server = http.createServer(app);
websocket.listen(server, sessionMiddleware);
server.listen(config.serverPort);
console.log(`Server listening at http://127.0.0.1:${config.serverPort}`);
|
修改完成后,按 Ctrl + S 保存文件,并重启服务:
3)更新 Nginx 代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| # WebSocket 配置 map $http_upgrade $connection_upgrade { default upgrade; '' close; }
server { listen 443; server_name www.example.com; # 改为绑定证书的域名 # ssl 配置 ssl on; ssl_certificate 1_www.example.com.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;
# WebSocket 配置 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
location / { proxy_pass http://127.0.0.1:8765; } }
|
修改完成后重启nginx:
`` bash
nginx -s reload
```