6.

【nginx】サブドメインの設定方法

編集
この記事の要点
  • サブドメイン (sub.example.com) の設定はDNS + Web サーバの両方で行う
  • DNS: A レコード or CNAME レコードを登録
  • Web サーバ (nginx / Apache): サブドメイン用 virtual host を追加
  • SSL: certbot でワイルドカード or 個別証明書取得
  • Laravel / Rails 等のアプリでもサブドメインルーティング可

 

サブドメインとは

例: example.com がルートドメイン → blog.example.com / admin.example.com / api.example.com がサブドメイン。

設定は 2 段階:

  1. DNS: サブドメインを IP アドレス or 別ドメインへ向ける
  2. Web サーバ: サブドメインのリクエストを受けて処理する設定

DNS 設定

A レコード(IP 直接指定)

# DNS 管理画面 (Cloudflare / Route 53 / お名前.com 等)

# サブドメイン     タイプ    値             TTL
blog            A         192.168.1.10   3600
admin           A         192.168.1.10   3600
api             A         192.168.1.11   3600

# IPv6 なら AAAA
www             AAAA      2001:db8::1     3600

CNAME レコード(別ドメインへ)

# CDN・別サービス経由
blog            CNAME     mysite.netlify.app.
api             CNAME     myapi.herokuapp.com.

# 注意:
# - ルートドメインに CNAME は基本不可 (一部 DNS は ALIAS / ANAME で対応)
# - サブドメインだけ CNAME 可能

ワイルドカード

# 全サブドメインを 1 つの IP に
*               A         192.168.1.10

# foo.example.com / bar.example.com 等 すべて 192.168.1.10 へ
# テナント別 (tenant1.app.example.com / tenant2.app.example.com 等) に便利

DNS 反映確認

# dig で確認
$ dig blog.example.com
;; ANSWER SECTION:
blog.example.com.  3600  IN  A  192.168.1.10

# nslookup
$ nslookup blog.example.com

# Linux/Mac で hosts ファイルでテスト
$ sudo vi /etc/hosts
192.168.1.10  blog.example.com

Nginx 設定

# /etc/nginx/sites-available/blog.example.com
server {
    listen 80;
    server_name blog.example.com;

    root /var/www/blog;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

# 有効化
$ sudo ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
$ sudo nginx -t  # 構文チェック
$ sudo systemctl reload nginx

複数サブドメインを 1 設定で

# サブドメイン別に root 切替
server {
    listen 80;
    server_name ~^(?.+)\.example\.com$;

    root /var/www/$sub;
    index index.html;
}

# blog.example.com → /var/www/blog
# admin.example.com → /var/www/admin

Apache 設定

# /etc/apache2/sites-available/blog.example.com.conf

    ServerName blog.example.com
    DocumentRoot /var/www/blog

    
        AllowOverride All
        Require all granted
    

    ErrorLog ${APACHE_LOG_DIR}/blog-error.log
    CustomLog ${APACHE_LOG_DIR}/blog-access.log combined


# 有効化
$ sudo a2ensite blog.example.com.conf
$ sudo systemctl reload apache2

SSL 証明書 (Let\'s Encrypt)

個別証明書

# certbot で取得 + 自動設定
$ sudo certbot --nginx -d blog.example.com
$ sudo certbot --apache -d blog.example.com

# 複数サブドメイン同時
$ sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com -d api.example.com

# 自動更新確認 (cron で実行されている)
$ sudo certbot renew --dry-run

ワイルドカード証明書(*.example.com)

# DNS-01 challenge が必要 (HTTP-01 では取得できない)
$ sudo certbot certonly --manual --preferred-challenges dns \
    -d "*.example.com" -d example.com

# 表示された TXT レコードを DNS に追加 → 確認後 Enter
# 90 日ごとに手動更新必要

# Cloudflare 等の DNS API なら自動更新可能
$ sudo certbot certonly --dns-cloudflare \
    --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
    -d "*.example.com"

Laravel でサブドメインルーティング

// routes/web.php

// 単一サブドメイン
Route::domain('api.example.com')->group(function () {
    Route::get('/users', [ApiUserController::class, 'index']);
});

// パラメータ付き (テナント別 SaaS)
Route::domain('{tenant}.example.com')->group(function () {
    Route::get('/dashboard', function ($tenant) {
        return "Tenant: $tenant";
    });
});

// 設定: config/app.php
'url' => env('APP_URL', 'http://example.com'),

// ローカル開発: /etc/hosts に追加
// 127.0.0.1   blog.example.test
// 127.0.0.1   admin.example.test

Rails でサブドメインルーティング

# config/routes.rb
Rails.application.routes.draw do
  constraints subdomain: "admin" do
    namespace :admin do
      resources :users
    end
  end

  constraints subdomain: "api" do
    namespace :api do
      resources :users
    end
  end
end

# 動的サブドメイン (テナント別)
constraints subdomain: /.+/ do
  get '/', to: 'tenants#show'
end

# request.subdomain でアクセス可能

Cloudflare 経由の場合

# Cloudflare ダッシュボード → DNS
# サブドメインを A レコードで追加
# - Name: blog
# - Type: A
# - IPv4: サーバ IP
# - Proxy status: Proxied (オレンジ雲) または DNS only

# Proxied だと:
# - CDN 経由 (高速化 + DDoS 対策)
# - サーバの実 IP は隠される
# - SSL 終端は Cloudflare → サーバ間は別途設定 (Full / Strict 推奨)

# サブドメイン用ページルールも設定可能
# blog.example.com/* → Cache Level: Cache Everything

テスト・デバッグ

# DNS 反映確認
$ dig blog.example.com +short
192.168.1.10

# HTTP 接続テスト
$ curl -I http://blog.example.com
HTTP/1.1 200 OK
Server: nginx/1.18.0

# Host ヘッダ指定 (DNS 反映前テスト)
$ curl -H "Host: blog.example.com" http://192.168.1.10/

# SSL 確認
$ openssl s_client -connect blog.example.com:443 -servername blog.example.com

# ローカル hosts でテスト (Mac/Linux: /etc/hosts, Windows: C:\Windows\System32\drivers\etc\hosts)
192.168.1.10  blog.example.com

よくあるトラブル

  • DNS 反映待ち: TTL の時間(最大 24-48 時間)
  • ブラウザキャッシュ: シークレットウィンドウで確認
  • SSL エラー: 証明書がサブドメインを含んでいない
  • nginx の reload 忘れ: sudo nginx -t && sudo systemctl reload nginx
  • ファイアウォール: ポート 80/443 開放

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール (CentOS編)
  2. 起動・停止コマンドとステータスの確認 (CentOS編)
  3. VPSへの導入例(CentOS編)
  4. ドキュメントルートの変更方法
  5. phpを動かす際に必要な設定
  6. サブドメインの設定方法