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

C 如何更新nginx'的内部状态;模块运行时?,c,nginx,C,Nginx,假设我想编写一个nginx模块,通过IP阻止客户端。 为此,在初始化阶段,我读取了一个带有IP地址的文件 我必须阻止(黑名单)并将其存储在模块的上下文中 现在我希望在不重新启动nginx的情况下更新黑名单。 可能的解决方案之一是在特定位置添加处理程序。 e、 g.如果请求uri“/block/1.2.3.4”,我的处理程序会将ip地址1.2.3.4添加到黑名单中 但是,nginx将多个工作进程作为单独的进程运行,因此只更新一个特定的工作进程 处理这些问题的共同模式是什么 但是nginx不需要重新

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

现在我希望在不重新启动nginx的情况下更新黑名单。 可能的解决方案之一是在特定位置添加处理程序。 e、 g.如果请求uri“/block/1.2.3.4”,我的处理程序会将ip地址1.2.3.4添加到黑名单中

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


处理这些问题的共同模式是什么

但是nginx不需要重新启动(也不需要任何停机)来更改配置

见:

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

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

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


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

  • &&
  • &&


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

您是否能够将黑名单移到模块上下文之外?可能是系统文件、KV存储或SHM?这将允许每个进程与一个中央源黑名单对话。但我也需要同步机制来访问这个共享内存。这可能会降低所有系统的速度。是的,但我相信
shmat()
和futex会完成这项工作,开销可以忽略不计。如果您对如何准确更新共享数据结构非常谨慎,则只有更新过程需要锁定数据(以防止并发更新)。您只需确保从纯只读访问数据的角度来看,数据结构始终有效。例如,如果您使用一个固定大小的哈希表,这并不难做到。您可以利用某些操作是原子操作这一事实(例如,在许多体系结构上,只要指针在内存中正确对齐,就可以更新单个指针)。您可以在nginx reload上设置一个钩子,然后重新加载配置文件吗?