弊社で運用している複数のWebサービスを、AWS EC2上の単一インスタンスで効率的に管理するため、nginx の map
ディレクティブ を活用してホスト名に応じたドキュメントルートを動的に割り当てる構成に移行しました。
これまでの構成では、www.hogehoge.com
という単一ドメイン内に複数サービスが混在しており、それぞれのアプリケーションを独立運用する際に設定変更やデプロイの影響範囲が広くなる課題がありました。
そこで、サービスごとにサブドメインを分離し、以下のように再構成しました。
piyo.hogehoge.com
:顧客向けサービスhuga.hogehoge.com
:内部向け管理ツールwww.hogehoge.com
:一時停止(誤アクセス防止のため)
また、DNSには ワイルドカード(*.hogehoge.com
)のAレコード を追加し、将来的なサブドメイン拡張にも対応可能な設計としています。
nginx設定例(virtual.conf
)
以下が、map
ディレクティブを利用した実際の virtual.conf
の例です。default
は存在しないホスト名を指定された場合に 404 Not Found を返すようにしています。
# /etc/nginx/conf.d/virtual.conf
# ホスト名に応じた root ディレクトリを map で設定
map $host $site_root {
default /var/www/default; # マッチしない場合は 404
piyo.hogehoge.com /var/www/piyo.hogehoge.com/public_html;
huga.hogehoge.com /var/www/huga.hogehoge.com/public_html;
}
# =========================================
# HTTP → HTTPS リダイレクト
# =========================================
server {
listen 80;
server_name *.hogehoge.com;
return 301 https://$host$request_uri;
}
# =========================================
# HTTPS サーバ
# =========================================
server {
listen 443 ssl;
server_name *.hogehoge.com;
ssl_certificate /etc/ssl/hogehoge.com/hogehoge.com.2025.cert;
ssl_certificate_key /etc/ssl/hogehoge.com/hogehoge.com.2025.key;
# mapに一致しないホスト名の場合、404を返す
if ($site_root = /var/www/default) {
return 404;
}
client_max_body_size 1G;
root $site_root;
# =========================================
# 通常のアクセス
# =========================================
location / {
try_files $uri /index.php?$query_string;
}
# =========================================
# PHP の処理
# =========================================
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
メリットと今後の展開
この構成により、
- サブドメイン追加が
map
に1行追記するだけで完結 - 誤ったホスト名アクセスは 404即時応答
- HTTPS強制・証明書管理の統一
といった利点を実現しました。
🔗 参考リンク: