プロジェクト

全般

プロフィール

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
    

動作確認

  • 各リンクも含めて、3000ポート直接アクセス時と変わらないことを確認します。

 

戻る