部署微信小程序服务器
这篇文章是 自行部署 官方Wafer框架 到自己的服务器的步骤指引。
由于小程序的登录功能需要服务器配合,所以官方有个配置服务器的解决方案。 这个解决方案有两种部署方式,一站式部署和自行部署。一站式部署由于文档比较老,很久没有更新。并且微信开发者工具好像已经不支持服务器代码自动部署到云这个功能了。好像已经行不通了,官方现在使用的方式是云开发方式。但是有时候我们不想使用云开发。所以我们自行把这个框架部署到自己购买的云服务器中。官方文档建议我们购买一个云服务器和一个云数据库。这里由于我们是学习,为了省钱,我们只购买一个云服务器,然后自己在云服务中安装一个mysql数据库。
另外大家有什么其他部署方案,也请指点。
配置服务器过程中我遇到的一些疑问
为什么有了node还要安装nginx?
可以使用nginx代理来实现负载均衡等功能,方法后续扩展。
环境
我是购买了一个腾讯云服务,并且购买了一个域名并且备案。
云服务器安装的系统是Centos 7.6
安装Nginx
yum -y install nginx
nginx -v
开启nginx
nginx
重启nginx
nginx -s reload
停止nginx
nginx -s stop
安装Node.js
Wafer 的 Demo 需要 7.6 以上版本的 Node.js 才能运行,目前最新版本为 8.x,yum 本身不提供 Node.js 的源,所以首先我们得切换源:
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
可以把上面的8.x改为最新版本12.x,因为现在node的最新版本是12
yum -y install nodejs
node -v
查看到版本信息代表安装成功
安装Mysql
下载mysql安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
安装MySQL
yum install mysql-community-server
启动MySQL服务
systemctl start mysqld
查看MySQL的启动状态
systemctl status mysqld
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码:
grep 'temporary password' /var/log/mysqld.log
登录mysql:登录后会进入mysql的命令行模式
mysql -u root -p
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码!';
新建数据库
新建一个数据库名为 cAuth,排序规则为 utf8mb4_unicode_ci。数据库名必须和小程序文件中的保持一致,可自行修改。命令结束别忘了写分号;如果输入命令后显示的是 -> 提示符,很有可能是没写分号。
mysql> CREATE DATABASE IF NOT EXISTS cAuth DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
开启SFTP
SFTP 是一种安全的文件传输协议,我们可以通过 SFTP 把本地的文件上传到服务器上,通过以下命令检查 sftp 状态:
service sshd status
看到绿色的actiov(running)状态表示服务已经开启
配置Https
完成以上准备工作,就要开始配置 Nginx 和 HTTPS 了,首先需要申请一个 SSL 证书,可以到腾讯云申请免费的 SSL 证书,申请成功之后下载证书,并把压缩包中 Nginx 目录下的证书文件通过 SFTP 上传到服务器的 /data/release/nginx 目录,如果没有这个目录则新建:
上传完证书以后,可以开始配置 Nginx,进入服务器的 /etc/nginx/conf.d 目录,新建一个 weapp.conf 文件,将文件拷贝到本地,打开编辑,写入如下配置(请将配置里 wx.ijason.cc 修改为你自己的域名,包括证书文件):
upstream app_weapp {
server localhost:5757;
keepalive 8;
}
server {
listen 80;
server_name 替换成服务器域名;
rewrite ^(.*)$ https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name 替换成服务器域名;
ssl_certificate /data/release/nginx/1_wx.ijason.cc_bundle.crt;
ssl_certificate_key /data/release/nginx/2_wx.ijason.cc.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://app_weapp;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
其中有一行是
listen 443 ssl;
官方版本是
listen 443;
ssl on;
是版本差异导致的。
修改完将这个文件上传到服务器上,然后在 ssh 中输入:
nginx -t
看结果是否OK
然后输入nginx启动服务
测试一下接口是否可以,现在是应该显示502错误页面
上传服务器代码
Github仓库地址:Wafer2-startup ,使用小程序开发工具开发工具打开Demo源码(别忘了填写AppID)
配置server/config.js
const CONF = {
port: '5757',
rootPathname: '' /data/release/weapp' , //服务器上server文件夹地址与此处一致
// 填写微信小程序 App ID
appId: 'wx33333',
// 填写微信小程序 App Secret
appSecret: 'wx22222',
// 是否使用腾讯云代理登录小程序
useQcloudLogin: false, // 可直接使用微信登陆小程序 因为使用阿里云改为false
/**
* MySQL 配置,用来存储 session 和用户信息
* 若使用了腾讯云微信小程序解决方案
* 开发环境下,MySQL 的初始密码为您的微信小程序 appid
*/
mysql: {
host: '服务器IP',//很多文档都写的云数据库内网IP,关于这一点我写的服务器公网IP一样可以用,不太了解
port: 3306,
user: 'root',
db: 'cAuth',
pass: '服务器数据库密码',//之前操作修改过
char: 'utf8mb4'
},
cos: {//这个地区没什么影响,可以不改
/**
* 区域
* 华北:cn-north
* 华东:cn-east
* 华南:cn-south
* 西南:cn-southwest
* 新加坡:sg
* @see https://cloud.tencent.com/document/product/436/6224
*/
region: 'cn-south',
// Bucket 名称
fileBucket: 'qcloudtest',
// 文件夹
uploadFolder: ''
},
// 微信登录态有效期
wxLoginExpires: 7200,
// 其他配置 ...
serverHost: '你的域名',
//以下配置可以留空不填 但是参数一定要有 一定要有 一定要有 否则会报错,node启动不了
tunnelServerUrl: '',//腾讯云信道服务地址 很多文档里写的地址打开直接404
tunnelSignatureKey: '',
// 可以注册一个腾讯云账号,获取一下配置。腾讯云相关配置可以查看云 API 秘钥控制台:
https://console.cloud.tencent.com/capi
qcloudAppId: '你的腾讯云 AppID',
qcloudSecretId: '你的腾讯云 SecretId',
qcloudSecretKey: '你的腾讯云 SecretKey',
wxMessageToken: 'weixinmsgtoken',
networkTimeout: 30000
}
module.exports = process.env.NODE_ENV === 'local' ? Object.assign({}, CONF, require('./config.local')) : CONF;
都配置好以后,将server文件里的所有代码上传到服务器上的/data/release/weapp目录下,要与前文的 rootPathname: '' /data/release/weapp' 一致。
服务器安装依赖
进入到weapp目录里,输入以下命令切换npm 源到淘宝镜像,防止官方镜像下载失败:(不切换也无所谓)
npm config set registry https://registry.npm.taobao.org
使用npm全局安装pm2
npm i -g pm2
然后常规操作,安装package.json里的依赖:
npm i
使用 Demo 代码里的 tools/initdb.js 工具初始化数据库:
node tools/initdb.js
初始化成功则会提示“数据库初始化成功”
启动项目
npm start
这里需要学习 node 的一些插件 pm2 nodemon 这些都是干啥的,有什么洋的启动机制。
顺利完成以上操作后,也就完成了 Wafer2 Demo 在自己服务器上的部署。
直接访问 http://你的域名/weapp/login,会提示:{"code":-1,"error":"ERR_HEADER_MISSED"},则表示配置成功。
网友评论