In meinem Ubuntu Server 10.04 führe ich eine Beispiel-node.js-App aus:
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);
Es lauscht einfach den Anforderungen an Port 3000, meldet sich an der Konsole an und sendet dem Client ein HTTP "Hello World".
Das Ziel war es, diese App mit Apache2 zu koexistieren. Nach einigen Recherchen habe ich die Standarddatei ( / etc / apache2 / sites-available / default ) folgendermaßen bearbeitet :
<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>
Wenn ein Benutzer einen Anruf bei http://dev.myserver.com/node
oder tätigt http://dev.myserver.com/node/
, wird die Anfrage von Apache-Proxies beantwortet, Node.js führt die Verarbeitung durch und der Benutzer erhält ein "Hallo Welt" zurück.
Es gibt nur ein Problem: Es dauert eine Weile, bis der Proxy geladen wird. Mit anderen Worten, ich erhalte die folgenden Meldungen im Browser:
<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
Außerdem sagt error.log mir:
[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)
Dann plötzlich funktioniert es einfach so. Keine Anzahl von Anfragen, keine Zeit, überhaupt kein Muster.
In Laienbegriffen muss der Service „geladen“ werden. Das ist der Eindruck, den er vermittelt, aber ich möchte wissen, ob es eine Möglichkeit gibt, diese Verzögerung zu minimieren. Oder ich würde lieber wissen, was mit der oben angegebenen Konfiguration falsch ist.
Bearbeiten 1 : Nach dem Ändern von LogLevel zum Debuggen erhalte ich während einer dieser Verzögerungen Folgendes pro Anfrage:
[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
... und wenn es wieder stimmt:
[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)
quelle
Antworten:
Ändern
LogLevel
zudebug
finden Sie weitere Informationen in error.log geben. Bitte tun Sie dies und veröffentlichen Sie die Ergebnisse. Ohne diese InformationenProxyPass http://127.0.0.1:3000/ retry=0
könnte es hilfreich sein , die ProxyPass-Leitung zu ändern . Im Allgemeinen enthält die Dokumentation zu Apache mod_proxy weitere Details zu den Parametern, die Ihnen zur Verfügung stehen.quelle
LogLevel debug
in der Produktion zu verwenden.ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10
, nur um das Zeitlimit zu verdeutlichen. Lesen Sie auch die Diskussion unter news.ycombinator.com/item?id=2037328, warum Sie Apache möglicherweise nicht vor node.js setzen möchten.Das hier ausgraben. Ich hatte dieses Problem auf CentOS mit SELinux aktivieren. Ich musste lediglich zulassen, dass httpd Netzwerkverbindungen herstellt:
/usr/sbin/setsebool httpd_can_network_connect 1
(und httpd neu starten)
quelle