【AmazonLinux2でDjangoの本番環境構築】Python3.8,Nginx,Gunicorn,PostgreSQL

この記事は、AmazonLinux2,Python3.7,Nginx,Gunicorn,PostgreSQLを利用して、Djangoプロジェクトの本番環境構築の方法を紹介します。

独自ドメインでの表示設定、https化の方法についても解説していきます。

 

◆動作検証環境

・ローカル環境:mac Catalina
・aws
・OS:AmazonLinux2
・Python:3.7.9
・Django:3.1.1

・Nginx:1
・Gunicorn:20.1.0
・PostgrSQL:11
・psycopg2:2.7.7
今回は、awsのアカウント作成、EC2インスタンスの作成、ElasticIPの設定が完了している状態から、解説を行っています。
EC2インスタンスの作成、ElasticIPの設定については以下の記事を参考にしてください。
目次
スポンサードリンク

インスタンスへ接続(ログイン)

 

ローカル環境ので使用する秘密鍵の設定

EC2ダッシュボードで接続の方法を確認します。

対象のインスタンスが選択されている事を確認して、[接続]をクリックします。

 

接続方法が表示されます(スタンドアロンSSHクライアント)。

今回は、Macを利用する方法で解説します。

 

 

EC2インスタンスを作成する際に、秘密鍵を作成した際は、ダウンロードフォルダにキーがありますので、まずは.sshフォルダを作成し、権限を設定します。

 

EC2インスタンス作成の際にダウンロードした秘密鍵をさきほど作成した.sshフォルダに移動します。

 

対象のディレクトリへ移動して秘密鍵の権限を変更します。

 

ここまで設定できたらSSH接続でインスタンスへログインします。

EC2ダッシュボードでの表示を参考に下記のコマンドを実行します。

 

※AmazonLinuxの初期ユーザーは、ec2-user , Ubuntuの初期ユーザーはubuntu となります。

 

EC2インスタンス(リモートサーバー)の初期設定

 

linuxの初期設定

パッケージの更新
タイムゾーンの変更
変更後の確認
日本語ロケールに変更
 

変更後の確認
スポンサードリンク

新規ユーザーの作成と設定

セキュリティー強化のため、EC2の設定で準備されているデフォルトユーザーの代わりとなる、新規のユーザーを作成します。

ユーザーの作成

 

ユーザーを作成すると、/home/の中に新ユーザー名のディレクトリが作成されるので、ec2-userディレクトリに設置されていたディレクトリやファイルを移動する。

コピー後にディレクトリと、その中の所有者を新たに作ったユーザーに変更する。

 

新たなユーザーにsudoの権限を与える(sudersを編集)。
以下のコマンドで、ファイルを編集します。
ログアウトする

 

新規ユーザーでのログインと、root権限の確認

新たに作成したユーザーでログインを試します。

 

ログインできる事が確認できたら、root権限を利用できるか確認します。

以下のように表示が変われば確認OKです。

$#

 

デフォルトユーザーの削除

以上の確認ができたらデフォルトユーザーを削除し、関係ファイルを編集します。

 

ec2-userの削除
※-rのオプションをつける事で削除ユーザーのディレクトリも削除されます。

90-cloud-init-usersファイルの編集

ファイヤーウォールの設定

firewalldのインストール

 

ファイヤーウォールのスタート

 

http(80番)の追加

 

https(443番)の追加

 

8000番の追加(Djangoの内蔵サーバー起動時に使用)

 

設定を反映させる。

 

設定の確認
 

OSに合わせて起動するように設定
 

ファイヤーウォールのリスタート
 

ステータスの確認

 

Postglesqlの設定

 

AmazonLinuxにはamazon-linux-extrasというパッケージ管理コマンドがあります。
このコマンドを利用して、ミドルウェア等のインストールできるバージョンの確認、インストールを行います。

Postglesqlのインストールと初期設定

インストールできるバージョンの確認
以下のように表示されます。
 

11を指定してインストール
インストール後バージョン確認

 

postgresql-serverパッケージのインストール
 

データベースの初期化
 

ポスグレのサービス自動起動の設定
 

ポスグレサービスの起動

 

Postglesqlデータベースの作成

データベースの初期化
 

データベースの作成
 

djangoから接続するユーザー、パスワードの設定
 

データベースへの日本語設定
 

タイムゾーン設定
 

ユーザーに権限つける
 

データベース抜ける
 

postgresql起動確認
下記のような表示を確認できればOK

ポスグレのリモート接続(コンフィグファイル)設定

ディレクトリに入るのに必要なためrootになる
 

pg_hba.conf ファイルのディレクトリに移動

 

pg_hba.confの編集

 

 

postgresql.conf の編集

下記のように編集(59行目あたりを編集、# の削除をお忘れなく)
 

PostgreSQL再起動

 

 

Virtualenvの仮想環境の構築

 

今回利用するAmazonLinuxはすでにpython3がインストールされているので、新たにインストールする必要はありません。

仮想環境fileの作成
ホームディレクトリへ移動して下記のコマンドを実行します。

 

仮想環境の実行

 

仮想環境の有効時はターミナルなる表示が下記のようになります。

 

仮想環境の中にdjangoとgunicornとpsycopg2(pythonとpostgresqlをつなげるライブラリー)をインストール

 

Djangoプロジェクトのデプロイ

 

仮のDjangoプロジェクトの設置

本番環境の最低限の環境構築の準備ができましたので、本番環境のサーバーにDjangoプロジェクトを設置します。

仮想環境の実行を行います。

 

プロジェクトを作成するディレクトリに移動して、スタートアッププロジェクトを作成します。

 

 

今回はGitHubのリポジトリを利用する方法を紹介します。

gitをインストールします。

プロジェクトを設置したディレクトリへ移動してクローンします。

$ git clone <https:xxxx@xxxxxx.xxxx.xxxx.xxxxxxx.>

 

settings.pyを編集します。

自分のリモートサーバーのホストを入力します。

 

新規でプロジェクトを作成した場合は、さきほど行ったpostgresqlの設定に合わせて、データベースの設定も変更します。

上記の設定を下記の内容に変更します。

 

modelクラスの設定を反映させるために、ベースディレクトリでマイグレーションを行います。

※ベースディレクトリ = manage.pyがあるディレクトリ

 

次に以下のように0.0.0.0:8000 と指定して起動します。

 

それぞれのリモートサーバーのIPアドレスの8000番ポートを指定してブラウザで確認します。

 

Djangoのウェルカムページが確認できればOKです。

 

Gunicornの設定

 

Djangoの内蔵サーバーでのサイト表示が確認できましたので、次にGunicornのアプリケーションサーバーを起動してサイトの表示を確かめます。

Gunicornの起動

仮想環境を有効にして下記のコマンドを実行します。

 

projectアプリケーションを含むディレクトリ(manage.pyコマンドを実行する時のディレクトリ)に移動して下記のコマンドを実行します。

 

project.wsgi とする事で、projectアプリケーション内のwsgi.pyを参照させています。

wsgiファイル名はそれぞれのプロジェクトに応じて変更します。

 

127.0.0.1:8000と指定する事で、Djangoにバインド(紐付ける)させています。

 

-Dのオプションをつける事で、バックグラウンドでGunicornを起動させます。

 

Gunicornの起動確認

以下のコマンドを実行するとプロセスが立ち上がっているか確認できます。

以下のように表示されればOKです。

 

起動後はブラウザにてサイトが表示されるか確認します。

内蔵サーバーの時のように以下の方法で、ブラウザにアクセスし表示を確かめます。

 

次に以下のように0.0.0.0:8000 と指定して起動します。

 

それぞれのリモートサーバーのIPアドレスの8000番ポートを指定してブラウザで確認します。

 

サイトが表示されればOKです。

確認後、Djangoのサーバーは停止しますが、Gunicornはバックグラウンドでの動作を継続させます。

 

 

Gunicornの停止:

Gunicornを再起動する場合は、一度停止してから再度、バックグラウンドモードで起動します。
OSが再起動する場合は、もう一度Gunicornも起動する必要があります。

 

Nginxの設定

 

静的なファイルに関係する動作はNginxに担当させ、負荷のかかる動的な動作はNginxからgunicornを呼び出し対応させるます。

 

この設定によって、ユーザーのリクエストの種類によって無駄の内サーバー動作を行えるようになります。

 

Nginxのインストール

nginxをインストールすとために、利用可能なバージョンを確認します。

 

今回は以下のように表示されます。

 

この表示を参考にバージョンを指定してインストールを行います。

 

Nginxの起動設定

自動起動の設定

 

起動

 

起動状況の確認

というように表示されればOK

 

ブラウザでの起動確認

対象のサーバーのIPアドレスを入力して、ブラウザで起動の確認を行います。

以下のようにNginxのウェルカムページが表示されればOK

 

Nginxのコンフィグファイルの編集

Nginxが起動している事が確認できたので、現在のサーバーに応じた設定を行い、またGunicornと連携できるように設定を行います。

 

configファイルの編集

 

server情報が記載されている箇所を以下のように編集します。

 

作成したコンフィグファイルの検証

 

下記のように表示されればOKです。

*エラーの表示がある場合は対応します。

 

Nginxのリスタート

 

Nginxを利用してのサイト表示確認

 

これまでのGunicornとNginxの設定を確認するために、ブラウザで表示確認を行います。

 

ブラウザにアクセス(ポート番号の指定は無し)してプロジェクトの表示を確認します。

 

サイトの表示が確認できればOKです。

 

今後は8000番ポートは使用しないので、ファイヤーウォールを閉じます

 

独自ドメイン・SSL化とリダイレクト設定

 

今までの設定で、IPアドレスの指定でサイトへアクセスできるようになりました。

ここからは独自ドメインの設定と、SSLとリダイレクトの設定を行います。

※独自ドメインとEC2インスタンスの紐付けが完了している状態で解説を行っています。
EC2側の設定は設定は以下のようになります。

独自ドメインのアクセス許可

Django/Settings.pyの設定

 

Nginxコンフィグファイルの編集

Webサーバーのエントリーファイルがあるディレクトリへ移動し、編集します。

 

Nginxのリスタート

 

独自ドメイン使用時のEC2の設定

今回はLet’s Encryptで提供されているcerbotツールを利用してHTTPS化を行います。

 

まず、EC2のホームディレクトリにcerbotのファイルを設置します。

Gitのcloneコマンドを利用しますので、Gitのインストールがまだの場合は行います。

 

ホームディレクトリである事を確認し、cerbotのパッケージをクローンします。

この際、登録されているユーザー名とパスワードの入力が必要となります。

 

次にcerbotの実行で使用されるpython製のパッケージをインストールします。

 

HTTPS化のためのNginxコンフィグファイルの編集①

certbotの証明書と秘密鍵取得に備え下記のように編集します。

 

設定変更を有効にするためリロード

 

SSL証明書と秘密鍵の発行

以下のcertbotコマンドで証明書と秘密鍵を発行します。

 

Skipping bootstrap because certbot-auto is deprecated on this system. ./certbot-auto has insecure permissions!

Nginxが起動している事を確かめ、以下のコマンドを実行します。

対象となるドメイン名や、メールアドレスを設定する。

 

以下のようなメッセージが表示されれば、証明書と秘密鍵が指定のディレクトリに作成されています。

 

HTTPS化のためのNginxコンフィグファイルの編集②

certbotを利用するHTTPS化に対応するためにコンフィグファイルを以下のように編集(追加)します。

 

 

設定変更を有効にするためリロード

 

独自ドメインでの表示確認

以下の方法でアクセスと表示を確認します。

https://sample.com → 表示されるか

http://sample.com → https://にリダイレクトされて表示されるか

 

SSL証明書の自動更新設定

Letsencriptの証明書は90日が有効期限となるため、継続して利用するには更新作業が必要となります。

自動で更新できるようにcronに更新のコマンドを設定します。

 

cron設定画面を開きます。

以下のように編集します。

 

-q オプションでエラーメッセージ以外を非表示にしています

–renew-hook オプションで更新のコマンドを実施後Nginxのリロードを行うようにしています。

 

static、mediaファイル表示の設定

 

開発環境ではstatic、mediaファイルはDjangoのプロジェクト内に作成していますが、本番環境ではNginxを利用して保存、表示を行うのでそちらの設定を行います。

settings.pyの編集

以下の内容になるよう編集、追加を行います。

※すでにstaticファイルを利用している場合は、ディレクトリ構造に合わせSTATICFILES_DIRSを指定します。

静的ファイルを配信ディレクトリに設置する

さきほどsettings.pyで指定した通りにリモートサーバー内にディレクトリを設置します。

 

リモートサーバーにSSH接続し、静的ファイルと、メディアファイルの作成と所有者の変更を行います。

 

リモートサーバー側にファイルを設置したので、Djangoアプリケーション内にある静的ファイルを、新たに作成したフォルダへ移します。

 

仮想環境に入り以下のコマンドを行います

 

nginxへのコンフィグファイルの編集

server {…}の方へ以下のコードを追加します。

 

変更後、gunicornとnginxの再起動を行いCSSが反映されて表示が確認できればOKです。

お疲れさまでした。ぺこり

 


以上、AmazonLinux2,Python3.7,Nginx,Gunicorn,PostgreSQLを利用して、Djangoプロジェクトの本番環境構築の方法、独自ドメインでの表示設定、https化について紹介しました。