我运行了一个中型 Mailman 系统,该系统最近出现了一个问题,即任何通过审核的邮件都会消失,而不是被传递到邮件列表。这影响了我们的每一个邮件列表。
在单独的网络服务器上执行审核失败
Mailman 环境分为前端和后端两台服务器。后端服务器处理 Postfix 和 Mailman qrunners,而前端服务器托管 Apache 和 Mailman CGI 脚本以调节列表。两台服务器在它们之间共享一个 NFS 挂载,其中包括所有共享的 Mailman 数据。
所有正常的邮件流都正常工作,但是当列表版主登录到 Web 前端并批准邮件时,它会消失得无影无踪。
- Postfix smtpd 通过 SMTP 接收传入的消息,然后
- Postfix smtpd 将消息传递到
/usr/lib/mailman/mail/mailman
. - Mailman 将消息写入
vette
日志文件(后端服务器)标记为等待批准。 - 列表版主使用 CGI Web 界面将消息标记为已批准。
- Mailman 向日志文件(在前端服务器上)写入一个条目,
vette
表示已批准保留消息。
此时,与保留的消息相关的 .pck 文件消失了,但没有传递任何内容,也没有创建进一步的日志条目。
审核通过主 Mailman 服务器上的 Web 界面成功
虽然我们通常不会在后端服务器上运行 Mailman Web 界面(以减少攻击面),但我将它运行用于测试目的。当我们在后端服务器上使用 Mailman Web 界面时,消息会正常传递,我们会看到这些日志条目。
smtp
使用收件人数量和完成时间更新日志文件post
使用列表名称、消息 ID 和“成功”更新日志文件。
背景
将 Mailman 环境迁移到新服务器后,问题就开始了。它不是自己出现的,很可能是我们尚未发现的一些配置错误的结果。我们正在使用:
- 两台服务器上的 Scientific Linux 6.3
- 两台服务器上的 Python 2.6.6
- 从两台服务器上的操作系统包安装的 Mailman 2.1.12
- selinux 在后端服务器上处于 Permissive 模式
- selinux 在前端(Web)服务器上处于强制模式,但没有记录任何日志条目
type=AVC
。此外,使用setenforce 0
并不能解决问题。
我在 Mailman users list 上找到了一篇相关的帖子,但没有提供解决方案。
当为 Mailman 使用多个服务器时,每个服务器都需要访问共享存储上的队列目录。而已。
了解审核消息的去向
哪些数据需要共享?
如果您有一个单独的服务器来处理 Mailman Web 前端,我建议您这样做。
必须在共享存储上
queue_dir
,inqueue_dir
,outqueue_dir
,cmdqueue_dir
,bouncequeue_dir
,newsqueue_dir
,archqueue_dir
,shuntqueue_dir
,virginqueue_dir
,badqueue_dir
,retryqueue_dir
,maildir_dir
任何运行 Mailman 任务的服务器(包括前端 Web 服务器)都可以访问您的队列文件。DATA_DIR
,LIST_DATA_DIR
除了邮件队列,还需要共享所有的列表配置文件和持有的邮件文件。PUBLIC_ARCHIVE_FILE_DIR
,PRIVATE_ARCHIVE_FILE_DIR
如果您使用的是列表存档,那么您还需要共享存档目录。应该在共享存储上
LOCK_DIR
,PID_DIR
,PIDFILE
我不完全确定,但似乎锁和 pidfiles 应该位于共享存储上,这样如果 qrunner 服务器发生错误,很明显进程异常结束。SITE_PW_FILE
,LISTCREATOR_PW_FILE
您可能希望您的密码文件位于共享存储上,这样无论您在哪个服务器上,您都可以确保您的主列表密码有效。CONFIG_DIR
如果您使用MTA=Postfix
,Mailman 将自动在 CONFIG_DIR 中创建别名文件。由于任何带有 Mailman 的机器都可以用来创建或删除列表,因此每台机器也应该能够正确更新共享别名文件。(注意事项:有时您希望在每台机器上配置 Mailman 略有不同,这对于共享的 CONFIG_DIR 可能会很困难。)可能在共享存储上
LOG_DIR
根据您的偏好,您可以将这些目录保留在本地,也可以将它们放在共享存储中。我喜欢将所有日志放在一个正在备份的中央位置,以便在将进程迁移到新服务器后仍然可以使用旧日志。TEMPLATE_DIR
如果您完全自定义了 Mailman 模板(例如退回邮件),那么您可能也希望将这些模板放在共享存储中。SPAM_DIR
我不知道 SPAM_DIR 的实际用途是什么,但建议所有变量文件都在共享存储上,因此我将其包括在此处。仅本地存储
WRAPPER_DIR
,BIN_DIR
,SCRIPTS_DIR
,MESSAGES_DIR
将二进制文件和脚本保存在本地是一个非常好的主意,这样您就可以利用操作系统提供的软件包进行升级,而不必担心保持共享的二进制文件同步。Mailman 似乎非常注重在涉及共享存储的任何服务器上运行完全相同的版本。(2013-09-04 编辑)以下指导由 Mark Sapiro 在 Mailman-Users listserv 上提供。
(编辑于 2013-09-04)实际上配置目录应该共享而不是本地。
Mark Sapiro 于 2013 年 12 月 3 日在 Mailman-users 上发布:
此补丁修复了此特定问题:
(我在这里不包括补丁,因为格式会被破坏。)