0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】DjangoアプリをEC2+RDS+Nginx+Gunicornで本番公開するまで(エラー解決策付き)

Posted at

【初心者向け】DjangoアプリをEC2+RDS+Nginx+Gunicornで本番公開するまで(エラー解決策付き)

はじめに

ローカル環境で開発したDjangoアプリケーション。「いざ公開!」と思っても、本番環境へのデプロイはたくさんの壁にぶつかりますよね。特に、Webサーバーやアプリケーションサーバーの設定は、初心者にとって最初の大きなハードルです。

ちなみに私には?EC2では?httpd(Apache)ではWSGIサーバーがうまく読み込めないエラーもあり先日のサーバー構成から潔くhttpd(Apache)を諦めてNginx+Gunicornにサクッと舵を切ったわけです。

この記事では、ローカルで開発したDjangoアプリ(今回はCSVファイルを読み込む簡単な検索アプリ)を、EC2 + RDS + Nginx + Gunicorn という、現代的で本格的な構成で本番公開するまでの一連の手順を、私が実際に遭遇したエラーとその解決策を交えながら解説します。

「Apacheでやろうとしたけど、うまくいかなかった…」
「エラーログと一日中にらめっこしている…」

そんなあなたのための、実践的なデプロイガイドです。

【注意】RDSのDBサーバーはこの先のDB化を検討して構成記述に加えてますが、今回のCSVデータ参照型のアプリでは特に必要ありません。

対象読者

  • ローカルでDjangoアプリを開発し終えた方
  • 初めてAWS(EC2, RDS)を使ってデプロイに挑戦する方
  • NginxとGunicornの連携でつまずいている方

本番環境の構成

  • インフラ: AWS (EC2 + RDS)
  • OS: Amazon Linux 2023
  • データベース: PostgreSQL (RDS)
  • Webサーバー: Nginx
  • Appサーバー: Gunicorn

ステップ1: AWSのインフラ準備

この記事では詳細な手順は省きますが、以下のAWSリソースが準備できていることを前提とします。

  1. EC2インスタンス:

    • Amazon Linux 2023 を選択。
    • SSH接続用のキーペアを作成し、PCに保存しておく。
    • セキュリティグループで以下のインバウンドルール(自分のPCから)を許可しておく。
      • SSH (ポート22): サーバーに接続するため
      • HTTP (ポート80): Webサイトを公開するため
      • HTTPS (ポート443): 将来的にSSL化するため
  2. RDSインスタンス:

    • PostgreSQL を選択。
    • データベース名、マスターユーザー名、パスワードを控えておく。
    • EC2からの接続を許可するため、RDSのセキュリティグループで、EC2のセキュリティグループからの PostgreSQL (ポート5432) を許可しておく。

ステップ2: EC2サーバーへの接続と初期設定

まず、SSHでEC2インスタンスに接続し、デプロイに必要なツールをインストールします。

# ターミナルからSSHでEC2に接続
# -i オプションで秘密鍵のパスを指定
ssh -i /path/to/your-key.pem ec2-user@あなたのEC2のパブリックIPアドレス

# --- 接続後、EC2上で以下のコマンドを実行 ---

# パッケージ情報を最新に更新
sudo dnf update -y

# 必要なツールをまとめてインストール
sudo dnf install -y nginx python3-pip python3-devel gcc git postgresql-devel

これで、Webサーバー(Nginx)やPythonの環境を整える準備ができました。


ステップ3: プロジェクトの配置と仮想環境の構築

開発したDjangoプロジェクトを、Gitを使ってEC2サーバーに配置します。

1. 【PCでの作業】requirements.txtの最終準備
PCのプロジェクトフォルダで、requirements.txtに本番環境で必要なライブラリを追加します。

Django==5.2.4
pandas
gunicorn         # Appサーバー
psycopg2-binary  # PostgreSQL接続用

ファイルを修正したら、忘れずにGitHubにgit pushしておきましょう。

2. 【EC2での作業】GitHubからコードをクローン
EC2のホームディレクトリにプロジェクトを配置します。

# ホームディレクトリに移動
cd /home/ec2-user/

# GitHubからプロジェクトをクローン
git clone [https://github.com/あなたのユーザー名/あなたのリポジトリ名.git](https://github.com/あなたのユーザー名/あなたのリポジトリ名.git)

# 作成されたプロジェクトフォルダに移動 (例: bikefindAPP)
cd あなたのリポジトリ名/

3. 【EC2での作業】Python仮想環境のセットアップ
プロジェクトごとにPython環境を独立させるため、仮想環境(venv)を作成します。

# 仮想環境を作成 (フォルダ名はvenvやvenv313など任意)
python3 -m venv venv

# 仮想環境を有効化 (これ以降、コマンドラインの先頭に(venv)と表示されます)
source venv/bin/activate

# requirements.txtを元にライブラリをインストール
pip install -r requirements.txt

ステップ4: Djangoの本番設定 (settings.py)

EC2上のsettings.pyを本番環境向けに修正します。これがデプロイの肝です。

# nanoエディタでsettings.pyを開く (パスは自分のプロジェクトに合わせてください)
nano your_project_name/settings.py
# ...

# 本番環境では必ずFalseにする
DEBUG = False

# EC2のパブリックIPアドレスや、あなたのドメイン名を追加
ALLOWED_HOSTS = ['xx.xx.xx.xx', '[www.your-domain.com](https://www.your-domain.com)'] 

# CSRF対策: 安全なリクエスト元としてドメインを登録
CSRF_TRUSTED_ORIGINS = ['[https://www.your-domain.com](https://www.your-domain.com)']

# --- RDSへの接続設定 ---
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'RDSで設定したDB名',
        'USER': 'RDSで設定したマスターユーザー名',
        'PASSWORD': 'RDSで設定したパスワード',
        'HOST': 'RDSのコンソールに表示されるエンドポイントURL',
        'PORT': '5432',
    }
}

# --- 静的ファイルの設定 ---
STATIC_URL = '/static/'
# `collectstatic`で静的ファイルを集める場所
STATIC_ROOT = BASE_DIR / 'staticfiles'

# ロードバランサ経由のhttpsを正しく認識させるための設定(必要ある場合です!)
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ステップ5: Djangoの本番コマンド実行

設定を終えたら、データベースの準備と静的ファイルの収集を行います。

# (venv)が有効になっていることを確認

# データベースのテーブルを作成
python manage.py migrate

# STATIC_ROOTで指定した場所に静的ファイルを集める
# (途中でyes/noを聞かれたらyesと入力)
python manage.py collectstatic

ステップ6: Gunicornの設定とサービス化

Gunicornをsystemdに登録し、OSが自動で起動・管理できるようにします。

1. gunicorn.serviceファイルを作成

sudo nano /etc/systemd/system/gunicorn.service

2. ファイルに内容を記述
WorkingDirectoryやExecStartのパスは、あなたの実際のディレクトリ構造に正確に合わせてください。これが一番つまずきやすいポイントです。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ec2-user
Group=nginx
WorkingDirectory=/home/ec2-user/あなたのリポジトリ名
ExecStart=/home/ec2-user/あなたのリポジトリ名/venv/bin/gunicorn --workers 3 --bind unix:/home/ec2-user/あなたのリポジトリ名/app.sock あなたのプロジェクト設定フォルダ名.wsgi:application

[Install]
WantedBy=multi-user.target

3. Gunicornを起動・有効化

# systemdに設定をリロードさせる
sudo systemctl daemon-reload

# Gunicornを起動
sudo systemctl start gunicorn

# OS起動時に自動でGunicornが起動するように設定
sudo systemctl enable gunicorn

# 状態を確認 (active (running) と緑色で表示されれば成功!)
sudo systemctl status gunicorn

ステップ7: Nginxの設定

最後に、門番であるNginxを設定し、リクエストをGunicornに繋ぎます。

1. デフォルト設定の無効化(重要)
Nginxの歓迎ページが表示され続けないように、デフォルト設定を無効化します。


sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled

2. プロジェクト用の設定ファイルを作成

sudo nano /etc/nginx/conf.d/your_app_name.conf

3. ファイルに内容を記述

server {
    listen 80;
    server_name [www.your-domain.com](https://www.your-domain.com) your-domain.com;

    location /static/ {
        alias /home/ec2-user/あなたのリポジトリ名/staticfiles/;
    }

    location / {
        # proxy_paramsファイルがない場合があるので、その際は作成する
        include /etc/nginx/proxy_params;
        proxy_pass http://unix:/home/ec2-user/あなたのリポジトリ名/app.sock;
    }
}

※注意: include /etc/nginx/proxy_params;でエラーになる場合、/etc/nginx/proxy_paramsというファイルが存在しない可能性があります。その際は、ファイルを作成して標準的な設定を書き込んでください。

4. ディレクトリのパーミッション設定(重要)
Nginx(nginxユーザー)が、あなたのプロジェクトフォルダ(/home/ec2-user/以下)にアクセスできるように権限を与えます。

chmod 711 /home/ec2-user

5. Nginxを起動・有効化


# 設定ファイルに文法ミスがないかテスト
sudo nginx -t

# "syntax is okay" と "test is successful" と表示されたら起動
sudo systemctl start nginx
sudo systemctl enable nginx

ステップ8: ブラウザで確認!

以上で、すべての設定は完了です!
ブラウザであなたのドメイン(例: http://www.your-domain.com )にアクセスしてみてください。作成したDjangoアプリケーションが表示されれば、デプロイ成功です!

エラーが出たときは…

デプロイはエラーとの戦いです。焦らずにログを確認しましょう。

  • 502 Bad Gateway: NginxとGunicornの連携がうまくいっていません。

    1. sudo systemctl status gunicorn でGunicornが動いているか確認。

    2. sudo tail -n 50 /var/log/nginx/error.log でNginxのエラーログを見る。Permission denied (権限エラー) や No such file or directory (パスの間違い) がないかチェック。

    3. sudo se tenforce 0 を実行して、SELinuxが原因か切り分ける。

  • Internal Server Error (500エラー): Djangoアプリ内部でエラーが起きています。

    1. settings.pyのDEBUGを一時的にTrueにして、詳細なエラーページを確認する。
    2. sudo journalctl -u gunicorn でGunicornが吐き出しているDjangoのエラーログ(Traceback)を確認する。

さいごに
お疲れ様でした!本番環境へのデプロイは複雑な手順が多いですが、一度乗り越えると大きな自信に繋がります。この記事が、あなたのデプロイ作業の一助となれば幸いです。

Happy Hacking!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?