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

时间:2017-02-03 02:01:44

标签: c nginx

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

现在我希望在不重启nginx的情况下更新黑名单。 可能的解决方案之一是在特定位置添加处理程序。 例如如果uri" /block/1.2.3.4"请求,我的处理程序将IP地址1.2.3.4添加到黑名单。

但是,nginx将多个worker作为独立进程运行,因此只更新一个特定的worker。

应对此类问题的常见模式是什么?

2 个答案:

答案 0 :(得分:3)

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

请参阅:

  

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

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

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

您提供了阻止IP访问的明确示例。您确定需要一个新模块才能完成任务吗?似乎以下标准指令的组合可能就足够了:

答案 1 :(得分:0)

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