Pregunta

Tengo Nginx como mi servidor web front-end escuchando en el puerto 80. Y ciertas solicitudes, he configurado nginx para revertir el proxy a un servidor web basado en mochiweb que he escrito, escuchando en el puerto 8000. Mi La configuración de nginx para esto se ve así:

location /mymochiserver {

            proxy_pass         http://127.0.0.1:8000;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
        }

Ahora, cuando accedo a la URL http: // localhost / mymochiserver no veo una respuesta en el navegador. El navegador solo dice "Esperando localhost". mymochiserver imprime algún rastro en la ventana de terminal desde la que se ejecuta, cada vez que un usuario se conecta a él, y en este momento, veo el rastro para cada ventana del navegador que abro para conectar esta URL. Pero no veo ninguno de los resultados que espero ver escritos en el navegador. PERO, cuando accedo directamente a la URL http://127.0.0.1:8000/ todo funciona bien, y Veo el resultado de mymochiserver en el navegador. Entonces funciona cuando se llama directamente. Pero cuando se usa proxy inverso a través de nginx, no parece estar funcionando. ¿Alguna idea de lo que podría estar mal?


Actualización: En mi aplicación Mochiweb tengo estas líneas de código:

Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
proc_lib:hibernate(?MODULE, feed, [Response, Userid, 1]);

Es básicamente una aplicación COMET donde los usuarios se conectarán al mymochiserver y el servidor enviará datos a todos los clientes conectados. Si no hay datos para enviar desde el servidor, hibernaré el proceso. Y luego, cuando me despierto, llamo a la función de alimentación para enviar los datos. Y si elimino el código de hibernación, todo funciona bien y veo la salida en el navegador. Pero si hiberno, no funciona. ¿Alguna idea de lo que está mal?

¿Fue útil?

Solución

¡Fijo!

Referencia: http://timanovsky.wordpress.com/2009/01/09/toward-a-million-user-long-poll-http-application-nginx-erlang-mochiweb/

Tuve que desactivar el búfer de proxy y aumentar proxy_read_timeout en nginx para que funcione. Entonces mi archivo de configuración se ve así ahora:

location /mymochiapp {
            proxy_pass         http://127.0.0.1:8000;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         3600;

            proxy_buffering off;
        }

¡Gracias thomas55 por señalar la respuesta!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top