Délai Akward pour connecter la demande de proxy d'Apache à une application node.js

12

Dans mon serveur Ubuntu 10.04, j'exécute un exemple d'application 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);

Il écoute simplement les requêtes sur le port 3000, connecte la console à cette requête et envoie au client un HTTP "Hello World"

L'objectif était de faire coexister cette application avec Apache2. Donc, après quelques recherches, j'ai modifié le fichier par défaut ( / etc / apache2 / sites-available / default ) de cette façon:

<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>

Ainsi, lorsqu'un utilisateur fait un appel à http://dev.myserver.com/nodeou http://dev.myserver.com/node/, Apache envoie la requête par procuration, Node.js effectue le traitement et l'utilisateur récupère un "Hello World".

Il n'y a qu'un seul problème: cela prend un certain temps pour, appelons-le «Charger» le proxy, en d'autres termes, je reçois ces messages dans le navigateur:

<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

En outre, error.log me dit:

[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)

Puis tout à coup, ça fonctionne, juste comme ça. Pas de nombre de demandes, pas de temps, pas de modèle du tout.

En termes simples, le service doit «charger» , c'est l'impression qu'il donne, mais j'aimerais savoir s'il existe un moyen de minimiser ce retard. Ou je préfère savoir quel est le problème avec la configuration indiquée ci-dessus.

Edit 1 : Après avoir modifié LogLevel pour déboguer, pendant l'un de ces retards, j'obtiens ceci par demande:

[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

... et quand il aura de nouveau raison:

[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
la source
Aux modérateurs: je ne sais pas s'il s'agit d'une question de stackoverflow ou d'une question de défaut de serveur, j'ai donc posté les deux sites.
Herman Junge
1
La publication croisée est une mauvaise idée à moins que vous n'obteniez pas de réponse, alors assurez-vous de faire le lien entre eux aussi! Si vous postez au mauvais endroit, les modérateurs vous aideront à le migrer au bon endroit, mais s'il vous plaît ne faites pas que dupliquer nos efforts dès le début!
Caleb
Désolé @Caleb, erreur du débutant. Cela n'arrivera plus.
Herman Junge
Pas de soucis, c'est un lieu d'apprentissage au fur et à mesure.
Caleb

Réponses:

10

Changer LogLevelpour debugvous donnera plus d'informations dans error.log. Veuillez le faire et publier les résultats. Sans ces informations, j'ai une supposition que changer votre ligne ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0pourrait aider. En général, la documentation Apache mod_proxy contient plus de détails sur les paramètres disponibles.

justarobert
la source
Merci @justarobert, maintenant je fais l'expérience d'un "Inverse Murphy", parce que j'essaie de reproduire l'erreur, et tout va bien! Je parie qu'en production j'aurai à nouveau cette situation ... Dès que j'ai les données, je vais les remplir ici. Merci encore.
Herman Junge
C'est des chiffres! Assurez-vous de ne pas l'utiliser LogLevel debugen production.
justarobert
LOL. Je viens de modifier ma question.
Herman Junge
1
Les journaux Apache indiquent que votre processus node.js ne répond pas aux requêtes mandatées pendant les retards. Obtenez-vous quelque chose de vos journaux node.js à ce moment-là? Pouvez-vous visiter le serveur node.js dans votre navigateur directement lorsque Apache vous donne un délai? Pensez à utiliser ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, juste pour rendre le délai d'attente explicite. Consultez également la discussion sur news.ycombinator.com/item?id=2037328 pour savoir pourquoi vous pouvez ne pas mettre Apache devant node.js.
justarobert
2

Déterrer cela. J'ai eu ce problème sur CentOS avec SELinux activé. Tout ce que je devais faire était d'autoriser httpd à établir des connexions réseau:

/usr/sbin/setsebool httpd_can_network_connect 1

(et redémarrez httpd)

Tomek Wałkuski
la source