Vraag Akwardvertraging om het proxyverzoek van Apache aan te sluiten op een node.js-app


In mijn Ubuntu Server 10.04 voer ik een voorbeeld node.js-app uit:

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

Het luistert eenvoudig naar verzoeken op poort 3000, meldt zich aan bij de console en stuurt een HTTP naar de client "Hallo Wereld"

Het doel was om deze app naast Apache2 te laten bestaan. Dus na wat onderzoek heb ik het standaardbestand bewerkt (/ Etc / apache2 / sites-available / default) op deze manier:

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

Dus wanneer een gebruiker belt http://dev.myserver.com/node of http://dev.myserver.com/node/, Apache stemt het verzoek af, Node.js maakt de verwerking en de gebruiker krijgt een "Hallo Wereld" terug.

Er is slechts één probleem: het duurt even, laten we het de Proxy 'Laden' noemen, met andere woorden, ik krijg deze berichten in de 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

Trouwens, error.log vertelt me:

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

Dan plotseling, het werkt, net als dat. Geen aantal verzoeken, geen tijd, helemaal geen patroon.

In termen van leken, moet de service 'laden', Dat is de indruk die het geeft, maar ik zou graag willen weten of er een manier is om deze vertraging te minimaliseren. Of ik zou het liever weten Wat is verkeerd met de hierboven vermelde configuratie.

Bewerk 1: Na het aanpassen van LogLevel om te debuggen, krijg ik tijdens een van deze vertragingen dit per aanvraag:

[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

... en wanneer het weer goed is:

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

12
2018-04-21 05:33


oorsprong


Aan de moderators: ik weet niet zeker of dit een stackoverflow-vraag of een serverfault-vraag is, dus heb ik beide sites gepost. - Herman Junge
Crossposten is een slecht idee, tenzij je geen antwoord krijgt, zorg er dan voor dat je ook een kruislink tussen hen maakt! Als je op de verkeerde plek post, zullen de moderators je helpen om het naar de juiste plek te migreren, maar doe alsjeblieft niet gewoon onze inspanningen vanaf het begin! - Caleb
Sorry @ Caleb, Beginner's Mistake. Zal niet weer gebeuren. - Herman Junge
Geen zorgen, dit is een leer als je gaat plaatsen. - Caleb


antwoorden:


Veranderen LogLevel naar debug zal je meer informatie geven in error.log. Doe dit alsjeblieft en plaats de resultaten. Zonder die informatie, heb ik een schatting dat het veranderen van uw ProxyPass-regel in ProxyPass http://127.0.0.1:3000/ retry=0 kan helpen. Over het algemeen is de Apache mod_proxy documentatie heeft meer details over de parameters die voor u beschikbaar zijn.


10
2018-04-21 06:09



Bedankt @justarobert, nu ervaar ik een "Inverse Murphy", omdat ik de fout probeer te repliceren en alles goed gaat! Ik wed dat ik in productie deze situatie weer zal hebben ... Zodra ik de gegevens heb, ga ik deze hier invullen. Nogmaals bedankt. - Herman Junge
Dat komt! Zorg ervoor dat je het niet gebruikt LogLevel debug in de maak. - justarobert
LOL. Ik heb zojuist mijn vraag bewerkt. - Herman Junge
De Apache-logboeken geven aan dat uw proces node.js niet reageert op de proxyverzoeken tijdens de vertragingen. Krijgt u op dat moment iets van uw node.js-logboeken? Kun je de node.js-server in je browser direct bezoeken als Apache je vertraging geeft? Overweeg het gebruik van ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, alleen om de time-out expliciet te maken. Zie ook discussie op news.ycombinator.com/item?id=2037328 waarom zou je misschien niet willen dat Apache voor node.js. - justarobert


Dit opgraven. Ik had dit probleem met CentOS met SELinux inschakelen. Alles wat ik moest doen was httpd toestaan ​​om netwerkverbindingen te maken:

/usr/sbin/setsebool httpd_can_network_connect 1

(en herstart httpd)


2
2017-07-16 09:15