我运行一个中型 Mailman 系统,最近出现了一个问题,即通过审核的所有消息都会消失,而不是被发送到邮件列表。这影响了每一个我们的一个邮件列表。
在单独的网络服务器上执行审核时失败
Mailman 环境分为前端和后端两台服务器。后端服务器处理 Postfix 和 Mailman qrunners,而前端服务器托管 Apache 和 Mailman CGI 脚本以管理列表。两台服务器共享一个 NFS 安装,其中包含所有共享的 Mailman 数据。
所有正常的邮件流都正常工作,但是当列表管理员登录到 Web 前端并批准消息时,该消息就会消失得无影无踪。
- Postfix smtpd 通过 SMTP 接收传入消息,然后
- Postfix smtpd 将消息发送到
/usr/lib/mailman/mail/mailman
。 - Mailman 将写入
vette
日志文件(后端服务器)的标记标记为已保留待批准的消息。 - 列表管理员使用 CGI 网络界面将消息标记为已批准。
- Mailman 将一个条目写入
vette
日志文件(在前端服务器上)以表明保留的消息已获批准。
此时,与保留消息相关的 .pck 文件消失,但不会传送任何内容,也不会创建进一步的日志条目。
通过主 Mailman 服务器上的 Web 界面成功审核
虽然我们通常不会在后端服务器上运行 Mailman Web 界面(以减少攻击面),但我还是出于测试目的运行了它。当我们在后端服务器上使用 Mailman Web 界面时,消息会正常传递,我们会看到这些日志条目。
smtp
日志文件已更新收件人数量和完成时间post
日志文件已更新列表名称、消息 ID 和“成功”。
背景
问题始于将 Mailman 环境迁移到新服务器之后。它不是自己出现的,很可能是我们尚未发现的某些配置错误导致的。我们正在使用:
- 两台服务器上均安装 Scientific Linux 6.3
- 两台服务器上均安装有 Python 2.6.6
- 从两台服务器上的 OS 包中安装 Mailman 2.1.12
- 后端服务器上的 selinux 处于 Permissive 模式
type=AVC
前端 (Web) 服务器上的 selinux 处于强制模式,但没有记录任何日志条目。此外,使用setenforce 0
也无法解决问题。
我找到了一个Mailman 用户列表上的相关帖子,但没有提供解决方案。
答案1
当使用多台 Mailman 服务器时,每台服务器都需要能够访问共享存储上的队列目录。就是这样。
了解审核消息的去向
- 如果某条消息需要等待审核,则会将其移至 $DATA_DIR,并且消息 ID 会附加到 $LIST_DATA_DIR/listname/pending.pck。
- Mailman 网络界面在pending.pck中查找等待审核的消息。当审核员批准了被审核的消息后,该消息将被移至$INQUEUE_DIR文件夹。
哪些数据需要共享?
如果您有一个单独的服务器来处理 Mailman Web 前端,我建议您这样做。
必须位于共享存储中
queue_dir
,,,,,,,,,,,,,您的队列文件需要被运行Mailman任务inqueue_dir
的任何服务器访问,包括前端outqueue_dir
Web服务器。cmdqueue_dir
bouncequeue_dir
newsqueue_dir
archqueue_dir
shuntqueue_dir
virginqueue_dir
badqueue_dir
retryqueue_dir
maildir_dir
DATA_DIR
,LIST_DATA_DIR
除了邮件队列之外,还需要共享所有的列表配置文件和持有的消息文件。PUBLIC_ARCHIVE_FILE_DIR
,PRIVATE_ARCHIVE_FILE_DIR
如果您使用列表档案,那么您还需要共享档案目录。
应位于共享存储中
LOCK_DIR
,,PID_DIR
我PIDFILE
不完全确定,但似乎锁和 pidfile 应该位于共享存储上,这样如果 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 年 9 月 4 日编辑)以下指导由 Mark Sapiro 在 Mailman-Users 列表服务器上提供。
我的建议是,让标准 GNU Mailman 共享所有可变数据,即 var_prefix 中的所有内容,即所有目录 archives/、data/、lists/、locks/、logs/、qfiles/ 和 spam/,但是您有一个 Scientific Linux(Red Hat 衍生产品)软件包,因此请参阅常见问题解答http://wiki.list.org/x/KYCB了解这些如何映射到您的安装。
常见问题解答请访问http://wiki.list.org/x/wgB0解决了这个问题。可能需要添加一些内容。请查看所有链接。
(2013-09-04 编辑)实际上,配置目录应该共享而不是本地。
答案2
Mark Sapiro 在 2013 年 12 月 3 日于 Mailman-users 上发帖:
http://www.mail-archive.com/[电子邮件保护]/msg63365.html
“Mailman 2.1.12 与 Python 2.6+ 不兼容。这个问题已在 2.1.13 中修复。”
此补丁已修复此特定问题:
(我没有在这里包含补丁,因为格式会被破坏。)