开源实例之多项目部署方案
前言
目前部署的开源实例都是 LNMP 架构,在没有并发的情况下,不会随着项目数量增加而导致系统负载显著提高。但想要部署编译型(常驻内存)实例,几个项目就不够用了。
如果这个问题不解决,本系列大概就要降级为 “PHP 和 JS 开源实例系列”,有点违背初衷。所以我将所有实例重构成了容器实现,在上个周末完成了架构方案。
部署方案
关键思路就是容器部署项目实例,并且能够定期销毁、自动重建。主要用到了 Docker、PHP webman 和 Nginx。
Docker
使用 Docker 做容器化部署。通过 docker-compose 编排,一个项目整合成一组容器。比如 WordPress 实例,包含了 LNMP 容器组和自身的代码容器。这样做的好处是方便隔离和回收,同时一整个项目只需要暴露一个 WEB 端口。
关于 Docker 配置细节会单独写一篇文章介绍:开源实例之Docker。
webman
使用 webman 实现实例调度,调用 Docker 命令,完成销毁和重建。
webman 是 PHP 实现的高性能 HTTP 服务框架。关于 webman 会单独写一篇文章介绍:开源实例之webman。
Nginx
使用 Nginx 协助完成自动重建实例。即在实例未生成或已被销毁时(报 502),跳转至调度页。以 WordPress 项目为例:
server {
listen 443 ssl http2;
server_name wordpress.dujun.space;
error_page 502 = https://example.dujun.space/of/wordpress;
……
}
关于 Nginx 会单独写一篇文章介绍:开源实例之Nginx。
实例调度
部署这套方案后,实现了实例定期销毁和自动重建。
秒级重建
访问实例网站时,如果实例仍在运行则正常打开页面;如果实例未创建或已销毁,则跳转调度页,调用命令生成实例,再跳转回实例页。
定期销毁
超过一小时没有访问的实例会自动销毁;在实例存续期间有新访问的,过期时间顺延。
定期销毁的作用,一是回收资源,降低系统开销;二是解决脏数据问题,避免无聊人士发布不健康内容。
后记
使用容器技术后,理论上可以部署非常多的项目,除非多个实例存在并发。解决了这个问题,相信开源实例系列文章可以更快推进。