LoginSignup
0
0

dockerで多段リバースプロキシ

Last updated at Posted at 2024-01-28

はじめに

多段リパースプロキシの挙動を確かめたかったので、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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0