ローカル環境において、ドメイン名でWebアプリケーションに接続できる「nginx + Webアプリ」のDocker環境構築手順について紹介します。
なお、Docker ComposeでWebアプリケーションが起動できる前提とします。
今回は例としてhttp://web.local.example-dev.com
でWebアプリケーションに接続できるDocker環境を構築します。
目次
下準備
ローカル環境の/etc/hostsを編集する
localhost
は127.0.0.1
を指すホスト名です。
任意のドメインでローカル環境を参照するには/etc/hosts
で127.0.0.1
にドメインをマッピングします。
# 以下を追加する
127.0.0.1 web.local.example-dev.com
RailsでWebアプリを構築する場合: ホスト名によるアクセスをアプリケーション側で許可する
Rails 6以降1、DNSリバインディング攻撃からの保護のためデフォルトでは.localhost
、0.0.0.0
、::
からのアクセスのみ許可されています。
ですので、設定ファイルにconfig.hosts << "web.local.example-dev.com"
やconfig.hosts.clear
を追加してweb.local.example-dev.com
でコンテナにアクセスできるように設定する必要があります。
設定をしないと[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked host: web.local.example-dev.com
というエラーが発生します。
詳細解説はlocalhost以外のホスト名でローカル環境のRailsに接続する方法で紹介しています。
docker-compose.ymlにnginxコンテナを追加
docker-compose.yml
にnginxコンテナを追加します。
docker-compose.yml
version: '3'
services:
app:
ports:
- '3001:3000'
(略)
nginx:
image: nginx:1.21
ports:
- '80:80'
command: [nginx-debug, '-g', 'daemon off;']
depends_on:
- app
設定ファイルを追加する
nginxの設定ファイルは/etc/nginx/nginx.conf
です。
設定ファイルにはinclude /etc/nginx/conf.d/*.conf;
という記述があり、/etc/nginx/conf.d/
配下の.conf
という拡張子の設定が読み込まれます。
今回はnginxの/etc/nginx/conf.d/
ディレクトリとローカルディレクトリをバインドマウントさせて設定ファイルを配置します。
docker-compose.yml
version: '3'
services:
app:
(略)
nginx:
image: nginx:1.21
ports:
- '80:80'
command: [nginx-debug, '-g', 'daemon off;']
+ volumes:
+ - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
nginxの設定ファイルを編集
server_name
ディレクティブを利用するとserver
ブロックで処理するリクエストのドメインを指定できます。server_name
ディレクティブでは完全一致、ワイルドカード、正規表現が利用できます。2
リクエストのプロキシはproxy_pass
で行います。
80番ポートで受け取ったweb.local.example-dev.com
のリクエストをapp
コンテナの3000番ポートへプロキシする設定は以下の通りです。
nginx/conf.d/default.conf
server {
### 80番ポートをlisten
listen 80;
### 『web.local.example-dev.com』からのリクエストを処理する
server_name web.local.example-dev.com;
### "/"にアクセスがあったときの処理
location / {
### リクエストヘッダに$hostをセット
# $host: Hostリクエストヘッダがあればそのサーバ名、なければプライマリサーバ名(server_name)
proxy_set_header Host $host;
### appコンテナの3000ポートにリクエストを送る
proxy_pass http://app:3000;
}
}
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!