Django+Nginx+GunicornをUbuntuにデプロイする

概要

クラウド上のUbuntu環境へDjangoアプリケーションをデプロイします。
AWSのEC2で用意したUbuntu環境を利用します。

https://kkm-mako.com/2023/02/12/django-deploy/

UbuntuにSSH接続する

まずはUbuntu環境にSSH接続します。
こちらの記事の最後に確認したSSH接続用のコマンドで接続します。
※筆者は執筆時と別のEC2を新しく用意しましたのでコマンドが若干異なっています。

powershellを起動し、SSHキー(筆者の場合はubuntu docker key2.pem)があるディレクトリで上記のコマンドを実行します。

UbuntuにNginx+Gunicorn+Djangoの環境を用意する

必要なパッケージ類の用意、設定ファイル等の手順は全てシェルスクリプトにまとめました。
下記のコマンドでシェルスクリプトを作成します。

nano django-deploy.sh

スクリプトの中身は下記のようにします。
※【】の中身はご自身の環境に合わせて修正してください。

#!/bin/bash

# Djangoのインストール
sudo apt-get update
sudo apt-get install -y python3-django

# Gunicornのインストール
sudo apt-get install -y gunicorn

# nginxのインストール
sudo apt-get install -y nginx

# Djangoプロジェクトのクローン
git clone https://github.com/【Djangoアプリを格納したGitHubのパブリックリポジトリ】

# Djangoプロジェクトの作業ディレクトリに移動
cd 【GitHubのリポジトリ名】

# Gunicorn設定ファイルの作成
sudo bash -c 'cat > /etc/systemd/system/gunicorn.service << EOL
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/【GitHubのリポジトリ名】
ExecStart=/usr/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 【Djangoプロジェクト名】.wsgi:application

[Install]
WantedBy=multi-user.target
EOL'

# Gunicorn起動
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

# nginx設定ファイルの編集
sudo bash -c 'cat > /etc/nginx/sites-available/【Djangoプロジェクト名】 << EOL
server {
    listen 80;
    server_name 【サーバのパブリックIPアドレス】;

    location / {
        proxy_pass http://0.0.0.0:8000;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
    }
}
EOL'

# nginx設定ファイルのシンボリックリンク作成
sudo ln -s /etc/nginx/sites-available/【Djangoプロジェクト名】 /etc/nginx/sites-enabled/

# nginx再起動
sudo service nginx restart

作成したシェルスクリプトを実行します。

source ./django-deploy.sh

スクリプトの実行が完了したらデプロイ完了です。

ブラウザのURLにEC2のパブリックIPアドレスを入力してDjangoアプリケーションの起動を確認します。

補足

シェルスクリプトの完全な例

#!/bin/bash

# Djangoのインストール
sudo apt-get update
sudo apt-get install -y python3-django

# Gunicornのインストール
sudo apt-get install -y gunicorn

# nginxのインストール
sudo apt-get install -y nginx

# Djangoプロジェクトのクローン
git clone https://github.com/MakotoHorikawa1021/myproj.git

# Djangoプロジェクトの作業ディレクトリに移動
cd myproj

# Gunicorn設定ファイルの作成
sudo bash -c 'cat > /etc/systemd/system/gunicorn.service << EOL
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/myproj
ExecStart=/usr/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 myproj.wsgi:application

[Install]
WantedBy=multi-user.target
EOL'

# Gunicorn起動
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

# nginx設定ファイルの編集
sudo bash -c 'cat > /etc/nginx/sites-available/myproj << EOL
server {
    listen 80;
    server_name 54.237.217.167;

    location / {
        proxy_pass http://0.0.0.0:8000;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
    }
}
EOL'

# nginx設定ファイルのシンボリックリンク作成
sudo ln -s /etc/nginx/sites-available/myproj /etc/nginx/sites-enabled/

# nginx再起動
sudo service nginx restart

EC2のパブリックIPアドレスの確認

下記のでパブリックIPアドレスは確認できます。

なお、通常であればElastic IPを割り当ててIPアドレスを固定します。
これをやらないとアプリにアクセスするためのIPアドレスが頻繁に変わってしまいます。
今回はデプロイの確認でしたので省略しました。

まとめ

Nginx+Gunicorn+Djangoのデプロイ手順をまとめてみました。
特に手間のかかる構築の過程を全てシェルスクリプトにまとめるのには苦労しました。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です