Opóźnienie Akward w celu połączenia żądania proxy Apache z aplikacją node.js

12

Na moim Ubuntu Server 10.04 korzystam z przykładowej aplikacji 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);

Po prostu nasłuchuje żądań na porcie 3000, zaloguj się w konsoli i wyślij do klienta HTTP „Hello World”

Celem było, aby ta aplikacja współistniała z Apache2. Więc po kilku badaniach zredagowałem domyślny plik ( / etc / apache2 / sites-available / default ) w ten sposób:

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

Tak więc, gdy użytkownik wykona połączenie do http://dev.myserver.com/nodelub http://dev.myserver.com/node/, Apache zastępuje żądanie, Node.js wykonuje przetwarzanie, a użytkownik otrzymuje „Hello World”.

Jest tylko jeden problem: zajmuje trochę czasu, nazwijmy go „Załaduj” proxy, innymi słowy, otrzymuję te wiadomości w przeglądarce:

<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

Poza tym error.log mówi mi:

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

A potem nagle działa, właśnie tak. Brak liczby żądań, brak czasu, brak wzorca.

Mówiąc w skrócie, usługa musi się „załadować” , takie wrażenie daje, ale chciałbym wiedzieć, czy istnieje sposób na zminimalizowanie tego opóźnienia. Albo wolałbym wiedzieć, co jest nie tak z powyższą konfiguracją.

Edycja 1 : Po zmodyfikowaniu LogLevel do debugowania, podczas jednego z tych opóźnień otrzymuję to na żądanie:

[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

... a kiedy znowu będzie dobrze:

[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
źródło
Do moderatorów: Nie jestem pewien, czy jest to pytanie o przepełnieniu stosu, czy pytanie o błąd serwera, więc opublikowałem obie strony.
Herman Junge
1
Cross posting jest złym pomysłem, chyba że nie otrzymasz odpowiedzi, więc pamiętaj, aby również połączyć je między nimi! Jeśli opublikujesz w niewłaściwym miejscu, moderatorzy pomogą przenieść go w odpowiednie miejsce, ale nie powielaj naszych wysiłków od samego początku!
Caleb
Przepraszamy @Caleb, błąd początkującego. To się więcej nie powtórzy.
Herman Junge
Nie martw się, jest to miejsce, w którym się uczysz.
Caleb

Odpowiedzi:

10

Zmiana LogLevelna debugdaje więcej informacji w error.log. Zrób to i opublikuj wyniki. Bez tych informacji domyślam się, że zmiana linii ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0może pomóc. Zasadniczo dokumentacja mod_proxy Apache zawiera więcej szczegółów na temat dostępnych parametrów.

justarobert
źródło
Dzięki @justarobert, teraz widzę „Inverse Murphy”, ponieważ próbuję powtórzyć błąd i wszystko idzie dobrze! Założę się, że w produkcji znów będę miał taką sytuację ... Jak tylko będę miał dane, wypełnię je tutaj. Dzięki jeszcze raz.
Herman Junge
To liczby! Pamiętaj, aby nie używać LogLevel debugw produkcji.
justarobert
LOL. Właśnie zredagowałem moje pytanie.
Herman Junge
1
Dzienniki Apache wskazują, że proces node.js nie odpowiada na żądania proxy podczas opóźnień. Czy otrzymujesz coś z dzienników node.js w tym czasie? Czy możesz odwiedzić serwer node.js w przeglądarce bezpośrednio, gdy Apache daje ci opóźnienie? Rozważ użycie ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, aby jasno określić limit czasu. Zobacz także dyskusję na news.ycombinator.com/item?id=2037328, aby dowiedzieć się, dlaczego możesz nie chcieć umieszczać Apache przed node.js.
justarobert
2

Wykopywanie tego. Miałem ten problem na CentOS z włączoną funkcją SELinux. Wszystko, co musiałem zrobić, to pozwolić httpd na nawiązywanie połączeń sieciowych:

/usr/sbin/setsebool httpd_can_network_connect 1

(i zrestartuj httpd)

Tomek Wałkuski
źródło