nodeで80/443ポートでサブディレクトリ運用する方法¶
- Node.jsはデフォルトでは3000ポートのドキュメントルートで稼働します。
- Apacheで3000ポートを80/443でリバースプロキシするとドキュメントルート
 をnodeに取られてしまい、既存のサービスが運用できない場合があります。
- 対策として「http://example.com/node」などでサブディレクトリを切れば
 問題なくなるのですが、現時点でこれをやろうとするとjsコーディング内に
 サブディレクトリを含む仕組みを記載せねばならず、効率がよくありません。
 (体験上、ページ遷移すべてに関わるので、想像以上にめんどくさいです。)
- そこで、上記の問題をApache側になんとか巻き取らせつつ実現します。
前提条件¶
- OSはRHEL/CentOSの6系(運用機)を想定しています。
 (macやWindowsの開発機では結合試験レベルと見て不要と判断します。)
- Apacheが正常稼働しているものとします。
- nodeのhttp(https)サーバが3000ポートで動作しているものとします。
- Apache→nodeの順にリバースプロキシするため、仕組み上Socket.IOが
 使用できません。この場合、node→Apacheの順にリバースプロキシが必要
 なため、現時点では上手な解決策を見いだせていません。
- javascriptやcssにフルパスで記載している場合は適用されない場合があります。
 可能な限り相対パス、ドキュメントルート以降のパスで記載してください。
準備¶
- nodeのhttpサーバを起動しておきます。# node app.js 
- Apacheが稼働可能な状態であることとします。
- 「libxml2」をインストールします。# yum install libxml2 
- 「epel」リポジトリを追加します。# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm 
- 「epel」から不必要なパッケージを取得しないよう、デフォルト無効にします。
 「enable=1」を「enable=0」に書き換えます。vi /etc/yum.repos.d/epel.repo ------------------------------------------ [epel] name=Extra Packages for Enterprise Linux 6 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch failovermethod=priority #enabled=1 enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 
- epelを今回のみ手動で有効にし、「mod_proxy_html」をインストールします。
- なお、RHEL5.x系ではこのモジュール導入がめんどくさいので6.x系を推奨する。
 (そもそもnodeサーバがRHEL6.x系の導入に向いているので)# yum --enablerepo=epel install mod_proxy_html 
設定・動作¶
- Apacheの設定ファイルを変更します。ProxyPass /node http://localhost:3000 ProxyPassReverse /node http://localhost:3000 <Location /node> SetOutputFilter proxy-html ProxyHTMLURLMap / /node/ </Location>
- Apacheを起動または再起動します。# service httpd restart 
動作確認¶
- ブラウザでアクセスします。
 http://localhost/node
- 各リンクも含めて、3000ポート直接アクセス時と変わらないことを確認します。
¶
¶