LoginSignup
1
4

More than 1 year has passed since last update.

同じコンテナ内に複数のサーバを立ち上げ、Reverse Proxyを使用してサブドメインでアクセスWEBサーバを変更

Last updated at Posted at 2021-08-13

■前提

  • 一つのコンテナに複数のサーバを立ち上げる
  • 各サーバは異なるポートで立ち上げる
    → コンテナ内からhttp://localhost:8000http://localhost:8001、、http://localhost:8002等のポートでアクセスが可能

■行いたいこと

  • それぞれ 80ポート でアクセスが行いたい
    ※外からは 80ポートでアクセスが来ますので、800Xポートへのアクセスは不要
  • サブドメインで各サービスにアクセスが行いたい
    → 外部から http://api.localhosthttp://www.localhost、、http://sub.localhostでアクセスが可能にする

■実現方法

リバースプロキシを使用すれば可能です

今回はnginxを使用します

app.Dockerfile

# 各番号ごとの説明は別途記載します

##### [1]
RUN apt-get install -y \
      sudo \
      nginx
##### [2]
RUN { \
        echo 'www-data ALL=(ALL:ALL) NOPASSWD:ALL'; \
    } > /etc/sudoers.d/www-data
##### [3]
RUN sed -i \
        -e 's/\(access_log .\+\);/log_format proxy_log '\''$remote_addr - $remote_user [$time_local] "$host" "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'\'';\n        \1 proxy_log;/' \
        -e 's|\(include .\+/sites-enabled/\)|#\1|' \
        /etc/nginx/nginx.conf
##### [4]
RUN { \
        echo 'proxy_redirect                      off;'; \
        echo 'proxy_set_header Host               $host;'; \
        echo 'proxy_set_header X-Real-IP          $remote_addr;'; \
        echo 'proxy_set_header X-Forwarded-Host   $host;'; \
        echo 'proxy_set_header X-Forwarded-Server $host;'; \
        echo 'proxy_set_header X-Forwarded-Proto  $scheme;'; \
        echo 'proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;'; \
    } > /etc/nginx/proxy_common
##### [5]
RUN { \
        echo 'server {'; \
        echo "  listen 80;"; \
        echo "  listen [::]:80;"; \
        echo '  server_name api.*;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8000;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
        echo 'server {'; \
        echo "  listen 80;"; \
        echo "  listen [::]:80;"; \
        echo '  server_name sub.*;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8001;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
        echo 'server {'; \
        echo "  listen 80 default_server;"; \
        echo "  listen [::]:80 default_server;"; \
        echo '  server_name _;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8002;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
    } > /etc/nginx/conf.d/proxy.conf
##### [6]
RUN { \
        echo '#!/bin/bash'; \
        echo '----- 複数のサーバを立ち上げ -----'; \
        echo 'sudo /etc/init.d/nginx start'; \
    } > /usr/local/bin/app.sh \
    && chmod 755 /usr/local/bin/app.sh

##### [7]
EXPOSE 80
ENTRYPOINT ["/usr/local/bin/app.sh"]

##### [8]
USER www-data

■各番号について

▼ [1]

app comment
nginx リバースプロキシとして使用
sudo root以外のユーザでコンテナを動かしますので、sudoでnginxを実行

▼ [2]

ユーザ「www-data」からnginxを実行するため
※環境に合わせてください

▼ [3]

access_logの置換はログ形式を変更しています。
デフォルトのログではどのサブドメインにアクセスされたログなのか判別が出来ません。
その為、$hostを追加で出力するようにしています。

sites-enabledの置換はデフォルトのWEBサーバの定義を使用しないようにしています。
今回はリバースプロキシとしてのみ使用しますので不要です。
※ コメント化しないと default_server を自身で設定できません

▼ [4]

proxy_commonはリバースプロキシの共通設定です。

▼ [5]

リバースプロキシの設定になります。

サーバ毎に「server」項目を追加します。
最後の「server」項目はデフォルトの設定となります。
※どこにもマッチしなかった場合の設定です。

serverの各種項目
項目 comment
listen 外からのアクセスは全て80ポートで受けますので、80 を設定しています
server_name ここで指定したサブドメインの設定になります。ワイルドカードを使用することによりドメインは不問としています
proxy_pass server_nameで一致したアクセスをどのサーバに渡すかの設定になります

▼ [6]

複数のサーバを起動する想定なので、エントリーポイントとして登録するshellになります。

▼ [7]

公開ポートとコンテナのエントリーポイントです。

▼ [8]

rootからwww-dataにユーザを変更しています。

1
4
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
1
4