EZ Publish/EZ Publish 集群的使用
EZ Publish | EZ Publish安装与卸载 | EZ Publish的使用 | EZ Publish常见问题 | EZ Publish其他 |
集群概述[ ]
集群特性允许在多台WEB 服务器上运行同一个eZ Publish 站点。集群站点会有更好的性能也可以承受更多的访问量。
可以将所有内容相关的缓存,图片和二进制文件保存在数据库中。数据库事务被用来保证所有的集群节点使用相同的缓存文件并访问相同的图片和二进制文件。换言之,当内容被上传,变化会自动对所有节点生效。这个特性在3.10 中得到了很大的改善。
注意:当使用集群时,建议使用虚拟主机模式运行eZ Publish。
- 3.10 引入的变化
在3.10 版本以前,清除缓存会物理删除缓存文件。这一操作可能非常耗时。
从3.10 版本开始,系统会将缓存标记为不可用而不是从数据库或文件系统中物理删除。这可以标记每个特别缓存文件为过期或设置全局过期时间(在需要很多变化时,例如:当清除特定类型的所有缓存,后者常被使用)。全局过期时间是一个时间戳,它可以被用来作为系统中所有缓存的过期时间。如果全局过期时间被设置为一个特定日期,所有比这个日期旧的缓存文件都不会被使用。注意,在重建缓存的时候,系统会重用旧的/过期的文件内容。
如果要从数据库中物理删除缓存文件,需要添加"—purge"参数来执行"bin/php/ezcache.php"。下例演示了如何删除所有两天前的内容缓存。
php bin/php/ezcache.php --clear-id=content --purge --expiry='-2 days'
如果要了解更多信息,可以用"—help"参数:
php bin/php/ezcache.php --help
注意:3.10 不支持基于PostgreSQL 和Oracle 数据库的集群。代码针对使用InnoDB 引擎的MySQL 数据库做了性能优化。MySQL 的数据库连接数必须被增加30-50%。这样做的原因是新的集群代码在将内容写入数据库时会建立另外一个连接(这个连接用于检查得到写入锁后,文件是否被修改过)。如果持续连接被启用,集群将不会与普通数据库操作共用连接,所以之前的连接数将翻倍。
- 3.9 版本引入的修改
从3.9 版本开始,系统引入了一个附加的HTTP 头"Served-by"。这一特性用于测试和调试目的。当您需要在客户端检查内容来源于哪个服务器时,这一特性变得很有用。下例演示了服务器回应的片段。
... Last-Modified: Fri, 29 Jun 2007 09:35:54 GMT Served-by: 62.70.12.230 Content-Language: en-GB ...
- 集群如何工作
需要在不同服务器见保持同步的数据被保存在数据库中:
• 二进制文件
• 图片和图片别名
• 内容相关的缓存
其它文件在文件系统中保存,包括(但不限于):
• INI 文件
• 模板文件
• 编译的模板
• PHP 文件
• 日志文件
• 与内容无关的缓存
- 全局INI 缓存
- INI 缓存
- 代码页缓存
- 字符变换缓存
- 模板缓存
- 模板重设缓存
- 内容视图缓存
当eZ Publish 显示一个页面(一个内容节点)时,它会执行"content"模块的"view"视图并在pagelayout 中包含视图的输出。如果视图的输出被缓存,缓存文件会被读取并使用。否则,系统会从eZ Publish 数据库中提取内容,生成必要的模板,生成WEB 页面并在返回结果前将生成的XHTML 保存在文件系统中。
如前说述,这些文件现在可以(从3.8 版本开始)被保存在数据库中因而文件(以及改动)可以被简单迅速地在所有的服务器中共享。
- 图片和图片别名
上述解决方案也被用于图片和图片别名(图片变种)。但是,解决方案有一点复杂因为直到最近(3.8),图片都是被Apache 直接提供的。因为WEB 服务器不能直接与数据库沟通,图片需要由一个称为"index_image.php"的PHP 脚本来提供。这条规则应用于所有与内容有关的图片,但是不适用于界面中的图片。请注意,需要为Apache 添加新的rewrite 规则来要求Apache 在提供图片的时候使用"index_image.php"。
- 集群文件处理器
在3.8 中引入了一种新的文件管理器机制。它允许在数据库中对文件进行保存,提取,重命名,删除等操作。集群文件处理器在"kernel/classes/clusterfilehandlers"目录中。以下为系统内建的集群文件处理器:
• ezfs(eZFSFileHandler)
• ezdb(eZDBFileHandler)
eZFSFileHandler
这个处理器允许使用文件系统来处理文件。
- eZDBFileHandler
这个处理器允许使用数据库处理文件(在集群环境中,这通常包括图片,上传的二进制文件,内容有关的缓存等等)。它被划分为不同的后台实现以支持不同的数据库(注意:目前只有MySQL 被支持)。
- 自定义处理器
可以开发自己的处理器和/或后台实现来扩展系统。这可以通过扩展系统实现(不是通过修改eZ Publish内核文件)。
"file.ini"中的"[ClusteringSettings]"下的"[ExtensionDirectories[]"数组是eZ Publish 用来寻找附加集群文件处理器的位置。默认情况下,eZ Publish 会在扩展的"clusterfilehandlers"子目录内寻找。
例
如果有一个扩展"myExtension",它包括一个集群文件处理器"cfh"。应该在"file.ini.append.php"文件中的"[ClusteringSettings]"下添加如下配置:
FileHandler=cfh ExtensionDirectories[]=myExtension
这些配置会要求eZ Publish 使用位于"extension/myExtension/clusterfilehandlers/cfhfilehandler.php"的自定义集群文件处理器。
集群的配置[ ]
以下步骤演示了如何配置eZ Publish 在数据库中保存图片,二进制文件和内容相关的缓存。
- 1. 清除缓存(可选)
建议(但不是必须)在启动集群功能之前清除所有eZ Publish 缓存。步骤如下:
php bin/php/ezcache.php --clear-all -–purge
运行缓存脚本之后,确保所有缓存文件已经被清除(通常在"var/cache/"和"var/<站点入口名称>/cache/")。如果还有残留文件,手动删除它们。
- 2. 修改"file.ini"配置
在"file.ini"的重设文件中添加如下配置:
[ClusteringSettings] FileHandler=ezdb DBBackend=mysql DBHost=localhost DBPort=3306 DBSocket= DBName=name DBUser=user DBPassword=pass DBChunkSize=65535
用实际的数据库连接信息替换"localhost","name","user"和"pass"(大部分情况下,这些设置与"[DatabaseSettings]"下的配置相同)。确保"DBSocket"的配置正确(如果在"site.ini"的重设文件中"[DatabaseSettings]"下的配置为"Socket=disabled",则设置为空)。
在"FileHandler"配置中指定"ezdb",这会要求eZ Publish 使用指定的数据库保存图片,二进制文件和内容相关的缓存。"DBBackend"配置指定"ezdb"文件处理器应该使用何种数据库后端(目前,只支持"MySQL")。"DBChunkSize"指定了从数据库中提取文件时,内容块的大小(字节)。
- 3. 创建新脚本用来提供图片
所有的图片(除了界面图片)将会由PHP 脚本提供。Apache 会被要求用特定的PHP 脚本"index_cluster.php"来处理图片。这个脚本必须引入"index_image.php"以及一系列配置。这个技巧可以另图片的处理更快因为系统不需要从数据库读取配置。在eZ Publish 的安装目录中创建"index_cluster.php"并输入如下内容:
<?php define( 'STORAGE_BACKEND', 'mysql' ); define( 'STORAGE_HOST', 'localhost' ); define( 'STORAGE_PORT', 3306 ); define( 'STORAGE_SOCKET', '' ); define( 'STORAGE_USER', 'user' ); define( 'STORAGE_PASS', 'pass' ); define( 'STORAGE_DB', 'name' ); define( 'STORAGE_CHUNK_SIZE', 65535 ); include_once( 'index_image.php' ); ?>
确保数据库的配置与"file.ini.append.php"中的"[ClusterSettings]"配置相同。
- 4. 创建新的数据库表
需要在数据库中手动创建一些表。可以在"kernel/classes/clusterfilehandlers/dbbackends/mysql.php"中找到表结构。表结构的定义在文件开头的注释中。
- 5. 将文件导入数据库
需要将"var"目录中的文件复制到数据库。在"eZ Publish"的根目录中执行如下脚本(用实际的站点入口名替换"ezwebin_site"):
php bin/php/clusterize.php -s ezwebin_site
这个脚本会将"var"目录中的文件,图片,图片别名复制到数据库中。
- 6. 编译模板(可选)
因为所有缓存为空,需要重新编译模板。注意,这一步可以省略,而模板会在被请求时被编译。在eZ Publish 根目录中执行以下脚本:
php bin/php/eztc.php -s ezwebin_site
为每个站点入口执行这个脚本
- 7. 更新Apache 配置文件
Apache 需要知道在提供图片时应该使用哪个PHP 脚本。这个脚本只是简单地从数据库提取并提供图片。将以下规则添加到.htaccess 文件中其它规则之上:
Rewriterule ^/var/([^/]+/)?storage/images-versioned/.* /index_cluster.php [L] Rewriterule ^/var/([^/]+/)?storage/images/.* /index_cluster.php [L]
如果".htaccess"文件不存在,在Apache 配置文件中添加以上规则。
- 8. 重启Apache 并测试站点
重启Apache。重启Apache 之后,系统会以集群模式启动。确认站点正常工作,内容图片可以被显示且内容二进制文件可以被访问(在浏览器中登录到管理界面,试着点击不同链接)。
- 9. 从文件系统中删除导入的文件
如果站点正常工作,可以从文件系统中删除原始的内容图片和二进制文件(因为它们已经被成功导入数据库)。需要调查"var"目录(特别是"var/storage/"和"var/<name_of_siteaccess>/storage/"目录)。如果这些目录中有任何内容图片或二进制文件,可以手动删除它们。
撤销集群配置[ ]
总是可以将站点出集群模式切换回标准模式:在文件系统中保存图片,二进制文件和内容相关的缓存。以下步骤解释了如何切换。假设eZ Publish 站点现在使用MySQL 保存文件。
- 1. 清除缓存(可选)
建议(不是必须)在撤销集群之前清除缓存。
php bin/php/ezcache.php --clear-all --purge
- 2. 撤销图片和文件的集群
需要将图片,二进制文件,内容相关的缓存从数据库复制回文件系统。可以用"bin/php/clusterize.php-u"来实现。执行之前确保有足够的磁盘空间。
下例演示了如何运行这个脚本(用实际的站点入口替换"ezwebin_site")。
php bin/php/clusterize.php -u -s ezwebin_site
以上脚本将会遍历数据库中保存的文件并将它们复制到"var"下面正确的子目录中。
- 3. 修改"file.ini"配置
编辑"file.ini"的重设文件并注释以下内容:
[ClusteringSettings] #FileHandler=ezdb #DBBackend=mysql #DBHost=localhost #DBPort=3306 #DBSocket= #DBName=name #DBUser=user #DBPassword=pass #DBChunkSize=65535
注意,您也可以直接删除以上配置。
- 4. 禁用提供图片的脚本
重命名或删除"index_cluster.php"。
- 5. 修改Apache 配置
注释或删除以下Apache 配置:
Rewriterule ^/var/([^/]+/)?storage/images-versioned/.* /index_cluster.php [L] Rewriterule ^/var/([^/]+/)?storage/images/.* /index_cluster.php [L]
- 6. 重启Apache 并测试站点
重启Apache 服务器。重启之后,站点应该可以使用"var"目录下的图片,文件和内容相关的缓存。确保站点正常工作(在浏览器中登录管理界面,试着点击不同链接)。
- 7. 删除数据库中的集群表
如果站点正常工作,您可以从数据库中删除之前使用的图片,文件和内容缓存。
DROP TABLE ezdbfile; DROP TABLE ezdbfile_data;