Retraso de Akward para conectar la solicitud de proxy de Apache a una aplicación node.js

12

En mi Ubuntu Server 10.04 estoy ejecutando una aplicación de ejemplo node.js:

var http = require("http");

function onRequest(request, response) {

        console.log("Request received.");
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write("Hello World");
        response.end();

}

http.createServer(onRequest).listen(3000);

Simplemente escucha las solicitudes en el puerto 3000, inicia sesión en esta consola y envía al cliente un "Hola Mundo" HTTP

El objetivo era hacer que esta aplicación coexistiera con Apache2. Entonces, después de algunas investigaciones, edité el archivo predeterminado ( / etc / apache2 / sites-available / default ) de esta manera:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName dev.myserver.com

        <Location /node>

                ProxyPassReverse http://127.0.0.1:3000/
                ProxyPass http://127.0.0.1:3000/

        </Location>

        <Proxy>
                Allow from all
        </Proxy>

        DocumentRoot /home/haj/www/http_home

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /home/haj/www/http_home/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /home/haj/www/log/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /home/haj/www/log/access.log combined


</VirtualHost>

Así, cuando un usuario realiza una llamada a http://dev.myserver.com/nodeo http://dev.myserver.com/node/, Apache como proxy la solicitud, Node.js hace que el procesamiento y el usuario vuelve un "Hello World".

Solo hay un problema: lleva algún tiempo, llamémoslo 'Cargar' el Proxy, en otras palabras, recibo estos mensajes en el navegador:

<503 Service Temporarily Unavailable>

Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Apache/2.2.14 (Ubuntu) Server at dev.neosource.cl Port 80

Además, error.log me dice:

[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 01:02:10 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)

Entonces, de repente, funciona, así como así. Sin número de solicitudes, sin tiempo, sin patrón.

En términos simples, el servicio tiene que 'cargarse' . Esa es la impresión que da, pero me gustaría saber si hay una manera de minimizar este retraso. O preferiría saber qué está mal con la configuración mencionada anteriormente.

Edición 1 : después de modificar LogLevel para depurar, durante uno de estos retrasos obtengo esto por solicitud:

[Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0)
[Thu Apr 21 02:30:40 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/
[Thu Apr 21 02:30:40 2011] [debug] proxy_util.c(1937): proxy: HTTP: retrying the worker for (127.0.0.1)
[Thu Apr 21 02:30:40 2011] [error] proxy: HTTP: disabled connection for (127.0.0.1)
[Thu Apr 21 02:30:40 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 405 to 273 : URL /node

... y cuando vuelve a estar bien:

[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1494): [client 200.xxx.yyy.zzz] proxy: http: found worker http://127.0.0.1:3000/ for http://127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy.c(993): Running scheme http handler (attempt 0)
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1940): proxy: HTTP: serving URL http://127.0.0.1:3000/
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(1999): proxy: HTTP: has acquired connection for (127.0.0.1)
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2055): proxy: connecting http://127.0.0.1:3000/ to 127.0.0.1:3000
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2153): proxy: connected / to 127.0.0.1:3000
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2244): proxy: HTTP: backend socket is disconnected.
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2308): proxy: HTTP: fam 2 socket created to connect to 127.0.0.1
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2414): proxy: HTTP: connection complete to 127.0.0.1:3000 (127.0.0.1)
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1723): proxy: start body send
[Thu Apr 21 02:35:16 2011] [debug] mod_deflate.c(615): [client 200.xxx.yyy.zzz] Zlib: Compressed 11 to 13 : URL /node
[Thu Apr 21 02:35:16 2011] [debug] mod_proxy_http.c(1816): proxy: end body send
[Thu Apr 21 02:35:16 2011] [debug] proxy_util.c(2017): proxy: HTTP: has released connection for (127.0.0.1)
Herman Junge
fuente
Para los moderadores: no estoy seguro de si se trata de una pregunta de stackoverflow o una pregunta por defecto del servidor, así que publiqué ambos sitios.
Herman Junge
1
La publicación cruzada es una mala idea a menos que no obtenga una respuesta, ¡entonces asegúrese de hacer un enlace cruzado entre ellos también! Si publica en el lugar equivocado, los moderadores ayudarán a migrarlo al lugar correcto, ¡pero no duplique nuestros esfuerzos desde el principio!
Caleb
Lo siento @Caleb, error del principiante. No volverá a suceder.
Herman Junge
No se preocupe, este es un lugar para aprender a medida que avanza.
Caleb

Respuestas:

10

Cambiar LogLevela debugle dará más información en error.log. Hazlo y publica los resultados. Sin esa información, supongo que cambiar su línea ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0podría ayudar. En general, la documentación de Apache mod_proxy tiene más detalles sobre los parámetros disponibles para usted.

justarobert
fuente
Gracias @justarobert, ahora estoy experimentando un "Murphy inverso", porque estoy tratando de replicar el error, ¡y todo sale bien! Apuesto a que en producción volveré a tener esta situación ... Tan pronto como tenga los datos, los completaré aquí. Gracias de nuevo.
Herman Junge
¡Tiene sentido! Asegúrese de no usar LogLevel debugen la producción.
justarobert
Jajaja Acabo de editar mi pregunta.
Herman Junge
1
Los registros de Apache indican que su proceso node.js no responde a las solicitudes proxy durante los retrasos. ¿Obtiene algo de sus registros de node.js en ese momento? ¿Puede visitar el servidor node.js en su navegador directamente cuando Apache le está demorando? Considere usar ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, solo para hacer explícito el tiempo de espera. Además, vea la discusión en news.ycombinator.com/item?id=2037328 para saber por qué es posible que no desee poner Apache delante de node.js.
justarobert
2

Desenterrando esto. Tuve este problema en CentOS con SELinux habilitado. Todo lo que necesitaba hacer es permitir que httpd haga conexiones de red:

/usr/sbin/setsebool httpd_can_network_connect 1

(y reiniciar httpd)

Tomek Wałkuski
fuente