既然是容器,那么也可以跑数据库的吧?那只要再加上一个 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 用什么跑不好要用这个,真是只有真正的赛博精神病才能够想出来这种操作🤡