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ポート直接アクセス時と変わらないことを確認します。
¶
¶