Eine mögliche Verzögerung, um die Proxy-Anfrage von Apache mit einer node.js-App zu verbinden

12

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/nodeoder 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)
Herman Junge
quelle
An die Moderatoren: Ich bin nicht sicher, ob es sich um eine Stackoverflow-Frage oder eine Serverfehler-Frage handelt. Daher habe ich beide Websites gepostet.
Herman Junge
1
Crossposting ist eine schlechte Idee, es sei denn, Sie erhalten keine Antwort, und stellen Sie sicher, dass Sie auch eine Querverbindung zwischen ihnen herstellen! Wenn Sie an einer falschen Stelle posten, helfen Ihnen die Moderatoren bei der Migration an die richtige Stelle. Bitte duplizieren Sie unsere Bemühungen jedoch nicht von Anfang an!
Caleb
Sorry @Caleb, Anfängerfehler. Wird nicht wieder vorkommen.
Herman Junge
Keine Sorge, dies ist ein Lernvorgang, wenn Sie vor Ort sind.
Caleb

Antworten:

10

Ändern LogLevelzu debugfinden Sie weitere Informationen in error.log geben. Bitte tun Sie dies und veröffentlichen Sie die Ergebnisse. Ohne diese Informationen ProxyPass http://127.0.0.1:3000/ retry=0kö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.

justarobert
quelle
Danke @justarobert, jetzt erlebe ich einen "Inverse Murphy", weil ich versuche, den Fehler zu replizieren, und alles gut geht! Ich wette, dass ich diese Situation in der Produktion wieder haben werde ... Sobald ich die Daten habe, werde ich sie hier eintragen. Danke noch einmal.
Herman Junge
Diese Abbildungen! Achten Sie darauf, nicht LogLevel debugin der Produktion zu verwenden.
Justarobert
LOL. Ich habe gerade meine Frage bearbeitet.
Herman Junge
1
Die Apache-Protokolle zeigen an, dass Ihr node.js-Prozess während der Verzögerungen nicht auf die Proxy-Anforderungen reagiert. Erhalten Sie zu diesem Zeitpunkt etwas aus Ihren node.js-Protokollen? Können Sie den node.js-Server in Ihrem Browser direkt besuchen, wenn Apache Sie verzögert? Ziehen Sie in Betracht 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.
Justarobert
2

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)

Tomek Wałkuski
quelle