Python Webシステム メモ

Webアプリケーションのデプロイにおいて、サーバの役割とその配置はプロジェクトの規模や要件に応じて異なります。以下に、Webサーバ(Nginx)、アプリケーションサーバ(Gunicorn)、およびデータベースサーバの基本的な構成とその役割を説明します。

基本的なサーバ構成

  1. Webサーバ(Nginx)

    • 役割:静的ファイルの提供、リバースプロキシ、負荷分散、SSL/TLS暗号化、アクセス制御など。

    • 必要数:通常、1台で十分ですが、高負荷の場合は複数台のNginxをロードバランサとして設定することもあります。

  2. アプリケーションサーバ(Gunicorn)

    • 役割:Djangoアプリケーションを実行し、動的なコンテンツを生成。

    • 必要数:1台の物理サーバまたは仮想サーバで複数のGunicornプロセスを実行することが一般的です。必要に応じて水平スケーリング(複数台のアプリケーションサーバを使用)も可能です。

  3. データベースサーバ

    • 役割:データの永続的な保存と管理。

    • 必要数:通常は1台ですが、高可用性や負荷分散のためにレプリケーションやシャーディングを行うこともあります。

シンプルなデプロイメント構成

  • 物理サーバ1台

    • Webサーバ(Nginx)、アプリケーションサーバ(Gunicorn)、データベースサーバ(PostgreSQLなど)を同じサーバ上で動作させることも可能です。この構成は小規模なプロジェクトやテスト環境に適しています。

構成例:

物理サーバ1台:
  - Nginx
  - Gunicorn (Djangoアプリケーション)
  - PostgreSQL
  • 複数サーバ

    • 本番環境や高負荷な環境では、役割ごとにサーバを分離することが推奨されます。

構成例:

物理サーバ1(Webサーバ):
  - Nginx

物理サーバ2(アプリケーションサーバ):
  - Gunicorn (Djangoアプリケーション)

物理サーバ3(データベースサーバ):
  - PostgreSQL

スケーラブルなデプロイメント構成

  • ロードバランサ:複数のNginxインスタンスをロードバランサで管理。

  • アプリケーションサーバクラスター:複数のアプリケーションサーバ(Gunicorn)を使用。

  • データベースクラスター:データベースのレプリケーションやシャーディングを使用。

構成例:

ロードバランサ:
  - Nginx (ロードバランサとして機能)

Webサーバ群:
  - Nginx (複数台)

アプリケーションサーバ群:
  - Gunicorn (複数台)

データベースサーバ群:
  - PostgreSQL (レプリケーションまたはシャーディング)

実際のサーバ配置例

単一サーバ構成(小規模プロジェクト)

物理サーバ1台:
  - Nginx
  - Gunicorn (Djangoアプリケーション)
  - PostgreSQL

複数サーバ構成(中規模以上のプロジェクト)

物理サーバ1(Webサーバ):
  - Nginx

物理サーバ2(アプリケーションサーバ):
  - Gunicorn (Djangoアプリケーション)

物理サーバ3(データベースサーバ):
  - PostgreSQL

大規模なプロジェクト

ロードバランサ:
  - Nginx (ロードバランサとして機能)

Webサーバ群:
  - Nginx (複数台)

アプリケーションサーバ群:
  - Gunicorn (複数台)

データベースサーバ群:
  - PostgreSQL (レプリケーションまたはシャーディング)

まとめ

  • 小規模プロジェクト:すべてのコンポーネントを1台のサーバに配置可能。

  • 中規模以上のプロジェクト:役割ごとにサーバを分離し、スケーラビリティを向上。

  • 大規模プロジェクト:ロードバランサ、Webサーバ群、アプリケーションサーバ群、データベースサーバ群を使用し、複数台のサーバで高可用性と負荷分散を実現。

以下に各コンポーネントの詳細、セキュリティの考慮点、そして高可用性について詳しく説明します。

1. ロードバランサ

Nginx(または他のロードバランサ)

機能:

  • クライアントからのリクエストを複数のWebサーバに分散させ、負荷を均等に分配します。

  • 可用性を高めるために、1つのサーバがダウンしても他のサーバでリクエストを処理できます。

設定例:

http {
    upstream backend {
        server webserver1.example.com;
        server webserver2.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

2. Webサーバ群

Nginx(複数台)

機能:

  • 静的ファイルを提供し、アプリケーションサーバ(Gunicorn)へのリクエストをプロキシします。

設定例:

server {
    listen 80;
    server_name webserver1.example.com;

    location /static/ {
        alias /path/to/static/files/;
    }

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. アプリケーションサーバ群

Gunicorn(複数台)

機能:

  • Djangoアプリケーションを実行し、動的コンテンツを生成します。

設定例:

gunicorn --workers 3 --bind 0.0.0.0:8000 myproject.wsgi:application

4. データベースサーバ群

PostgreSQL(レプリケーションまたはシャーディング)

機能:

  • データの保存と管理を行い、高可用性とスケーラビリティを実現します。

レプリケーションの設定例:

# primary server
wal_level = replica
max_wal_senders = 10
archive_mode = on
archive_command = 'cp %p /path/to/archive/%f'

# replica server
primary_conninfo = 'host=primary_ip user=replication_user password=replication_password'

高可用性と死活監視

Floating IP

  • Floating IPは、高可用性を実現するために、あるサーバがダウンした際に他のサーバにIPアドレスを迅速に移行するために使用します。

HeartbeatとPacemaker

  • HeartbeatPacemakerはクラスタ管理ツールで、サーバの死活監視を行い、必要に応じてサービスをフェイルオーバーします。

設定例(Heartbeat + Pacemaker):

# インストール
sudo apt-get install pacemaker corosync

# リソースとフェイルオーバー設定
pcs cluster setup mycluster node1 node2
pcs cluster start --all
pcs cluster enable --all
pcs resource create my_vip ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s
pcs resource create my_service systemd:myapp op monitor interval=30s

セキュリティ設定

ファイアウォール

  • ファイアウォールは、ネットワークトラフィックを制御し、外部からの攻撃を防ぐために設定します。ufwやiptablesを使用します。

設定例(ufw):

sudo ufw allow 'Nginx Full'
sudo ufw allow 5432/tcp  # PostgreSQL
sudo ufw enable

VPN

  • VPNは、リモートアクセスや安全な通信を実現するために使用します。企業ネットワークに安全にアクセスする必要がある場合に設定します。

設定例(OpenVPN):

# OpenVPNのインストールと設定
sudo apt-get install openvpn
sudo openvpn --config /path/to/server.conf

まとめ

  • ロードバランサはNginxを使用して、トラフィックをWebサーバに分散させます。

  • Webサーバは静的ファイルを提供し、アプリケーションサーバへのリクエストをプロキシします。

  • アプリケーションサーバはGunicornを使用してDjangoアプリケーションを実行します。

  • データベースサーバはPostgreSQLのレプリケーションやシャーディングを使用して高可用性を実現します。

  • 高可用性はFloating IPやHeartbeat、Pacemakerを使用して構成します。

  • セキュリティはファイアウォールやVPNを適切に設定して確保します。

これらの構成により、高パフォーマンスで安全なWebアプリケーションを実現できます。

1. ファイアウォール

ファイアウォールは、各サーバに設定します。これは、各サーバが自身のトラフィックを制御し、不要なアクセスをブロックするためです。

インストールと設定

ファイアウォールをインストールする場合、一般的なツールはufw(Uncomplicated Firewall)やiptablesです。

各サーバに設定するファイアウォールの例:

# ufwのインストール(必要に応じて)
sudo apt-get install ufw

# ufwの設定
sudo ufw allow 'Nginx Full'
sudo ufw allow 5432/tcp  # PostgreSQL
sudo ufw enable

2. Floating IP

Floating IPは、クラウドプロバイダや特定のネットワーク設定で使用される概念であり、高可用性を実現するためのものです。これを設定するためには、通常、追加のサーバは必要ありませんが、Floating IPを管理するための設定が必要です。

使用例

Floating IPは、通常、プライマリサーバがダウンした場合に、セカンダリサーバに自動的に移行するよう設定されます。

3. HeartbeatとPacemaker

HeartbeatPacemakerは、クラスタ管理ツールで、サーバの死活監視と自動フェイルオーバーを行います。これらは、複数のサーバ間で設定され、追加の専用サーバを用意する必要はありませんが、クラスタ内の各サーバにインストールして設定します。

HeartbeatとPacemakerの設定例

複数のサーバ間でこれらのツールを設定します。

サーバ間でのHeartbeatとPacemakerのインストールと設定:

# すべてのクラスタノードにPacemakerとCorosyncをインストール
sudo apt-get install pacemaker corosync

# クラスタの設定
sudo pcs cluster setup mycluster node1 node2
sudo pcs cluster start --all
sudo pcs cluster enable --all

# Floating IPリソースの作成
sudo pcs resource create my_vip ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s

# アプリケーションサービスの作成
sudo pcs resource create my_service systemd:myapp op monitor interval=30s

セキュリティ設定の配置

1. Webサーバ(Nginx)

  • ファイアウォール:Nginxが動作するサーバにファイアウォールを設定します。HTTP/HTTPSポート(80/443)を開放し、他の不必要なポートは閉じます。

sudo ufw allow 'Nginx Full'
sudo ufw enable

2. アプリケーションサーバ(Gunicorn)

  • ファイアウォール:Gunicornが動作するサーバにファイアウォールを設定します。通常、Nginxからの接続を受け入れるポート(例:8000)を開放します。

sudo ufw allow 8000
sudo ufw enable

3. データベースサーバ(PostgreSQL)

  • ファイアウォール:データベースサーバにファイアウォールを設定します。必要に応じてデータベースポート(例:5432)を開放します。

sudo ufw allow 5432/tcp
sudo ufw enable

高可用性の構成

Floating IPの設定

Floating IPは、通常のクラウドプロバイダ(例:AWS、GCP、Azure)でサポートされている機能であり、特定のネットワークインターフェースにIPアドレスをバインドして使用します。

HeartbeatとPacemakerの動作

これらのツールはクラスタ内の各サーバにインストールし、フェイルオーバーを管理します。

まとめ

  • ファイアウォール:各サーバ(Webサーバ、アプリケーションサーバ、データベースサーバ)に個別に設定します。

  • Floating IP:クラウドプロバイダやネットワーク設定で使用し、通常は追加のサーバは不要。

  • HeartbeatとPacemaker:クラスタ内のすべてのサーバにインストールし、フェイルオーバー管理を行います。

これらの設定により、高可用性とセキュリティを確保しながら、Webアプリケーションのパフォーマンスを最適化できます。

小規模

一つの物理的なサーバにすべてを入れる。

中規模

それぞれのサーバごとにマシンを用意する

大規模

一般的な可用性等を意識した作り。


詳細な説明

  1. 小規模システム

    • 物理サーバ1台またはVMインスタンス1つに、Webサーバ(Nginx)、アプリケーションサーバ(Gunicorn)、データベースサーバ(PostgreSQL)をすべてインストールします。

    • 簡易的なセットアップで管理が容易ですが、スケーラビリティや可用性には限界があります。

  2. 中規模システム

    • 物理サーバ3台またはVMインスタンス3つを用意し、それぞれにWebサーバ、アプリケーションサーバ、データベースサーバをインストールします。

    • 各サーバの役割を分離することで、パフォーマンスの向上やスケーラビリティの拡張が容易になります。

確認ポイント

  • 小規模システム:すべてのサービスを1つのサーバにまとめる。

  • 中規模システム:各サービスを個別のサーバに分ける。

大規模も中規模と同じ感じで各サービスを個別のサーバに分ける。

リクエストの流れ

  • ファイアウォール(FW1)

    • パケットフィルタリング:不正なパケットをフィルタリングし、許可されたトラフィックのみを通過させます。

    • ステートフルインスペクション:セッションの状態を監視し、信頼性の高い接続のみを許可します。

  • ロードバランサ(LB)

    • リクエスト分散:受け取ったリクエストを複数のサーバに分散します。

    • 負荷分散:サーバの負荷を均等に保つため、リクエストを適切に振り分けます。

  • 内部ファイアウォール(FW2)

    • 内部ネットワーク保護:内部ネットワークを外部の脅威から保護します。

    • アクセス制御:内部セグメント間のアクセスを制御します。

  • Webサーバ(WS1)

    • 静的コンテンツ提供:静的ファイル(HTML、CSS、JavaScript、画像など)を提供します。

    • リクエストのプロキシ:動的リクエストをアプリケーションサーバに転送します。

  • アプリケーションサーバ(AS1)

    • ビジネスロジックの実行:ユーザーのリクエストに応じて必要な処理を実行します。

  • データベースサーバ(DB)

    • データ取得:アプリケーションサーバからのクエリに応じてデータを提供します。


この記事が気に入ったらサポートをしてみませんか?