云托管体验——部署ThinkPHP商城后台到微信云托管
发布于 3 年前 作者 yan16 5287 次浏览 来自 分享

云托管体验——部署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制作
  • 更改基础镜像alpine3.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进了敲指令也可)

开放接口调用成功!
这里如果调用失败,请返回上一步,检查控制台检查一下接口是否在云调用的白名单内


1 回复
回到顶部