Http: make ngx_http_init_listening a public api
0 at lvht.net
0 at lvht.net
Sat May 20 02:58:03 UTC 2017
> On 20 May 2017, at 01:56, Maxim Dounin <mdounin at mdounin.ru> wrote:
>
> Hello!
>
>> On Fri, May 19, 2017 at 03:04:43AM +0800, 0 at lvht.net wrote:
>>
>> Thank you for your reply.
>>
>> As a client oriented proxy server, nginx will boot several
>> worker process to listen on the same port. If a tcp connection
>> is initiated, this connection will be processed by one worker.
>> This model is simple yet efficient. However this model makes it
>> impossible to let nginx work as a standalone server of some
>> protocols, for example, websocket.
>>
>> Please let me assume it make sense to make nginx work as a
>> standalone websock server. The problem we will face is that we
>> cannot send message to client. Because when the client initial
>> tcp connection, the connection will be processed by one worker
>> uncertainly. If we want push message to one client, we must find
>> the worker processing this client connection.
>>
>> I have a simple idea. If we add an additional unique listen port
>> for each http server directive before worker process do the
>> event loop dynamically, we could use the added port to send
>> message to client. As the listen directive is processed in the
>> master process, it does make any help.
>>
>> Talk is cheap. I just make a prototype at
>> https://github.com/lvht/nginx-websocket-module
>>
>> This model makes nginx as a standalone websocket server, and
>> business logic free as soon as possible.
>>
>> The idea of adding unique listening port dynamically is a
>> practical solution for any protocol which need to send data to
>> message initially, websocket, sse, http poll, etc..
>>
>> It is also impossible to add new listening port to an http
>> server directive dynamically in the websocket model, but it will
>> be a huge burden to sync this logic to the http model. So I
>> propose nginx to open this api.
>
> Thank you for the detailed explanation.
>
> So, you are trying to introduce per-process listening sockets in
> order to be able to communicate with a particular worker process.
>
> This is highly unlikely to work properly without deep integration
> with nginx itself, and/or will be broken by trivial unrelated
> changes in nginx. So the answer is still negative.
>
> If you want to try to address the problem properly, consider the
> following approaches:
>
> - create listening sockets yourself, and handle connections in
> your module;
>
> - introduce per-process listining sockets in nginx core; likely
> there will many obscure problems though, including things like
> what to do on graceful shutdown;
>
> - use interprocess communication instead - for example, nginx has
> shared memory available to modules (there are also channels to
> pass messages between processes, but these are not currently
> available to modules).
>
> You may also want to look into Nchan module by Leo Ponomarev, it
> is expected to contain some solutions to the problems you are
> working on.
>
> --
> Maxim Dounin
> http://nginx.org/
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
More information about the nginx-devel
mailing list