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!'と表示されるはずです。