Plugins 我的nginx模块能否在主进程中建立连接?

Plugins 我的nginx模块能否在主进程中建立连接?,plugins,nginx,Plugins,Nginx,我正在编写一个nginx模块,它希望订阅一个zeromqpubsub套接字,并根据接收到的消息更新内存中的数据结构。为了节省带宽,只有一个进程可以进行订阅,并且数据结构应该在shm中,以便所有进程都可以使用它。对我来说,一个进程应该是主进程似乎是很自然的(因为如果它是工作者,代码必须以某种方式决定哪个工作者) 但是,当我从我的init\u主机或init\u模块回调调用ngx\u get\u connection时,它会出现故障,显然是由于ngx\u循环尚未初始化。谷歌搜索在主进程中工作的插件似乎

我正在编写一个nginx模块,它希望订阅一个zeromqpubsub套接字,并根据接收到的消息更新内存中的数据结构。为了节省带宽,只有一个进程可以进行订阅,并且数据结构应该在shm中,以便所有进程都可以使用它。对我来说,一个进程应该是主进程似乎是很自然的(因为如果它是工作者,代码必须以某种方式决定哪个工作者)

但是,当我从我的
init\u主机
init\u模块
回调调用
ngx\u get\u connection
时,它会出现故障,显然是由于
ngx\u循环
尚未初始化。谷歌搜索在主进程中工作的插件似乎相当悲观。有没有更好的方法来实现我的目标,即每个服务器与pubsub套接字建立一个单独的传出连接,而不管它有多少工作人员

下面是一个在辅助上下文中工作但不来自主上下文的代码示例:

void *zmq_context = zmq_ctx_new();
void *control_socket = zmq_socket(zmq_context, ZMQ_SUB);
int control_fd;
size_t fdsize = sizeof(int);
ngx_connection_t *control_connection;

zmq_connect(control_socket, "tcp://somewhere:1234");
zmq_setsockopt(control_socket, ZMQ_SUBSCRIBE, "", 0);
zmq_getsockopt(control_socket, ZMQ_FD, &control_fd, &fdsize);
control_connection = ngx_get_connection(control_fd, cycle->log);
control_connection->read->handler = my_read_handler;
control_connection->read->log = cycle->log;
ngx_add_event(control_connection->read, NGX_READ_EVENT, 0);
在其他地方

void my_read_handler (ngx_event_t *ev) {
    int events;
    size_t events_size = sizeof(events);

    zmq_getsockopt(control_socket, ZMQ_EVENTS, &events, &events_size);
    while (events & ZMQ_POLLIN) {
        /* ...
           read a message, do something with it
        ... */
        events = 0;
        zmq_getsockopt(control_socket, ZMQ_EVENTS, &events, &events_size);
    }
}
为了节省带宽,只有一个进程可以进行订阅,并且数据结构应该在shm中,以便所有进程都可以使用它。对我来说,一个进程应该是主进程似乎是很自然的(因为如果它是工作者,代码必须以某种方式决定哪个工作者)

正如我已经说过的,你所需要的就是拒绝你的自然想法,只使用一个工人流程来达到你的目的


哪个工人?好吧,让它成为第一个开始。

因此,您实际上想在nginx中引入潜在的安全漏洞。主进程通常在特权用户下工作,不应与外部服务通信。@VBart我接受任何让一个进程拥有套接字的选项。(此外,我不使用低端端口,可以轻松地以普通用户的身份运行nginx)。你“已经说过了”,是吗?我以前肯定没见过。无论如何,是否有合理的保证总是有索引为0的工作进程运行?您可以使用shm控制哪个工作进程将执行此任务,从而确保始终有一个工作进程。使用
ngx\u process\u slot==0
似乎可以正常工作,但您是否希望对某人如何使用shm进行选择不那么神秘?当工作进程启动时,它可能会得到一个锁,然后检查并在shm中设置特殊标志,以指示其他工作进程已经为该作业分配了一个进程。