まずプロキシサーバーって何?
- 内部のネットワークとインターネットの間で動かす、通信経路のトンネルのようなもの
別に無くても外部との通信はできます。
プロキシサーバーは何が出来るの?
- 経由する事により、プロキシサーバー側で通信内容のチェックが出来る
- プロキシサーバーの設定で、閲覧してはいけないサイトや通信を指定出来る(ブラックリスト制)
- プロキシサーバーの設定で、閲覧しても良い通信やサイトや通信を指定出来る(ホワイトリスト制)
- プロキシサーバーは通信をキャッシュする事も出来るので、高速なアクセスをする事が出来る
企業や学校のプライベートネットワークから外部ネットワークに行くために、プロキシサーバーの経由を必須にする事で
全員の通信内容を確認したい、など
このサイトは見てはいけない、見て良い と行った制限をかける事が可能となります。
ではリバースプロキシサーバーとは?
- 外部から来たリクエストなどを内部で経由させるためのプロキシサーバ
難しい...
リバースプロキシサーバーは何が出来るの?
- アクセスに使用したホスト名によって使用するWebサーバーを振り分ける事が出来ます。
- 同一ホスト名でも複数のWebサーバーにリクエストを分ける事が可能(負荷分散)
LineBotのサーバーはコールバックURLのポート番号が443でなくてはならないため
2つ以上は立てられないと考えてました、が、
リバースプロキシを使う事により、複数のサーバーを立てる事が出来る様です。
こんな事も出来ちゃうってnodejs便利すぎないですか
実際に立ててみる
筆者環境
- Ubuntu16.04(KAGOYA VPS KVMマシン)
- npm 5.6.0
- node 9.11.2
- express 4.16.0
手順
1.ポートを開ける
$ ufw enable
yと答える
プロキシサーバが使うポートを開ける
$ ufw allow 80
KAGOYAではない環境の場合、ルーターのポートマッピングや、セキュリティグループ等の設定が必要になります。
2.expressでwebサーバを作成する
expressがインストールされてない場合は以下コマンドを実行
$ npm install -g express-generator
expressでポート3000を使用するプロジェクトを作る
$ express port3000
$ cd port3000
必要なモジュール類をインストール
$ npm i
pm2でバックグラウンドで実行させる
$ pm2 start bin/www --name=3000
3000のプログラムが動いている事を確認する
$ pm2 list
┌──────┬──────┬────────┬───┬─────┬───────────┐
│ Name │ mode │ status │ ↺ │ cpu │ memory │
├──────┼──────┼────────┼───┼─────┼───────────┤
│ 3000 │ fork │ online │ 0 │ 0% │ 45.0 MB │
└──────┴──────┴────────┴───┴─────┴───────────┘
3.リバースプロキシサーバーを作成・起動する
$ mkdir reverse-proxy
$ cd reverse-proxy
$ npm install http-proxy
プログラムを書く(なんと2行です)
$ echo "var proxy = require('http-proxy');
proxy.createProxyServer({target: 'http://localhost:3000'}).listen(80)" > index.js
起動する
$ pm2 start index.js --name=proxy
起動している事を確認する
$ pm2 list
┌───────┬──────┬────────┬───┬─────┬───────────┐
│ Name │ mode │ status │ ↺ │ cpu │ memory │
├───────┼──────┼────────┼───┼─────┼───────────┤
│ 3000 │ fork │ online │ 0 │ 0% │ 45.0 MB │
│ proxy │ fork │ online │ 0 │ 0% │ 36.0 MB │
└───────┴──────┴────────┴───┴─────┴───────────┘
4.ブラウザでアクセスしてみる
サーバーを立てている環境で以下コマンドを実行しIPアドレスを調べます
inet addr:192.168.1.5
inet addr:127.0.0.1 Mask:255.0.0.0
ふーん、192.168.1.5なんですね
*127.0.0.1は ループバックアドレス といって自分自身を指すIPアドレスです
他のマシンからブラウザでアクセスしてみます。
表示できました!
しかもURL見た目はリバースプロキシに接続しているだけにしか見えないんですね(そりゃそうか)
そのほかにも、このリバースプロキシをSSL化する事や、ホスト名毎に使用するWebサーバを変更(ルーティング)する事、
さらにwebsocketに対応する事も可能です。
気になる方は調べて見てください。
こちらで大変お世話になりました。
プロキシサーバーとは
https://www.idcf.jp/words/proxy-server.html
Node.jsのhttp-proxyでプロキシサーバーを作る
https://qiita.com/setouchi/items/75de9db509f20ecaf369