云托管体验——部署ThinkPHP商城后台到微信云托管(含本地云调试配置)
2022年的今天,云计算蓬勃发展,除了强大的云平台建设经验的支持外,差异化竞争也很重要。微信云托管背靠腾讯云,坐拥微信生态的优势使其在同类云容器托管产品中让人眼前一亮,以微信为接入点的业务向微信云托管靠拢在安全、用户体验、运维、开发上都具备优势。微信云托管的能力已经上线不少,趁着最近云托管有活动,不花钱体验一下云托管的魅力。
本文包括两块主要内容:(Thinkphp项目容器构建思路及实践、在本地搭建模拟云环境完成调试)开始前请在本地开发环境部署好Docker与Vscode
一、开通云服务
(一)云环境开通
系统响应一般比较快,遇到转圈圈超过1分钟可以直接刷新页面。
在微信云托管 (qq.com)里,扫码登录,选择自己所需要的账号进行开通
选择自定义部署
点击确定或者绑定腾讯云账号
如果需要绑定腾讯云账号,绑定授权完成后跳转回来可以先点一下取消,再点“自定义”部署
一般来说,点一次确定即可,如果响应慢可以等一下,避免造成环境重复创建
(二)数据库创建
创建数据库并创建子账号
二、容器构建
如果您已经打包成容器,请跳过这一步~这一步主要是根据项目本身的需求去对运行环境作相应的配置,这里列举了本次项目所需依赖,记得最后记录一个清单。
(一)收集待迁移项目所需依赖
所需依赖的话,如果是新建项目的话可以从文档去找
1、项目所需运行环境
- 操作系统:这里因为需要作PHP的版本适配,选择了Alpine:3.10
- Nginx/Apache:本次项目选择了engineX;
- PHP: 7.1 ~ 7.3;
- PHP-FPM:配套即可;
- PHP插件:如
php7-pcntl php7-posix
等等,这里比较多,详细插件会放在Dockerfile
2、 项目所需数据库
- MySQL:因为云环境提供了数据库,我们就不在本地部署数据库了~
- Redis:因为当前云托管还没推出,如果是不是测试,强烈建议使用云Redis数据库!
3、项目运行脚本
- Nginx启动脚本:
nginx -g 'daemon off;'
- 文件目录权限:
chmod -R 777 /app/runtime \
chmod -R 777 /app/public \
chmod -R 777 /app/ \
- Redis启动脚本:
EXEC=/usr/bin/redis-server
CLIEXEC=/usr/bin/redis-cli
/usr/bin/redis-server /etc/redis.conf
- PHP-FPM启动脚本:
php-fpm -D
- Think的Workerman和 Timer
/usr/bin/php /app/think workerman start --d
/usr/bin/php /app/think timer start --d
(二)检查依赖
在构建之前,我们还需要检查一下这些依赖是否能够轻松引入,方法很简单,去Alpine依赖包管理搜索对应依赖,并记录一下他们的一些必要信息:在容器内安装位置、配置文件位置,方便后续覆盖容器内的配置文件
1、前往Alpine依赖包管理
依次搜索所需插件
nginx
php
php-fpm
# 此处省略...
php7-gd \
2、 搜索Nginx、PHP、PHP-FPM、Redis的软件内容
别忘了看一看软件在文件内的安装目录,以及一些配置文件的地址,覆盖默认配置的时候会用到。同时,里面包含一些软件所依赖的包,因为本次所选用的Alpine体积很小,如果缺少了依赖包导致无法安装的话,可以安装一下
三、本地测试及云发布
(一)本地测试
1、拉取待迁移项目源码,准备配置文件
本次需要两个项目的源码,一个是微信云托管官方的ThinkPHP+Nginx示例项目,另一个是电商项目-CRMEB (gitee.com)的源码。
需要自己的配置文件有:redis.conf,百度一下redis-5.0的配置文件即可,其余的话放在官方项目里面的conf目录里。因为篇幅原因,源码会放在附录的仓库里。然后导入一下项目并打开Dockerfile
2、制作Dockerfile及启动脚本
(1)添加redis.conf到/conf
、增加nginx反向代理规则
该步主要是为了让redis-server以守护模式去运行,配置文件在dockerfile中被指定去覆盖掉redis原有的配置
依照商城要求,在/conf/nginx.conf
中加入反向代理的配置,主要是为了即时通讯模块
location /notice {
proxy_pass http://127.0.0.1:20002/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
#提示:v4.3.0 以前版本,可不用配置一下代码
location /msg {
proxy_pass http://127.0.0.1:20003/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
(2)Dockerfile制作
- 更改基础镜像
alpine
至3.10
版本 - 在php7插件添加的地方,补充了待移植项目特定的一些依赖
- (可选)添加redis
- 配置redis的文件覆盖
- 按照商城的要求更改特定目录的权限
# 为了兼容php7.3,alpine更改为3.10
FROM alpine:3.10
# 安装依赖包,如需其他依赖包,请到alpine依赖包管理(https://pkgs.alpinelinux.org/packages?name=php7**&branch=v3.10)查找。
RUN apk add --update --no-cache \
nginx \
# php及其插件
php7 \
php7-fpm \
php7-json \
php7-ctype \
php7-exif \
php7-pdo \
php7-pdo_mysql\
# =======商城所需依赖=========
php7-pcntl\
php7-posix\
php7-mysqli \
php7-pecl-redis\
php7-fileinfo \
php7-curl \
php7-bcmath \
php7-gd \
# =======END==========
# ====(可选)Redis====
redis \
# =======END==========
# 结束后清空缓存
&& rm -f /var/cache/apk/*
# 设定工作目录
WORKDIR /app
# 将当前目录下所有文件拷贝到/app
COPY . /app
# 替换nginx、fpm、php配置
RUN cp /app/conf/nginx.conf /etc/nginx/conf.d/default.conf \
&& cp /app/conf/fpm.conf /etc/php7/php-fpm.d/www.conf \
&& cp /app/conf/php.ini /etc/php7/php.ini \
# =======redis配置覆盖==========
&& cp /app/conf/redis.conf /etc/redis.conf \
# =======END==========
&& mkdir -p /run/nginx \
&& chmod -R 777 /app/runtime \
# =======商城要求的特定目录权限=======
&& chmod -R 777 /app/public \
&& chmod -R 777 /app/ \
# =======END==========
&& mv /usr/sbin/php-fpm7 /usr/sbin/php-fpm
# 暴露端口
EXPOSE 80
# 容器启动执行脚本
CMD ["/bin/sh", "/app/run.sh"]
然后在同目录下新增.dockerignore
文件,用于忽略无需构建的东西
.git .dockerignore Dockerfile* composer* container.config.json LICENSE README.md
(3)启动脚本run.sh制作
也就是把刚刚我们在找出来的脚本粘贴进去即可
#!/bin/sh
# 后台启动
php-fpm -D
# 关闭后台启动,hold住进程
nginx -g 'daemon off;'
#Think Workerman
/usr/bin/php /app/think workerman start --d
/usr/bin/php /app/think timer start --d
EXEC=/usr/bin/redis-server
CLIEXEC=/usr/bin/redis-cli
/usr/bin/redis-server /etc/redis.conf
3、(可选)composer依赖处理
去找个composer.phar
放在根目录,然后更新一下即可,然后可以看到/vendor
里面有新装的包
php composer.phar update
4、构建镜像
首先请确保你的开发环境有Docker
在根目录上,使用命令行运行
docker build -t crmeb-on-wxcloud:1.0 .
大概一分钟后,构建完成,跑一下
docker run -p 80:80 -d crmeb-on-wxcloud:1.0
全绿!过关
5、(额外)如果是第一次创建,可以在微信云托管连接控制台,然后把示例数据创建在云数据库上
可以看到,数据库连接成功,如果不成功,检查一下数据库外网是否放开,是否为非Root账号。
(二)云发布
1、发布前的测试
成功创建演示数据后,我们需要在上线前清空/public/install
目录,最后在目录 建立install.lock
,并在根目录下创建.env
环境配置文件。
配置文件里面,把我们一些数据库连接写好,但这次数据库主机地址我们写内网的即可
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 10.0.224.16
HOSTPORT = 3306
USERNAME = crmeb
PASSWORD = xeWmJ466f3
DATABASE = crmeb
PREFIX = eb_
CHARSET = utf8
DEBUG = true
[LANG]
default_lang = zh-cn
[REDIS]
REDIS_HOSTNAME = 127.0.0.1
PORT = 6379
REDIS_PASSWORD =
SELECT = 0
[QUEUE]
QUEUE_NAME = 322f1860c16e7
然后再次重复镜像构建过程,确保能跑即可,然后准备发布!
2、上云托管!
这里是大伙各显神通的地方了
- 你可以在本地构建并发布镜像到镜像仓库
- 不在本地构建,通过Git仓库建立工作流或者直接压缩文件上传
直接上传
这里演示直接压缩文件上传
进入云托管控制台,点击左侧“服务管理-服务列表”,新建服务,打开公网访问,然后选择“版本列表-新建版本”,选择一个自己喜欢的方式,这里选择“上传代码包”
通过Git仓库构建流水线
第一次选择仓库时,可能需要授权,授权后返回即可
建议勾选发布策略中的通过webhook触发构建,这样每次Git推送到仓库的时候就会触发构建
发布版本
服务构建完成后,直接发布版本,全量发布
两端同时跑通,大功告成!
3、(非必要仅为拓展)本地云调试开放接口服务
在Vscode里安装两款插件,下面会从安装到配置再到使用进行介绍:
Docker:Docker插件
Weixin Cloudbase Docker Extension - Visual Studio Marketplace:微信云托管本地调试插件
配置微信云托管调试插件
打开设置,搜索"wxcloud"进入配置页面,按照上面的信息进行配置
前往微信云托管控制台打开及配置云调试
安装完后重启vscode,在左侧栏打开Docker
然后我们进入业务容器的命令行体验一下无需鉴权信息cloudbase_access_token
的请求!(这边偷懒,就从DockerDesktop进了敲指令也可)
开放接口调用成功!
这里如果调用失败,请返回上一步,检查控制台检查一下接口是否在云调用的白名单内
正在实践中
你好,请问一下,因为云托管中一个服务只允许暴露一个端口,那么基于workerman的即时通讯端口例如20002,20003该如何打开呢。 难道仅通过Nginx做一下反向代理,通过域名基于80端口访问的话,nginx会自动转发到20002端口?