Ritardo in sospeso per connettere la richiesta proxy di Apache ad un'app node.js


12

Nel mio Ubuntu Server 10.04 sto eseguendo un'app node.js di esempio:

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

Ascolta semplicemente le richieste sulla porta 3000, accede alla console questa richiesta e invia al client un "Hello World" HTTP

L'obiettivo era far convivere questa app con Apache2. Quindi dopo alcune ricerche ho modificato il file predefinito ( / etc / apache2 / sites-available / default ) in questo modo:

<VirtualHost *:80>
        ServerAdmin haj@myserver.com
        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>

Pertanto, quando un utente effettua una chiamata a http://dev.myserver.com/nodeo http://dev.myserver.com/node/, Apache inoltra la richiesta, Node.js esegue l'elaborazione e l'utente torna a "Hello World".

C'è solo un problema: ci vuole del tempo per, chiamiamolo 'Carica' il proxy, in altre parole, ottengo questi messaggi nel 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

Inoltre, error.log mi 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)

Poi all'improvviso, funziona, proprio così. Nessun numero di richieste, nessun tempo, nessun modello.

In parole povere, il servizio deve "caricare" , questa è l'impressione che dà, ma vorrei sapere se esiste un modo per ridurre al minimo questo ritardo. O preferirei sapere cosa c'è che non va nella configurazione sopra indicata.

Modifica 1 : dopo aver modificato LogLevel per eseguire il debug, durante uno di questi ritardi ottengo questo per richiesta:

[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

... e quando è di nuovo giusto:

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

Ai moderatori: non sono sicuro che si tratti di una domanda stackoverflow o di una domanda serverfault, quindi ho pubblicato entrambi i siti.
Herman Junge,

1
Il cross posting è una cattiva idea a meno che tu non ottenga una risposta, quindi assicurati di incrociare anche il collegamento tra di loro! Se pubblichi in un posto sbagliato, i moderatori aiuteranno a migrarlo nel posto giusto, ma ti preghiamo di non duplicare i nostri sforzi dall'inizio!
Caleb,

Siamo spiacenti @Caleb, errore per principianti. Non succederà più.
Herman Junge,

Nessun problema, questo è un impara come vai posto.
Caleb,

Risposte:


10

Passare LogLevela debugti darà maggiori informazioni in error.log. Per favore, fallo e pubblica i risultati. Senza queste informazioni, immagino che cambiare la tua linea ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0potrebbe aiutare. In generale, la documentazione mod_proxy di Apache ha maggiori dettagli sui parametri disponibili.


Grazie @justarobert, ora sto sperimentando un "Inverse Murphy", perché sto cercando di replicare l'errore e tutto va bene! Scommetto che in produzione avrò di nuovo questa situazione ... Non appena avrò i dati, li riempirò qui. Grazie ancora.
Herman Junge,

Quelle cifre! Assicurarsi di non utilizzare LogLevel debugin produzione.
justarobert,

LOL. Ho appena modificato la mia domanda.
Herman Junge,

1
I log di Apache indicano che il processo node.js non risponde alle richieste proxy durante i ritardi. Ricevi qualcosa dai registri node.js in quel momento? Puoi visitare il server node.js nel tuo browser direttamente quando Apache ti sta ritardando? Prendi in considerazione l'utilizzo ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, solo per rendere esplicito il timeout. Inoltre, consulta la discussione su news.ycombinator.com/item?id=2037328 per sapere perché potresti non voler mettere Apache davanti a node.js.
justarobert,

2

Scavare questo. Ho avuto questo problema su CentOS con abilitazione SELinux. Tutto quello che dovevo fare è consentire a httpd di stabilire connessioni di rete:

/usr/sbin/setsebool httpd_can_network_connect 1

(e riavvia httpd)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.