Configurando Nginx/NChan

Configurando Nginx/NChan

En una aplicación móvil que estoy desarrollando, uso WebSockets para suscribirme/publicar una variedad de información diferente. En la mayoría de los casos, el websocket del lado de la aplicación es simplemente un oyente. Sin embargo, hay ocasiones en las que también publica un mensaje.

Del lado del servidor, estoy manejando esto usando una combinación de [NChan][1] trabajando sobre Nginx. Una de las características realmente interesantes de NChan es la capacidad de "multiplexar" un websocket, es decir, publicarlo/subir en múltiples canales. Al crear una aplicación móvil, esto contribuye en gran medida a mejorar el orden y la compatibilidad con la batería.

Como se explica en la [documentación de NChan][2] He configurado pubsubcanales multiplexados

location ~ /pubsub/(\w+)/(\w+)/(\w+)/(\w+)/(\w+)$ 
{
 nchan_pubsub;
 nchan_channel_id "$1" "$2" "$3" "$4" "$5" "control";
 nchan_publisher_upstream_request /alter;
}

La tercera línea anterior chan_publisher_upstream...reenvía publas solicitudes entrantes a otro servidor.

location = /alter 
{
 proxy_pass https://example.com;
 proxy_set_header X-Publisher-Type $nchan_publisher_type;
 proxy_set_header X-Prev-Message-Id $nchan_prev_message_id;
 proxy_set_header X-Channel-Id $nchan_channel_id;
 proxy_set_header X-Original-URI $request_uri;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
} 

En el otro servidor, configuré Nginx para ejecutar PHP index.phpen la carpeta raíz del servidor leyendo

<?php
 trigger_error(json_encode(getallheaders()));//a test to see that the proxy pass is actually 
 happening
 
 header("HTTP/1.1 304 Not Modified");
 //if successful should cause the incoming request to be published without changes
 
 //header("HTTP/1.1 204 No Content");
 //when enable will suppress the incoming request (optionally after doing some server-side
 //stuff with the incoming request data

 //header("HTTP/1.1 200 OK"); 
 //echo 'New Content!';
 //when enabled should replace the incoming requestt content with the new one 
 ?>

Hasta donde puedo decir, he seguido las instrucciones de NChan con bastante diligencia. Sin embargo, cuando intento utilizar esta configuración para publicar en el pubsubcanal ahora definido, la conexión del cliente se cierra inesperadamente. Para realizar esta prueba estoy usando JavaScript simple.

    var socket;

    function connectPubSub()
    {
     socket = new WebSocket("wss://app.server.url/pubsub/personal/cause/beacon/grid/chat");
     socket.onopen = whenOpen;
     socket.onmessage = whenMessage;
     socket.onclose = whenClose;
     socket.onerror = whenError;
    } 

    function whenOpen(e){console.log("[open] Connection established");}

    function whenMessage(event){console.log(`[message]:${event.data}`);}

    function whenClose(event) 
    {
     if (event.wasClean) 
      alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
      else console.log('[close] Connection died');
    }

    function whenError(error){console.log(`[error] ${error.message}`);}

    function sendMessage(msg){socket.send(msg);}

En este punto, cuando intento emitir lo siguiente

connectPubSub();
sendMessage('Hello world!');

Obtengo el resultado que se muestra a continuación

[open] Connection Established
Websocket connection to app.server.url failed:Close received after close

El evento de error es como se muestra a continuación.

bubbles: false
cancelBubble: false
cancelable: false
composed: false
currentTarget: WebSocket {url: "wss://app.server.url/pubsub/personal/cause/beacon/grid/chat", 
readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
defaultPrevented: false
eventPhase: 0
isTrusted: true
path: []
returnValue: true
srcElement: WebSocket {url: "wss://app.server.url/pubsub/personal/cause/beacon/grid/chat", 
readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
target: WebSocket {url: "wss://app.server.url/pubsub/personal/cause/beacon/grid/chat", 
readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
timeStamp: 83208.4250000189

Esto me tiene perplejo. Pensé que simplemente podría seguir los documentos de NChan y publicar mensajes en el pubsubcanal multiplexado, luego examinar el contenido del mensaje (JSON) en mi servidor proxy antes de decidir qué hacer.

  • Deje pasar el mensaje (emita un HTTP 304)
  • Tome medidas del lado del servidor y luego suprima el mensaje (emita un HTTP 204)
  • Modifique el mensaje y envíelo (emita un HTTP 200)

Mi conocimiento bastante vago de las directivas de configuración de Nginx probablemente me esté decepcionando. ¿Qué estoy haciendo mal?


Ahora he podido establecer lo que está pasando aquí. La raíz del problema aquí parece ser la

proxy_pass https://ejemplo.com;

directiva. Si lo cambio a

proxy_pass https://example.com/index.php;

las cosas funcionan como se esperaba. Sin embargo, todavía no me queda claro por qué podría estar sucediendo esto. La parte superior de mi archivo de configuración predeterminado de Nginx tiene las líneas

server 
{
 root /path/to/root;
 index index.php;

 server_name example.com;

Pensé que la tercera línea anterior index index.phpes prácticamente todo lo que necesito para decirle a Nginx que ejecute index.php en cualquier ubicación de carpeta/subcarpeta. ¿Claramente no es el caso? [1]:https://nchan.io [2]:https://nchan.io/#getting-started

información relacionada