利用docker将wafer2-quickstart-php部署到自己的云服务器

前言

实验环境为: 阿里云/腾讯云服务器 Ubuntu 16.04 x64系统.
使用普通用户操作.
阿里云的Ubuntu系统默认是root用户, 可以新建一个名为ubuntu的普通用户哦.
需要注册一个域名.

安装docker

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv \
               --keyserver hkp://ha.pool.sks-keyservers.net:80 \
               --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get upgrade
# apt-cache policy docker-engine
sudo apt-get install -y docker-engine
sudo apt-get clean
sudo usermod -aG docker $(whoami) # 将当前用户加入到docker用户组, 这样以后使用docker就不需要root权限了.
sudo systemctl daemon-reload
sudo systemctl restart docker
# sudo reboot

配置docker镜像加速

腾讯云docker镜像加速

编辑 /etc/systemd/system/multi-user.target.wants/docker.service
在ExecStart=/usr/bin/dockerd -H fd:// 这行后面加上如下部分.

ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://mirror.ccs.tencentyun.com
sudo systemctl daemon-reload
sudo systemctl restart docker

阿里云docker镜像加速

根据文档操作 容器镜像服务-镜像加速器

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://系统分配的前缀.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

设置域名解析记录

在阿里云/腾讯云控制台添加一条域名解析记录. 将下面的zhoujin7.com换成你自己的域名.
wx.zhoujin7.com
设置域名解析记录

下载容器相关的配置文件

cd ~
mkdir -p ~/development/docker
mkdir -p ~/development/phpdev
git clone https://github.com/zhoujin7/docker-auto-build.git
cp docker-auto-build/lamp ~/development/docker/wx -R

下载wafer2-quickstart-php并进行相关配置

下载服务端代码

cd ~
git clone https://github.com/tencentyun/wafer2-quickstart-php.git
cp wafer2-quickstart-php/server ~/development/phpdev/wx -R

配置数据库密码

编辑~/development/phpdev/wx/config.php
将下面的yourPassword123456换成你想设置的数据库密码

'mysql' => [
    'host' => '172.28.0.3',
    'port' => 3306,
    'user' => 'root',
    'db'   => 'cauth',
    'pass' => 'yourPassword123456',
    'char' => 'utf8mb4'
],

编辑~/development/phpdev/wx/application/config/database.php
将下面的yourPassword123456换成你的数据库密码, 和上面设置的保持一致.

$db['default'] = array(
	'dsn'	=> '',
	'hostname' => '172.28.0.3',
	'username' => 'root',
    'password' => 'yourPassword123456',
	'database' => 'cauth',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8mb4_unicode_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

设置SDK配置文件

创建文件~/development/docker/wx/sdk.config.json
将下面的wx.zhoujin7.com换成你的域名, 和上面设置域名解析记录的域名一致.
登录腾讯云控制台, 打开https://console.cloud.tencent.com/cam/capi, 新建密钥.
新建密钥
将下面yourAPPID, yourSecretId和yourSecretKey换成你的APPID, SecretId和SecretKey.

tee ~/development/docker/wx/sdk.config.json <<-'EOF'
{
  "serverHost": "wx.zhoujin7.com",
  "qcloudAppId": yourAPPID,
  "qcloudSecretId": "yourSecretId",
  "qcloudSecretKey": "yourSecretKey"
}
EOF

创建docker容器

创建自定义网络用于固定容器IP

docker network create --subnet=172.28.0.0/16 mynetwork

创建容器时, 加上--network mynetwork --ip 172.28.0.x --dns 114.114.114.114 (x为数字)

创建nginx-proxy容器

docker run -d -p 80:80 -p 443:443 \
--name nginx-proxy \
--network mynetwork --ip 172.28.0.2 --dns 114.114.114.114 \
-e TZ=Asia/Shanghai \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
-v /usr/share/nginx/html \
-v /home/ubuntu/development/docker/nginx/certs:/etc/nginx/certs \
-v /home/ubuntu/development/docker/nginx/conf.d:/etc/nginx/conf.d \
--restart=always \
jwilder/nginx-proxy

创建letsencrypt-nginx-proxy-companion容器

docker run -d \
--name nginx-proxy-letsencrypt \
-v /home/ubuntu/development/docker/nginx/certs:/etc/nginx/certs \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--volumes-from nginx-proxy \
--restart=always \
jrcs/letsencrypt-nginx-proxy-companion

创建mysql容器

将下面的yourPassword123456换成你的数据库密码, 和上面设置过的保持一致.

docker run -d \
--name mysql \
--network mynetwork --ip 172.28.0.3 --dns 114.114.114.114  \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_ROOT_HOST=172.28.0.% \
-v /home/ubuntu/development/docker/mysql57:/var/lib/mysql \
--restart=always \
mysql/mysql-server:5.7

创建wx微信小程序后端运行环境容器

将下面的wx.zhoujin7.com换成你的域名, 和上面设置域名解析记录的域名一致.
将下面的yourEmail@qq.com换成你的个人邮箱.

docker run -d \
--name wx \
-e "VIRTUAL_HOST=wx.zhoujin7.com" \
-e "LETSENCRYPT_HOST=wx.zhoujin7.com" \
-e "LETSENCRYPT_EMAIL=yourEmail@qq.com" \
--restart=always \
--network mynetwork --ip 172.28.0.5 --dns 114.114.114.114 \
-v /home/ubuntu/development/phpdev/wx:/var/www/html \
-v /home/ubuntu/development/docker/wx/php.ini:/etc/php/7.0/apache2/php.ini:rw \
-v /home/ubuntu/development/docker/wx/apache2/000-default.conf:/etc/apache2/sites-enabled/000-default.conf:rw \
-v /home/ubuntu/development/docker/wx/sdk.config.json:/data/release/sdk.config.json:rw \
registry.cn-shenzhen.aliyuncs.com/jin7/lamp

将cAuth.sql导入数据库

进入数据库容器mysql控制台.
将下面的yourPassword123456换成你的数据库密码, 和上面设置过的保持一致.

docker exec -it mysql bash -c 'mysql -uroot -pyourPassword123456'

执行下面的sql语句.

CREATE DATABASE `cauth` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;

use cauth;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `csessioninfo`
-- ----------------------------
DROP TABLE IF EXISTS `csessioninfo`;
CREATE TABLE `csessioninfo` (
  `open_id` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `uuid` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `skey` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_visit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `session_key` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `user_info` varchar(2048) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`open_id`),
  KEY `openid` (`open_id`) USING BTREE,
  KEY `skey` (`skey`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会话管理用户信息';

SET FOREIGN_KEY_CHECKS = 1;

注意在Windows上, MySQL的数据库名、表名、字段名大小写不敏感, 但在Linux上则大小写敏感.
项目可能同时在Windows和Linux环境运行, 为了避免由于大小写造成的麻烦, 这里将原来的数据库名cAuth和数据表名cSessionInfo都改成了小写.
同时需要修改代码文件, 将里面的cAuth替换为cauth, cSessionInfo替换为csessioninfo
需要修改的文件:
~/development/phpdev/wx/vendor/qcloud/weapp-sdk/lib/Model/User.php

在微信公众平台中设置服务器域名

将下面的wx.zhoujin7.com替换成你的域名.
设置服务器域名

在微信开发者工具中设置小程序的服务器地址

设置服务器地址

登录测试

登录测试

comments powered by Disqus