[node.js] Node.jsとApacheを同時に動かす

オランダ語話者ですか?フランダース地方にお住まいですか?Vlakbij.meにアクセスして、お近くの優良店とつながりましょう。

Apache経由でNode.jsサイトをホスティングする

最近、Node.jsサイトをApache経由でホスティングする方法を調べるのに少し時間を費やしたので、その設定方法について記事にまとめました。もちろん、このアプローチが理にかなっているのは、すでにApacheが動作しているサーバーがあり、そのサーバーへの影響や変更を最小限に抑えつつNode.jsサイトを追加したい場合のみです。もし現在Apacheを使っておらず、単にNode.jsサイトを公開したいだけであれば、Node.jsで直接ホスティングするか、Apacheよりも軽量なNginxをフロントに置く方が良いでしょう。とはいえ、Apacheを使って実現する方法は以下の通りです。

まず、システムの起動時にNode.jsプロセスを自動的に開始し、シャットダウン時に停止させる方法が必要です。これは動作しているサーバーの種類によって異なります。私の場合、Debianサーバーだったので、Nico Kaiser氏のsysv initスクリプトを採用しました。もう一つの一般的な選択肢として、Ubuntuであればプリインストールされているupstartユーティリティがあります。start|stop|restartスクリプトが用意できたら、Node.jsプロセスがダウンした場合に再起動できるよう監視ツールが必要です。簡単に使えるツールとしてmonitがあります。これもNico Kaiser氏がGithubでNode.js用の優れた設定スクリプト例を公開しています。

sysv initまたはupstartスクリプトとmonitを導入すれば、Node.jsプロセスをサーバー上で常駐させることができます。もちろん、通常Apacheはポート80でリッスンしているため、Node.jsはそれとは別のポートで接続を待ち受けるように設定しているはずです。あとは、ポート80に入ってくるNode.jsサイト宛のリクエストを、ローカルのNode.jsプロセスへプロキシするようにApacheを設定するだけです。最初にmod_proxymod_proxy_httpをインストールする必要があります。その後の設定は非常に簡単です。

< VirtualHost 109.74.199.47:80>
ServerAdmin davy.brion@thatextramile.be
ServerName thatextramile.be
ServerAlias www.thatextramile.be
ProxyRequests off
< Proxy *>
Order deny,allow
Allow from all
</ Proxy >
< Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</ Location >
</ VirtualHost >

以上です。http://thatextramile.be または http://www.thatextramile.be に来るすべてのリクエストは、Node.jsが待ち受けている http://localhost:3000 に転送されます。ProxyPassReverseは、すべてのHTTPレスポンスヘッダーに実際のURL(localhost)ではなくプロキシされたURLが含まれるようにするために必要な点に注意してください。

もしNode.jsが提供する生のパフォーマンス(スループット)を必要とする場合、この解決策は最適とは言えません。Apacheを介してくるすべてのリクエストは、Node.jsプロセスからレスポンスが返されるまでApacheのスレッドが待機/ブロックされることになるためです。これは基本的にPHPやRubyをApache経由でホスティングする場合と同じなので問題ではありませんが、Node.jsを使用する利点の一つが失われてしまいます。重ねて言いますが、このアプローチはすでにApacheを使って他のサイトをホスティングしており、サーバーへの影響を最小限に抑えてNode.jsサイトを追加したいという場合にのみ理にかなっています。

執筆:Davy Brion、公開日時:2012-01-15 15:23:09

参照元 : http://thatextramile.be/blog/2012/01/hosting-a-node-js-site-through-apache/

Apache内でプロキシを設定し、

該当するServerNameへのリクエストをすべて指定のポートに送信する。

AD