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/node
ou 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)
la source
Réponses:
Changer
LogLevel
pourdebug
vous 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 ProxyPassProxyPass http://127.0.0.1:3000/ retry=0
pourrait aider. En général, la documentation Apache mod_proxy contient plus de détails sur les paramètres disponibles.la source
LogLevel debug
en production.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.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)
la source