ローカル環境で開発中の複数アプリサーバのドメインを統一する必要が出てきたので、Docker Composeを使ってNginxでリバースプロキシを立てることにした。

実現したいこと

  • http://rinoguchi.io/hoge --proxy--> http://localhost:8080
  • http://rinoguchi.io/fuga --proxy--> http://localhost:8081

モチベーション

Dockerで立ち上げた複数アプリサーバを、Docker Composeを使ってNginxでリバースプロキシする話は結構あるのだが、Dockerを使わず立ち上げたアプリサーバの話は発見できなかった。

個人的には、開発対象のアプリケーションはAutoReloadが効かなくなるのでDockerでは立ち上げない方が良いと考えている。なので、今回Dockerを使わずに立ち上げたアプリサーバを、Nginxでリバースプロキシする手順を記載したいと思う。

想定するRequestの流れ

  1. browserがリクエスト: http://rinoguchi.io/hoge
  2. hostsが名前解決: rinoguchi.io -> 127.0.0.1
  3. dockerがポートバインド: 127.0.0.1:80 -> NginxのDockerコンテナ:80
  4. nginxがプロキシ: rinoguchi.io/hoge -> localhost:8080
  5. applicationが応答: localhost:8080

設定

Hostsの設定

/etc/hostsにてrinoguchi.ioというhost名に対して、127.0.0.1を割り当てる

sudo vi /etc/hosts

+ 127.0.0.1    rinoguchi.io

Nginxのリバースプロキシ設定

default.confを作成する。これは本プロジェクト用のDockerイメージにコピーされる。

server {
    listen              80;
    server_name         rinoguchi.io;

    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    Host                $host;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Forwarded-Host    $host;
    proxy_set_header    X-Forwarded-Server  $host;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

    location /hoge/ {
        proxy_pass    http://host.docker.internal:8080/;
    }

    location /fuga/ {
        proxy_pass    http://host.docker.internal:8081/;
    }

    access_log /dev/stdout;
    error_log  /dev/stderr debug;
}

Dockerfileの作成

公式のNginxのDockerイメージを元に、本プロジェクト用のNginxのDockerイメージを作成する。

FROM nginx:latest
ADD default.conf /etc/nginx/conf.d

Docker Composeの設定

docker-compose.ymlを作成する。

version: '3'
services:
  mynginx:
    build: .
    ports:
      - "80:80"
  • 先ほど作成したdefault.confを設定ファイルとして追加
  • ホストマシンの80番ポートをコンテナの80番ポートにバインド

実行

以下のコマンドをスクリプトを実行し、Dockerイメージを作成して、Dockerコンテナを立ち上げる。
--buildオプションで毎回Dockerイメージを再作成するようにしてある。

docker-compose up --build

これにより、以下のようにプロキシされるようになり、ドメインをrinoguchi.ioに統合することができた。

  • http://rinoguchi.io/hoge => proxy => http://localhost:8080
  • http://rinoguchi.io/fuga => proxy => http://localhost:8081