Apacheのプロキシリクエストをnode.jsアプリに接続するためのAkward遅延


12

Ubuntu Server 10.04では、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);

ポート3000でリクエストをリッスンし、このリクエストをコンソールにログインして、クライアントにHTTP 「Hello World」を送信します

目標は、このアプリをApache2と共存させることでした。そこで、いくつかの調査の後、デフォルトファイル(/ etc / apache2 / sites-available / default)を次のように編集しました。

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

そのため、ユーザーがhttp://dev.myserver.com/nodeまたはを呼び出すとhttp://dev.myserver.com/node/、Apacheがリクエストをプロキシし、Node.jsが処理を行い、ユーザーは「Hello World」を取得します。

問題が1つだけあります。プロキシを「ロード」と呼びましょう。つまり、ブラウザでこれらのメッセージを取得します。

<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

その上、error.logは私に告げます:

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

それから突然、それはちょうどそのように動作します。リクエストの数、時間、パターンはありません。

素人の言葉では、サービスは「ロード」する必要があります、それはそれが与える印象ですが、この遅延を最小限に抑える方法があるかどうか知りたいです。または私はむしろ何を知りたい、上記の構成のが問題なのたいです。

編集1:LogLevelをデバッグするように変更した後、これらの遅延のいずれかで、リクエストごとにこれを取得します。

[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

...そして再び正しいとき:

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

モデレーターへ:これがstackoverflow質問かserverfault質問かわからないので、両方のサイトに投稿しました。
ハーマンジャンジ

1
回答が得られない限り、クロス投稿は悪い考えです。そして、それらの間もクロスリンクしてください!間違った場所に投稿した場合は、モデレーターが適切な場所に移行するのに役立ちますが、最初から努力を複製しないでください!
カレブ

すみません、@ Caleb、初心者の間違い。二度と起こらない。
ハーマンジャンジ

心配する必要はありません、これはあなたが場所に行くにつれて学ぶものです。
カレブ

回答:


10

に変更LogLevelするdebugと、error.logに詳細情報が表示されます。そうして結果を投稿してください。その情報がなければ、ProxyPassの行を変更するとProxyPass http://127.0.0.1:3000/ retry=0役立つかもしれないと思います。一般に、Apache mod_proxyのドキュメントには、使用可能なパラメーターの詳細が記載されています。


@justarobertに感謝します。今、私は「逆マーフィー」を経験しています。エラーを再現しようとしているので、すべてがうまくいきます!本番環境では再びこの状況になります...データが得られたらすぐに、ここに記入します。再度、感謝します。
ハーマンジャンジ

やっぱりね!LogLevel debug本番環境では使用しないでください。
-justarobert

笑。質問を編集しました。
ハーマンジュンゲ

1
Apacheログは、遅延中にnode.jsプロセスがプロキシされたリクエストに応答しないことを示しています。その時点でnode.jsのログから何かを得ていますか?Apacheが遅延を与えているときに、ブラウザで直接node.jsサーバーにアクセスできますか?ProxyPass http://127.0.0.1:3000/ retry=0 timeout=10タイムアウトを明示的にするためだけに、の使用を検討してください。また、node.jsの前にApacheを配置しない理由については、news.ycombinator.com / item?id = 2037328の説明を参照してください。
-justarobert

2

これを掘り下げます。SELinuxを有効にしたCentOSでこの問題が発生しました。私がする必要があるのは、httpdにネットワーク接続を許可することだけです。

/usr/sbin/setsebool httpd_can_network_connect 1

(およびhttpdを再起動します)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.