私のUbuntuサーバー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 [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>
したがって、ユーザーが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)
その後、突然、それはそのように機能します。リクエストの数、時間、パターンはまったくありません。
素人の言葉で言えば、サービスは 'load'でなければなりません、それはそれが与える印象ですが、最小化する方法があるかどうか知りたいですこの遅延。または、Whatが上記の設定に間違っていることを知りたいです。
編集1:デバッグするようにLogLevelを変更した後、これらの遅延の1つ中に、リクエストごとにこれを取得します。
[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)
LogLevel
をdebug
に変更すると、error.logに詳細情報が記録されます。そうして結果を投稿してください。その情報がなければ、ProxyPassの行をProxyPass http://127.0.0.1:3000/ retry=0
に変更すると効果があると思います。一般に、 Apache mod_proxyのドキュメント には、使用可能なパラメーターの詳細があります。
これを掘り下げる。 CentOSでSELinuxを有効にすると、この問題が発生しました。私がする必要があるのは、httpdにネットワーク接続を許可することだけです。
/usr/sbin/setsebool httpd_can_network_connect 1
(httpdを再起動します)