既然是容器,那么也可以跑数据库的吧?那只要再加上一个PHP,就可以跑 WordPress、Typecho之类的应用了!
在 Azure上,用 Container Apps也是可以做到serverless PHP应用的,具体来说就是:
一个pod里开两个容器(不太推荐这种方式),一个是php-apache,一个是MySQL,通过挂载 Azure Files作为volumes来做数据存储。
为什么想这么玩,是因为:
- 优化大陆访问,Azure的亚洲机房对大陆访客很友好,因此不能用 Cloudflare
- 不想自己管理SSL证书,因此不能用vm
- managed database太贵了用不起
- FrontDoor也太贵了,每个月要$35的保护费🥹
使用这种方案的好处是,在访问量不是很大的情况下,成本应该可以忽略不计,甚至可以在无访问时缩放到0副本,真正“无服务器” 😂
创建资源组
创建资源组,创建一个vnet,因为存储不想公开给所有人,也方便以后和其他虚拟机内网互通。
创建容器应用
创建的时候,Container Apps Environment 选择已有的虚拟网络
配置镜像,这个镜像是我自己构建的,基于 php:8.3-apache,支持MySQL、PostgreSQL、SQLite,添加了 mod_rewrite,足够给WordPress和Typecho用
创建存储
Primary Service选择 Azure Files
创建 File Shares
我创建了两个,一个是数据库的,一个是网站文件的
连接 volume到容器
在创建完存储后,去复制一下access key
在容器环境中添加 SMB
依次输入信息,这里没有补全,不要输入错了哦
在容器环境中创建完之后,就可以到容器应用中添加啦
这里需要注意,数据库的卷可能需要如下额外挂载参数
uid=999,gid=999,nobrl,mfsymlinks,cache=none
容器应用volume
编辑容器,添加volume就可以了
然后添加一个数据库的sidecar
如果需要配置环境变量,也可以一起配置了
最终结果是这样的两个容器,在一个pod里,我这种穷人自然只能选择最低配置啦
存储安全
默认存储是可以公网访问的(需要用户名密码),为了更安全,我们可以配置为只有某几个虚拟网络可以访问
配置应用
可能需要进入 console,执行一下创建数据库之类的操作,这点就自行发挥了。
最终结果
在不使用的时候,容器可以缩为0(可以配置为最低1副本)
在有请求的时候,真的能访问耶,而且还可以自动扩容!
总结
正常的应用不应该这样配置的,两个容器在同一个pod内耦合也是不理想的。
如果想要利用 Azure的优良线路,正常来说应该选择如下方法之一
- Azure VM,自己配置SSL证书,域名解析到这个IP,最经典的操作
- Azure FrontDoor + 任意VM,SSL证书可以由FrontDoor管理
- Azure应用网关 + 任意VM,解析域名到网关的IP,配置SSL证书,然后上传证书给应用网关
- Azure Load Balancer + 任意VM,证书需要在VM上配置好,因为LB是4层的
- Container Apps运行PHP,用托管数据库,Container Apps支持托管SSL
- Container Apps运行PHP,通过VM运行数据库,两者网络之间创建对等连接
- Static Web Apps,只能给静态站点用
- Web App + Database,完全托管,价格很感人
- Azure Kubernetes Service ,这个我可能不太懂,但是应该可行……
最后……
PHP用什么跑不好要用这个,真是只有真正的赛博精神病才能够想出来这种操作🤡