纸壳CMS分布式部署集群解决方案
ZKEASOFT October 31, 2020
启用集群插件
纸壳CMS的集群插件默认是不启用的,在集群部署之前应先启用。找到集群插件ZKEACMS.Distribution
目录(开发环境:src/ZKEACMS.Distribution
,生产环境:wwwroot/Plugins/ZKEACMS.Distribution
)用记事本打开插件描述文件zkea.plugin
,将Enable
改为true
即可。
{
ID:"2995ECF6-E2C0-4DAD-97CB-D980EE75390B",
Name:"ZKEACMS.Distribution",
FileName:"ZKEACMS.Distribution.dll",
Enable:"true"
}
实现原理
纸壳CMS只需要简单的设置就可以支持集群分布式部署。实现原理是通过将DataProtection的密钥保存到统一的地方进行共享访问,这样就能在不同的机器进行相同的加密,解密操作,从而保持登录状态。
纸壳CMS的用户登录使用的是cookie认证,默认情况下,对同一台服务器是有效的,但对别的服务器是无效的,因为加密的Key不一样。所以集群部署的时候,DataProtection是必须要设置的,放在一个统一的地方管理。纸壳CMS启用集群功能后,会将Key保存到数据库的PersistKey
表中,从而保证所有结点都可以访问相同的Key。有关于了解更多DataProtection请参阅微软官方文档。
Microsoft doc:
- https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction
- https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers
限制与扩展
因为纸壳CMS是将Key保存到数据库中,因此要求所有结点都要访问相同的数据库,如果系统需要做分库处理,可以将Key保存到外部数据库中,如Redis。
只需要重新实现一个IPersistKeyService
即可,该接口很简单,负责Key的存取:
namespace ZKEACMS.Distribution.Service
{
public interface IPersistKeyService
{
List<PersistKey> GetPersistKeys();
void Save(PersistKey persistKey);
}
}
插件源代码:https://github.com/SeriaWei/ZKEACMS/tree/develop/src/ZKEACMS.Distribution