大きな問題は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 件のコメント:
コメントを投稿