はじめに
多段リパースプロキシの挙動を確かめたかったので、dockerでテスト環境をこさえてみました。
参考↓
構成
()内はDocker側のポート番号、コンテナ側はすべて80
client-> proxy1(80) => proxy2(81) => backend(82)
ディレクトリ構成
tree
multi_revproxy
├── backend
│ ├── conf
│ │ └── backend.conf
│ ├── html
│ │ └── index.html
│ └── log
├── proxy1
│ ├── conf
│ │ └── proxy1.conf
│ └── log
├── proxy2
│ ├── conf
│ │ └── proxy2.conf
│ └── log
└── compose.yaml
固定IPのdocker networkの作成
compose.yamlで特に指定しなくてもmulti_revproxy_default(親ディレクトリ名_default)という名前のネットワークがコンテナ作成と同時に作成される。しかし、IPの動きを見たいので、固定IPのdocker networkを作成しておく。
(デフォルトのネットワークだと毎回ネットワークアドレスが変わる)
--subnetオプションでサブネット、--gatewayオプションでゲートウェイのIPを指定できる。
$ docker network create --subnet 172.16.0.0/24 --gateway 172.16.0.1 multirevproxy-nw
inspectすればネットワークアドレスが固定されているのがわかる
$ docker network inspect multirevproxy-nw | grep -E "Subnet|Gateway"
"Subnet": "172.16.0.0/24",
"Gateway": "172.16.0.1"
compose.yaml
compose.yaml
services:
proxy1:
container_name: proxy1
ports:
- "80:80"
environment:
TZ: Asia/Tokyo
image: nginx:latest
volumes:
- ./proxy1/conf:/etc/nginx/conf.d
- ./proxy1/log:/var/log/nginx
networks:
multirevproxy-nw:
ipv4_address: 172.16.0.10
depends_on:
- proxy2
proxy2:
container_name: proxy2
ports:
- "81:80"
environment:
TZ: Asia/Tokyo
image: nginx:latest
volumes:
- ./proxy2/conf:/etc/nginx/conf.d
- ./proxy2/log:/var/log/nginx
networks:
multirevproxy-nw:
ipv4_address: 172.16.0.20
depends_on:
- backend
backend:
container_name: backend
ports:
- "82:80"
environment:
TZ: Asia/Tokyo
image: nginx:latest
volumes:
- ./backend/conf:/etc/nginx/conf.d
- ./backend/html:/usr/share/nginx/html
- ./backend/log:/var/log/nginx
networks:
multirevproxy-nw:
ipv4_address: 172.16.0.100
networks:
multirevproxy-nw:
external: true
各nginxのconf
とりあえずproxy_set_headerなど無しの状態
proxy1
proxy1.conf
server {
server_name _;
listen 80;
location / {
proxy_pass http://proxy2;
}
}
proxy2
proxy2.conf
server {
server_name _;
listen 80;
location / {
proxy_pass http://backend;
}
}
backend
backend.conf
server {
server_name _;
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
docker起動
$ docker compose up -d
Dockerゲートウェイと各コンテナのIPの確認
$ docker network inspect multirevproxy-nw | grep -E "Gateway|IPv4|Name"
Gateway : 172.16.0.1
proxy1 : 172.16.0.10/24
proxy2 : 172.16.0.20/24
backend : 172.16.0.100/24
アクセステスト
DockerホストであるMacからアクセス
$ curl localhost