ローカル環境で開発中の複数アプリサーバのドメインを統一する必要が出てきたので、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の流れ
- browserがリクエスト:
http://rinoguchi.io/hoge
- hostsが名前解決:
rinoguchi.io
->127.0.0.1
- dockerがポートバインド:
127.0.0.1:80
->NginxのDockerコンテナ:80
- nginxがプロキシ:
rinoguchi.io/hoge
->localhost:8080
- 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;
}
-
host.docker.internal
はDockerコンテナ内で使えるホストマシンのホスト名
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