让我们假设我希望编写一个通过IP阻止客户端的nginx模块。 为此,在初始化阶段,我读取一个带有IP地址的文件 我必须阻止(黑名单)并将其存储在模块的上下文中。
现在我希望在不重启nginx的情况下更新黑名单。 可能的解决方案之一是在特定位置添加处理程序。 例如如果uri" /block/1.2.3.4"请求,我的处理程序将IP地址1.2.3.4添加到黑名单。
但是,nginx将多个worker作为独立进程运行,因此只更新一个特定的worker。
应对此类问题的常见模式是什么?
答案 0 :(得分:3)
但是nginx不需要重启(也没有任何停机时间)来改变配置!
请参阅:
为了让nginx重新读取配置文件,应该将HUP信号发送到主进程。主进程首先检查语法有效性,然后尝试应用新配置,即打开日志文件和新的侦听套接字。如果此操作失败,则会回滚更改并继续使用旧配置。如果成功,它将启动新的工作进程,并向旧工作进程发送消息,要求它们正常关闭。旧工作进程关闭侦听套接字并继续为旧客户端提供服务。在为所有客户端提供服务后,旧工作进程将被关闭。
作为管理员,我希望所有模块实际上也会以这种方式进行控制。
(当然,如果您经常需要对配置进行大量更改,则可能更合适一种不同的解决方案。)
您提供了阻止IP访问的明确示例。您确定需要一个新模块才能完成任务吗?似乎以下标准指令的组合可能就足够了:
答案 1 :(得分:0)
如果您能够将黑名单移到模块的上下文之外,可能移动到系统文件,KV商店或SHM,这将允许每个进程与中央源黑名单通信。我相信shmat()和futex将完成这项工作,而且开销可以忽略不计。