nodejs-with-apache

    2.1.0 • Public • Published

    Contents / 目次

    For what / 何のために

    Coexistence of Node.js, Apache and other HTTPS server softwares on the same server port(443).

    Node.jsとApacheなどへのHTTPSリクエストを同じサーバのポートで受け付ける。共存させる。

    例えば、Node.jsとApacheを同じサーバで動かしたいとき。 https://node.example.com でNode.jsへ、 https://apache.exapmle.com でApacheへアクセスできるようにしたい。

    • HTTPSサーバならポート443をListenする。
    • 同じポートを複数のソフトウェアがListenするのは不可能。後からサーバソフトウェアを起動した方が、「ポート443をListenできません」のようなエラーになるはず。
    • https://apache.example.com:8443 のようにポートを明記すればアクセスできるが、格好悪い・不便である。

    このような問題を解決する。

    For example / 例

    Apache listen to 8443, Node.js listen to 8444, proxy-server.js listen to 443(default https port).

    Apacheは8443ポートを、Node.jsは8444ポートを、proxy-server.jsは443ポートをListenする。

    Users can access contents of https://node.domain.com:8444 on Node.js by https://node.domain.com via proxy-server.js.

    Apacheのhttps://apache.domain.com:8443で得られるコンテンツを、proxy-server.jsを通してhttps://apache.domain.comでアクセスできます。

    Users can access contents of https://apache.domain.com:8443 on Apache by https://apache.domain.com via proxy-server.js.

    Node.jsのhttps://node.domain.com:8444で得られるコンテンツを、proxy-server.jsを通してhttps://node.domain.comでアクセスできます。

    Ready and execute / 準備と実行

    準備から実行までは簡単です。 config.jsonファイルを編集、ApacheやNode.jsのListenポートを変更、そして実行するだけです。

    Edit config.json / config.jsonファイルの編集

    まず、config.jsonファイルを、config.sample2.jsonなどを参考にしながら作成します。

    • title: グループのタイトル 何でもよい / whatever
      • (ex. Apache Node.js Nginx SimpleHTTPServer)
    • port: このグループは何番ポートをListenしているか
      • (ex. 8443 8444 8080 80)
      • (443はproxy-server.jsが使用するため、"server"を"localhost"にする場合は設定してはいけません。)
    • host: このグループに所属するホスト名(FQDN ドメイン名)と、そのSSL(TLS)証明書へのパス
      • hostname: ホスト名(FQDN ドメイン名)
        • (ex. node.example.com apache.example.com mydomain.com)
      • key: 秘密鍵ファイル / private key file
      • cert: 公開鍵ファイル / certification file

    あとは、ApacheやNode.jsがListenするポートを変更すれば完了です。

    Change Apache port / Apacheのポート変更

    Ubuntuの場合、/etc/apache2/ports.confに記述されています。 ":443"と書かれた部分を":8443"などに変更するだけです。

    Change Node.js port / Node.jsのポート変更

    以下のようにconfig.jsonに記述したListenするポート番号を記述してください。 https.createServer(credential, () => {}).listen(8444)

    Run! / 実行!

    ビルドは必要ありません。

    実行にはsudoできる権限が必要です。これは、443ポートでListenしたり、サーバ証明書ファイルを開くために特権が必要だからです。

    foreverがインストールされていない場合は、インストールをおすすめします。

    # 便利な forever のインストール
    # foreverコマンドが使えるようになります
    sudo npm install forever -g
    

    以下にnpmを使う場合とgit cloneを使う場合の説明があります。

    using npm / npmを使う場合

    npm / yarnを使ってインストールすることができます

    mkdir proxy
    cd proxy
    npm install nodejs-with-proxy
    

    app.jsとconfig.jsonを作成してください。 app.jsは以下のように記述して使うことができます。

    const nwa = require('nodejs-with-apache')
    
    if (process.argv.length !== 5) {
      console.log('usage: sudo node app.js <config file: ./config.json>  <tls reject: "tlsreject" or whatever> <test mode: "test" or whatever>')
      return 
    }
    
    
    const config = require(process.argv[2])
    const tls_reject = process.argv[3] === 'tlsreject'? true: false
    const test_mode = process.argv[4] === 'test'? true: false
    
    nwa.start({
      config: config,
      tls_reject: tls_reject,
      test_mode: test_mode
    })
    

    app.jsとconfig.jsonが用意できたら、次のコマンドで実行できます。

    sudo node app.js ./config.json tlsreject test
    # foreverを使う場合は以下のように実行できる
    sudo forever start app.js ./config.json tlsreject test
    

    Using GitHub / GitHubを使う場合

    以下のようにコマンドを実行することで実行できます。

    git clone https://github.com/pxdog/nodejs-with-apache
    cd nodejs-with-apache
    
    # test / テスト リクエストされたホスト名・パスと、アクセスするクライアントのIP Addressを表示 
    # 以下の二つのコマンドは同じ
    # sudo node proxy-server.js test
    npm test
    
    # execute / 実行
    # 以下の二つのコマンドは同じ
    # sudo forever start proxy-server.js
    npm start
    
    # stop / 停止
    # 以下の二つのコマンドは同じ
    # sudo forever stop proxy-server.js
    npm stop
    

    foreverをどうしても使いたくない場合は、nohupを使って以下のようにしても可。

    # execute / 実行
    # あらかじめsudoコマンドでパスワードを入力しておくこと!
    # sudo vi dummy.txt
    sudo nohup proxy-server.js > /dev/null  2>&1 &
    

    How it works / どのような仕組みか

    複数のサーバソフトウェア(Node.jsやApache)が同じポートをListenすることはできない。 そこで、ポート443はProxyサーバ(のようなもの)proxy-server.jsがアクセスを受け付け、FQDN(ホスト名・ドメイン名)によってリクエストを振り分ける。

    まず、ポート443でproxy-server.jsがアクセスを待つ。

    Node.js(node.example.com)をポート8443で受け付けられるようにし、Apache(apache.example.com)をポート8444で受け付けるようにする。

    node.example.comへのアクセスならポート8443へのリクエストを中継する。

    apache.example.comへのアクセスならポート8444へのリクエストを中継する。

    このように、*https://node.example.com:8443/*とアドレスバーに記述しなくても、*https://node.example.com/*と記述するだけでNode.jsサーバへアクセスすることができる。

    Warning / 注意

    プロキシサーバのプロトコルを実装しているわけではありません。

    サーバとブラウザの間にもう一つサーバを挟んでいるため、速度が遅くなると思います。

    また、環境によっては動かない場合もあるかもしれませんが、責任は取れません。

    Install

    npm i nodejs-with-apache

    DownloadsWeekly Downloads

    0

    Version

    2.1.0

    License

    MIT

    Unpacked Size

    18 kB

    Total Files

    6

    Last publish

    Collaborators

    • pxdog