Node.jsとApacheを一つのサーバーで共存させるためには、apache側かNode側のいずれかでリバースプロキシを構築してやる必要がある。
今回はNode.jsのsocket.ioを用いたwebsocket通信を行いたかったので、評判の良いNodeのプラグイン「http-proxy」を導入してみた。
今回の想定はNodeのアプリケーションをポート3000番、
Apacheのアプリを9000番で動作させる想定。
まずはhttpd.confのリッスンポートとバーチャルホストのポートを80番以外に避難させる。
・/etc/httpd/conf/httpd.conf
NameVirtualHost *:9000 Listen 9000
そしてバーチャルホストの設定も変更。
<VirtualHost *:9000>
ServerName example.local
DocumentRoot /path/to/root/dir
RewriteEngine On
<Directory "/path/to/root/dir">
Options Indexes FollowSymlinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
次にNodeのサーバースクリプトを書く。
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxy();
var options = {
'hoge.local.lcl': 'http://localhost:9000',
'fuga.local.lcl': 'http://localhost:9000',
'piyo.local.lcl': 'http://localhost:9000',
'node.local.lcl': 'http://localhost:3000'
}
require('http').createServer(function(req, res) {
if (req.headers.host == 'nodechat.local.lcl') {
proxy.ws(req, socket, head, {
target: options[req.headers.host]
});
} else {
proxy.web(req, res, {
target: options[req.headers.host]
});
}
}).listen(80);
console.log('Proxy works.');
あとはこのスクリプトをnodeコマンドで起動すればOK。