【初心者向け】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リソースが準備できていることを前提とします。
-
EC2インスタンス:
- Amazon Linux 2023 を選択。
- SSH接続用のキーペアを作成し、PCに保存しておく。
-
セキュリティグループで以下のインバウンドルール(自分のPCから)を許可しておく。
- SSH (ポート22): サーバーに接続するため
- HTTP (ポート80): Webサイトを公開するため
- HTTPS (ポート443): 将来的にSSL化するため
-
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の連携がうまくいっていません。
-
sudo systemctl status gunicorn でGunicornが動いているか確認。
-
sudo tail -n 50 /var/log/nginx/error.log でNginxのエラーログを見る。Permission denied (権限エラー) や No such file or directory (パスの間違い) がないかチェック。
-
sudo se tenforce 0 を実行して、SELinuxが原因か切り分ける。
-
-
Internal Server Error (500エラー): Djangoアプリ内部でエラーが起きています。
- settings.pyのDEBUGを一時的にTrueにして、詳細なエラーページを確認する。
- sudo journalctl -u gunicorn でGunicornが吐き出しているDjangoのエラーログ(Traceback)を確認する。
さいごに
お疲れ様でした!本番環境へのデプロイは複雑な手順が多いですが、一度乗り越えると大きな自信に繋がります。この記事が、あなたのデプロイ作業の一助となれば幸いです。
Happy Hacking!