Atraso de Akward para conectar a solicitação de proxy do Apache a um aplicativo node.js

12

No meu Ubuntu Server 10.04, estou executando um exemplo de aplicativo 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);

Ele simplesmente escuta solicitações na porta 3000, efetua login no console e solicita ao cliente um HTTP "Hello World"

O objetivo era fazer com que esse aplicativo coexistisse com o Apache2. Então, depois de alguma pesquisa, editei o arquivo padrão ( / etc / apache2 / sites-available / default ) desta maneira:

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

Portanto, quando um usuário faz uma chamada http://dev.myserver.com/nodeou http://dev.myserver.com/node/, o Apache proxies a solicitação, o Node.js faz o processamento e o usuário recebe um "Olá, mundo".

Há apenas um problema: leva algum tempo para, vamos chamá-lo de 'Carregar' o Proxy, ou seja, recebo essas mensagens no navegador:

<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

Além disso, error.log me diz:

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

Então, de repente, Funciona, exatamente assim. Sem número de solicitações, sem tempo, sem padrão.

Para os leigos, o serviço precisa "carregar" . Essa é a impressão que dá, mas eu gostaria de saber se existe uma maneira de minimizar esse atraso. Ou prefiro saber o que há de errado com a configuração mencionada acima.

Editar 1 : Após modificar o LogLevel para depurar, durante um desses atrasos, recebo isso por solicitação:

[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 estiver certo novamente:

[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
fonte
Para os moderadores: não tenho certeza se é uma questão de stackoverflow ou uma questão de falha no servidor, por isso publiquei os dois sites.
Herman Junge
1
A postagem cruzada é uma péssima idéia, a menos que você não receba uma resposta, e também faça a ligação cruzada entre eles! Se você postar no lugar errado, os moderadores ajudarão a migrá-lo para o lugar certo, mas não duplique nossos esforços desde o início!
Calebe
Desculpe @Caleb, Erro do Iniciante. Não vai acontecer novamente.
Herman Junge
Não se preocupe, este é um aprendizado à medida que você vai para o local.
21711 Caleb

Respostas:

10

Alterar LogLevelpara debugfornecerá mais informações em error.log. Faça isso e publique os resultados. Sem essas informações, acho que alterar a linha do ProxyPass ProxyPass http://127.0.0.1:3000/ retry=0pode ajudar. Em geral, a documentação do Apache mod_proxy possui mais detalhes sobre os parâmetros disponíveis para você.

justarobert
fonte
Obrigado @justarobert, agora estou experimentando um "Murphy inverso", porque estou tentando replicar o erro e tudo vai bem! Aposto que na produção terei essa situação novamente ... Assim que tiver os dados, vou preenchê-los aqui. Obrigado novamente.
Herman Junge
Que números! Certifique-se de não usar LogLevel debugna produção.
Justarobert 21/04
RI MUITO. Acabei de editar minha pergunta.
Herman Junge
1
Os logs do Apache indicam que o processo node.js não está respondendo às solicitações em proxy durante os atrasos. Você recebe alguma coisa dos logs do node.js. Você pode visitar o servidor node.j no seu navegador diretamente quando o Apache está atrasando? Considere usar ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10, apenas para tornar o tempo limite explícito. Além disso, consulte a discussão em news.ycombinator.com/item?id=2037328 para saber por que você não deseja colocar o Apache na frente do node.js.
Justarobert
2

Desenterrar isso. Eu tive esse problema no CentOS com o SELinux enable. Tudo o que eu precisava fazer era permitir que o httpd fizesse conexões de rede:

/usr/sbin/setsebool httpd_can_network_connect 1

(e reinicie o httpd)

Tomek Wałkuski
fonte