2026年11月12日

2026年11月12日

Nginxで動的コンテンツと静的コンテンツを分けて配信する方法

はじめに

Webサイトの性能を向上させるために、コンテンツを最適な方法で配信することが重要です。静的コンテンツ(画像やCSSファイルなど)と動的コンテンツ(PHPスクリプトによる動的なページ生成など)は異なる配信方法が推奨されます。この記事では、Nginxを使用してこれらのコンテンツを効果的に分離し配信する設定方法を解説します。

症状・背景

  • パフォーマンスの低下
  • サーバー負荷の増大
  • ストリーミングや画像配信での遅延
  • セキュリティ上のリスクの高まり
  • 静的コンテンツと動的コンテンツの混在による管理難易度の上昇

手順・設定方法

ステップ1: Nginxのインストールと基本設定

# 管理者権限でNginxをインストールする
sudo apt-get update && sudo apt-get install nginx -y

# サーバー設定ファイルを編集する
sudo nano /etc/nginx/sites-available/default

# デフォルトの設定から静的コンテンツと動的コンテンツの配信を分離するための基本的なサーバーブロックを追加または変更します。
server {
    listen 80;
    server_name example.com;

    # 静的コンテンツ配信用の設定
    location /static/ {
        alias /var/www/example/static/;
        expires max;
        add_header Cache-Control "public";
    }

    # 動的コンテンツ配信用の設定
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

ステップ2: 静的コンテンツと動的コンテンツのロードバランシング

# Nginxから異なるサーバーグループへ静的コンテンツと動的コンテンツをリクエストを分散させる設定
upstream static_files {
    server 192.0.2.1:80;
}

upstream dynamic_pages {
    server 192.0.2.2:80;
    server 192.0.2.3:80;
}

server {
    listen 80;
    server_name example.com;

    location /static/ {
        proxy_pass http://static_files;
        expires max;
        add_header Cache-Control "public";
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass dynamic_pages;
    }
}

ステップ3: CDNとの統合

# 静的コンテンツに対してCDNを使用する設定
server {
    listen 80;
    server_name example.com;

    location /static/ {
        proxy_pass http://cdn.example.com/static/;
        expires max;
        add_header Cache-Control "public";
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass dynamic_pages;
    }
}

# 動的コンテンツはサーバー上で直接処理
server {
    listen 80;
    server_name example.com;

    location /dynamic/ {
        try_files $uri @backend;
    }

    location @backend {
        include snippets/fastcgi-php.conf;
        fastcgi_pass dynamic_pages;
    }
}

ステップ4: ロギングと監視

# 静的コンテンツと動的コンテンツのアクセスログを分けて記録する設定
server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/static-access.log main;
    error_log /var/log/nginx/static-error.log;

    location /static/ {
        proxy_pass http://cdn.example.com/static/;
        expires max;
        add_header Cache-Control "public";
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass dynamic_pages;
        access_log /var/log/nginx/dynamic-access.log main;
        error_log /var/log/nginx/dynamic-error.log;
    }
}

注意事項

  • セキュリティ上の注意: 静的コンテンツと動的コンテンツの分離は、それぞれ異なるセキュリティポリシーを適用する機会を提供します。静的ファイルに対してはXSSやCSRFに対する防御が重要であり、動的コンテンツではSQLインジェクションやクロスサイトスクリプト攻撃などの防止策が必要です。
  • パフォーマンス/運用上の注意: CDNとの統合やロードバランシングを使用する際は、ネットワーク遅延やリソースの過剰消費に注意してください。また、アクセスログやエラーログを適切に管理することで問題発生時のトラブルシューティングが容易になります。

まとめ

1. パフォーマンス向上: 静的コンテンツと動的コンテンツの分離により配信速度が向上します。

2. サーバー負荷軽減: サーバー資源を効率的に使用することで、全体的なシステムの安定性も高まります。

3. セキュリティ強化: それぞれ異なる攻撃対策を行い、より堅牢な環境を作ることができます。

4. 管理性向上: コンテンツが明確に分かれているため、保守やアップデートなども容易になります。

5. スケーラビリティの改善: 静的と動的なコンテンツを別々のサーバーやサービスで処理することで、大規模なサイトでも安定した配信が可能です。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲