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

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)

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.


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.