Help us understand the problem. What is going on with this article?

ubuntuとnodejsでリバースプロキシを作ってみる

まずプロキシサーバーって何?

  • 内部のネットワークとインターネットの間で動かす、通信経路のトンネルのようなもの

別に無くても外部との通信はできます。

プロキシサーバーは何が出来るの?

  • 経由する事により、プロキシサーバー側で通信内容のチェックが出来る
  • プロキシサーバーの設定で、閲覧してはいけないサイトや通信を指定出来る(ブラックリスト制)
  • プロキシサーバーの設定で、閲覧しても良い通信やサイトや通信を指定出来る(ホワイトリスト制)
  • プロキシサーバーは通信をキャッシュする事も出来るので、高速なアクセスをする事が出来る

企業や学校のプライベートネットワークから外部ネットワークに行くために、プロキシサーバーの経由を必須にする事で
全員の通信内容を確認したい、など
このサイトは見てはいけない、見て良い と行った制限をかける事が可能となります。
スクリーンショット 2018-07-05 22.12.25.png

ではリバースプロキシサーバーとは?

  • 外部から来たリクエストなどを内部で経由させるためのプロキシサーバ

難しい...

リバースプロキシサーバーは何が出来るの?

  • アクセスに使用したホスト名によって使用するWebサーバーを振り分ける事が出来ます。
  • 同一ホスト名でも複数のWebサーバーにリクエストを分ける事が可能(負荷分散)

LineBotのサーバーはコールバックURLのポート番号が443でなくてはならないため
2つ以上は立てられないと考えてました、が、
リバースプロキシを使う事により、複数のサーバーを立てる事が出来る様です。
スクリーンショット 2018-07-05 22.20.42.png
こんな事も出来ちゃうって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アドレスを調べます
$ ifconfig | grep "inet addr:"
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アドレスです

他のマシンからブラウザでアクセスしてみます。
スクリーンショット 2018-07-05 22.49.44.png
表示できました!
しかもURL見た目はリバースプロキシに接続しているだけにしか見えないんですね(そりゃそうか)

そのほかにも、このリバースプロキシをSSL化する事や、ホスト名毎に使用するWebサーバを変更(ルーティング)する事、
さらにwebsocketに対応する事も可能です。
気になる方は調べて見てください。


こちらで大変お世話になりました。

プロキシサーバーとは
https://www.idcf.jp/words/proxy-server.html

Node.jsのhttp-proxyでプロキシサーバーを作る
https://qiita.com/setouchi/items/75de9db509f20ecaf369

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした