Предположим, я хочу написать модуль nginx, который блокирует клиентов по IP. Для этого на этапе инициализации я прочитал файл с IP-адресами , который должен заблокировать (черный список) и сохранить его в контексте модуля.Как обновить внутреннее состояние исполняемого модуля модуля nginx?
Теперь я хочу обновить черный список без перезапуска nginx. Одним из возможных решений является добавление обработчика в определенное место. , например. если запрашивается uri "/block/1.2.3.4", мой обработчик добавляет ip адрес 1.2.3.4 в черный список.
Однако nginx запускает несколько рабочих как разделенные процессы, поэтому обновляется только один конкретный работник.
Что такое общий шаблон для решения таких проблем?
Можете ли вы переместить черный список за пределы контекста модуля? Возможно, к системному файлу, магазину KV или SHM? Это позволит каждому процессу разговаривать с черным списком центрального источника. – avip
Но тогда мне нужен механизм синхронизации, чтобы получить доступ к этой общей памяти. Это может замедлить работу всей системы. –
Да, но я верю, что 'shmat()' и futex выполнит эту работу, и накладные расходы будут незначительными. – avip