2017年6月7日水曜日

Node.jsをNginxの裏に

やっとのこと動かせるようになったNode.jsウェブサーバ
大きな問題はApacheウェブサーバとの共存です。
先日のようにそれぞれ別のポート番号で運用するなら話は簡単ですが、
やっぱり双方でデフォルトのポート番号が使いたい。
すなわちhttpの80番とhttpsの443番です。
残念ながら通常のソケットについて、
1つのポート番号は1つのプロセスが占有してしまうのです。
もちろんサーバをもう一台用意するとか、IPアドレスをもう1つ使うとか、
お金で解決する手段もありますが、貧乏人の私にとっては夢の環境。
現状で何とかできるなら、それに越したことはありません。

最初に思いつくのはApacheで受けた特定のリクエストを
Node.js側に流すことですが、
可能なもののNode.jsに制限が出るみたいです。
詳しくは知りませんが。
で、最近一般的な手段は、近年幅を利かせているNginxウェブサーバを
リバースプロキシとして動作させ、
実際の処理はApacheやNode.jsに振る方法のようです。
とは言え動作中のApacheに対する変更が必要なことは
過去の経験から知っており、
そんなこともあって、Node.js自体これまで躊躇してきました。

ということで今回はNode.jsをNginxの裏で動かすようにしてみます。
ちなみにNode.jsは静的コンテンツの配信効率が悪いという話もあって、
Nginxをリバースプロキシにしておいて静的コンテンツはNginxに任せる
ケースが散見され、Nginx+Node.jsは相性がよさそうです。

初めに先日のNode.jsを変更します。
前回はhttpsのssl部分もNode.jsで実現しましたが、
Nginx+Node.jsではNode.jsの非ssl通信を
Nginx側でssl化するような構成にする必要があるようです。
ということで、ファイル"helloworld.js"を
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(8031,"127.0.0.1");
のようなより素の状態に戻し、
$ forever restart helloworld.js
でウェブサーバを再起動しておきます。

さて、Nginxのセットアップです。以下を実行します。
# apt-get update
# apt-get install nginx
設定ファイル"/etc/nginx/sites-available/default"を以下のようにします。
server {
        listen 8000 default_server;
        listen [::]:8000 default_server;
        server_name <ホスト名>;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                proxy_pass http://127.0.0.1:8031;
        }
}

server {
        listen 8001 default_server;
        listen [::]:8001 default_server;
        server_name <ホスト名>;

        ssl on;
        ssl_certificate cert.pem;
        ssl_certificate_key privkey.pem;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
                proxy_pass http://127.0.0.1:8031;
        }
}
なお前回"helloworld.js"と同じディレクトリに置いた
証明書情報の"cert.pem"と"privkey.pem"は
"/etc/nginx/"ディレクトリに置きます。
その後
# /etc/init.d/nginx start
でNginxを起動すれば完成です。
ウェブブラウザから"http://<ホスト名>:8000"、
または"https://<ホスト名>:8001"にアクセスすれば
Node.jsのコンテンツが開けます。

ApacheのNginx裏への移転と
ポート番号のウェブのデフォルトへの変更については
また後日ということで。

0 件のコメント:

コメントを投稿