如何更新nginx模块运行时的内部状态?

让我们假设我想编写一个通过IP来阻止客户端的nginx模块。 为了做到这一点,在初始化阶段,我读取一个IP地址的文件,我必须阻止(黑名单),并将其存储在模块的上下文中。

现在我想更新黑名单而不重新启动nginx。 可能的解决scheme之一是在特定位置添加处理程序。 例如,如果uri“/block/1.2.3.4”请求,我的处理程序将IP地址1.2.3.4添加到黑名单。

但是,nginx将几个工作者作为分离的进程运行,因此只有一个特定的工作人员将被更新。

解决这些问题的常见模式是什么?

如果您能够将黑名单移到模块上下文以外的地方,可能会将系统文件,KV商店或SHM移动到允许每个进程与中央源黑名单对话的位置。 我相信shmat()和futex将会完成这项工作,而且开销将可以忽略不计。

但是nginx不需要重启(也不需要任何停机)来改变配置!

看到:

为了让nginx重新读取配置文件,HUP信号应该被发送到主进程。 主进程首先检查语法的有效性,然后尝试应用新的配置,即打开日志文件和新的侦听套接字。 如果失败,它将回滚更改并继续使用旧配置。 如果成功,则启动新的工作进程,并将消息发送给旧工作进程,请求他们正常关闭。 老工人进程关闭侦听套接字并继续为老客户服务。 在所有的客户端服务之后,旧的工作进程被关闭。

作为管理员,我的期望是,所有的模块实际上也会以这种方式进行控制。

(当然,如果您经常需要对配置进行大量更改,则不同的解决方案可能更合适)。


你给出了一个阻止IP访问的明确例子。 你确定你需要一个新的模块来完成任务吗? 看来以下标准指令的组合可能已经足够了: