2013/01/22

さくらのVPSで Apache と node.js を共存させる

追記:

この方法だとWebSocketが使用できないよと教えていただきました。以下のサイト様では、WebSocketも使用できるようにしているようです。コメントをくれた通りすがりさん、ありがとうございました。

ApacheとNode.jsを共存させてWebSocketも通す [俺の備忘録]


node.js の入門をした。

それで、Apache をポート80で起動させつつ、node.js へもポート80でアクセスしたい。

http://xx.xx.xx.xx/nodejs/ にアクセスされたら、node.jsを動かしているhttp://localhost:1234/を表示させたい。

そこで Apache のリバースプロキシとよばれるものを使ってみた。

Apache に設定を追加

httpd.conf の最後に追加する。

<Location "/nodejs">
    ProxyPass http://localhost:1234
    ProxyPassReverse http://localhost:1234
</Location>

末尾のスラッシュに注意

ちなみに、うっかり"/nodejs/"にすると、http://xx.xx.xx.xx/nodejs でアクセスしたときにリバースプロクシが起動しない。

また、<Location "/nodejs">と書いておきながら、 ProxyPass または ProxyPassReverse でhttp://localhost:1234/と、末尾にスラッシュをつけて設定してしまうと、ProxyPassReverseによる再割り当てのときなどに意図と違う結果がでてしまう。

ProxyPass

これでリバースプロキシを設定する

ProxyPassReverse

これは、Apache がHTTPレスポンスヘッダのリダイレクト系(Location, Content-Location, URIヘッダ)をうまく再割り当てしてくれるものらしい。

たとえば http://xx.xx.xx.xx/nodejs で以下のような Location ヘッダによるリダイレクトをすると、

HTTP/1.1 302 Found
Location: http://localhost:1234/hogehoge/special.html

これを Apache が再割り当てしてくれる。

HTTP/1.1 302 Found
Location: http://xx.xx.xx.xx/nodejs/hogehoge.special.html

参考

node.js の超初心者コード

node.js 用のソースは入門用によくあるこういうもの。

test.js:

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('aloha\n');

}).listen(1234);

console.log('Server http://localhost:1234/ running...');

確認

サーバーを起動する。

$node test.js

ブラウザで http://xx.xx.xx.xx/nodejs を確認すると、alohaと表示された。

2 件のコメント:

  1. 今のところ、Apacheのリバースプロキシは、WebSocketに対応してないので、nodeを使う最も大きな動機であろうはずのWebSocketを利用したアプリが、これでは動かないです。
    現状、node-http-proxyを使うのが最も無難という状況。
    Apacheさっさと対応しろよと。
    By 通りすがり

    返信削除
  2. コメントありがとうございます。
    補足助かりました。

    返信削除