ローカル環境で開発中の複数アプリサーバのドメインを統一する必要が出てきたので、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