Http: make ngx_http_init_listening a public api

Maxim Dounin mdounin at mdounin.ru
Fri May 19 17:55:54 UTC 2017


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/


More information about the nginx-devel mailing list