nginxでリバースプロキシを使ってみる

リバースプロキシとは

クライアントからWEBサーバーへのリクエストを経由させるサーバーのことです。

クライアント -> WEBサーバー という状況を、クライアント -> リバースプロキシ -> WEBサーバー のようにします。

この冗長化により、

  • セキュリティの強化
  • 負荷分散
  • SSLの対応
  • キャッシュ

などが便利になります。

実際に使ってみる

言葉だけではわかりにくいので、実際にDockerを用いて実験してみます。

次のように、3つのファイルを作ります。

  • docker-compose.yml
  • app.js
  • nginx.conf

以下、それぞれ見ていきます。

app.js

const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello World!'));
app.listen(3000);

簡単なexpressアプリケーションです。

ポート3000にアクセスすると'Hello World!'を返します。

nginx.conf

user  nginx;
worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;

    server {
        listen       80;
        server_name  _;

        location / {
            proxy_pass http://app:3000;
        }
    }
}

nginxの設定ファイルです。

proxy_passの部分でリバースプロキシを設定しています。すべてのリクエストを http://app:3000 に転送しています。appというのはexpressのアプリケーションが動いているコンテナのホスト名です。(docker-compose.ymlで設定しています)

docker-compose.yml

version: '3'
services:
  app:
    image: node:11.1.0
    hostname: app
    volumes:
      - ./app.js:/src/app.js
    working_dir: /src
    command: sh -c "npm i express && node app.js"

  nginx:
    image: nginx:1.15.5
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    environment:
      - NGINX_PORT=80

dockerの設定ファイルです。

appというコンテナでexpressアプリケーションを実行し、nginxというコンテナでnginxサーバーを起動しています。volumesを用いて今回作成したファイルをマウントしています。

hostname: appという部分で、コンテナにappというホスト名を付与しています。これにより、nginxというコンテナからappというホスト名で該当コンテナにアクセスできるようになります。

確認

docker-compose upコマンドで、expressアプリケーション、nginxサーバーが起動します。

http://localhost/にアクセスすると、'Hello World!'と表示されるはずです。