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

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

 

◆動作検証環境

・ローカル環境:mac Catalina
・さくらVPSサーバー:メモリ 512M, ストレージ:SSD 25GB, CPU:1コア
・OS:Ubuntu 20.04 LTS(Focal Fossa) amd64
・Python:3.8.5
・Django:3.1.2

・Nginx:1.18.0
・Gunicorn:20.0.4
・PostgrSQL:12.7
・psycopg2:2.8.6
今回は、さくらのVPS サーバーにUbuntu 20.04 をインストールした状態(最低限のセキュリティ管理)からの作業方法を紹介しています。
スポンサードリンク

Ubuntuの環境初期設定

 

セキュリティ管理

さくらVPSサーバーにUbuntu 20.04 をインストール後の最低限のセキュリティ管理は、下記の記事を参考にしてください。

サーバーセキュリティー対策【秘密鍵を用いたSSHログイン設定(ubuntu,mac)】

 

Ubuntuの初期設定

まずはリモートサーバーにログインします。

 

日本語環境の設定

日本語パックのインストール

 

日本語への設定

 

変更後の確認

↓のように表示されればOK

 

時刻設定の確認

以下のように表示される

 

タイムゾーンの変更

変更後の確認

 

Ubuntuのソフトウェアの更新

 

Python3,pip,postgesql,nginx(周辺モジュール)のインストール

 

 

PostgreSQLの設定

 

スポンサードリンク

postgresqlデータベースの作成

 

postgresqlのバージョン確認

今回は→ psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1))

 

状態の確認
クラスターの起動
サーバの起動

 

postgresqlの初期化

 

この先のデータベース作成、ユーザー登録、パスワード設定は、ローカルで開発済みのプロジェクトと同じ設定にしておくと、プロジェクトを本番環境にデプロイした後も管理がしやすくなります。

 

データベースの作成

 

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

 

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

 

タイムゾーン設定

 

ユーザーに権限つける

 

データベース抜ける

 

postgresql起動確認

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

 

postgresqlコンフィグファイルの設定

 

PostgreSQLのリモート接続設定

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

pg_hba.confの編集
下記にように編集します(97行目あたりに追加)。
 

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

PostgreSQL再起動

 

*参考)よく使うPostgreSQLのコマンド

スポンサードリンク

 

or
 


まずは、作成したデータベースのEncodingを調べます

以下のように表示されていると思います。

UTF-8ではなくLATIN1となるのは、UBUNTUのロケール設定をデフォルトのまま設定するとこのようになる場合があります。

UTF-8の設定にするために以下の対策を行います。

 

 

 

以下のように表示されると設定完了です。

もう一度データベースの情報を確認します。

 

UTF-8に設定されていることが、確認できます。

既に作成したデータベースや、コンフィグファイルの設定はリセットされているので、もう一度作成します。

参考)Mysqlで設定する場合

バージョンの確認

mysql  Ver 8.0.25-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

文字化け対策でmy.cnfファイルの編集
以下のコードを追加します。

編集後再起動

Mysqlサーバーへログイン

※パスワード入力際はエンターでOK

テーブル作成

 

ユーザー追加

追加したユーザーへの権限付与

設定の反映

ログアウト

再起動

Virtualenvの仮想環境の構築

 

今回使用するOSのUbuntu0.20.04は、デフォルトでPython3.8.5がインストールされているため、自分でインストールする必要はありません。

 

仮想環境ファイルの作成

 

Pip3 のインストールとアップグレード

 

virtualenvのインストール

 

ホームディレクトリへ移動

 

virtualenvのファイル作成(仮想環境ファイル名はvenvとしています)

 

仮想環境の有効化

仮想環境の実行

 

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

 

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

 

接続ドライバにPyMySQL、パスワードの暗号化対応のためにcryptographyをインストール

 

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

 

本番環境の最低限の環境構築の準備ができましたので、ローカルで開発したDjangoプロジェクトをデプロイします。

 

この記事では、①GitHubを利用する方法、②PyCharm Professional、③VScodeを利用する方法を紹介します。

①GitHubを利用するデプロイ

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

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

 

②PyCharm Professionalを利用するデプロイ

PyCharm Professionalを利用する方法は下記の方法を参考にしてください。

PyCharmでローカルで開発したDjangoプロジェクトを本番環境へデプロイする

 

③VScodeを利用するデプロイ

VScodeを利用する方法は下記の方法を参考にしてください。

VSCodeでDjangoプロジェクトをデプロイ【SFTP利用編】

 


動作確認用Djangoプロジェクトの設置

 

試験的にDjangoの動作の確認だけできれば良い場合は、ここで新規のプロジェクトを作成します。

 

仮想環境の実行を行い、プロジェクトを作成するディレクトリに移動します。
 

settings.pyの編集

 

settings.pyを編集します。

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

 

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

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

 

さらにmanege.pyに以下のコードを追加して編集します。

デプロイ後は、まずローカルからTextの形でエクスポートされたモジュールをインストールします。

 

ローカルからプロジェクトファイルをデプロイする際、migration関係のファイルを含めない設定にしているので、makemigrations , migtate を行います。

 

この段階でサーバーが立ち上がるか確認します。

 

まず、8000番のポートへのアクセスを許可します。

 

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

 

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

 

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

 

スポンサードリンク

settings.py内のセキュリティーに関係する情報が、環境変数で管理していない場合は、対応させます。

 

今回は、django-environ を利用する方法を紹介します。

 

まずは、ライブラリのインストールです。

 

ベースディレクトリ(manage.pyがあるディレクトリ)に.env ファイルを作成し以下のように環境変数で管理したい情報を記入します。

 

settings.pyを編集して、反映させます

 

Gunicornの設定

 

Gunicornの起動と動作の確認

 

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

 

gunicorn単体での起動確認

仮想環境を有効にして下記のコマンドを実行します。project.wsgi とする事で、projectアプリケーション内のwsgi.pyを参照させています。

それぞれのprojectアプリケーションの名前に変更してください。

 

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

 

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

 

8000番ポートが利用されているので、Djangoで起動したサーバーを停止します。
既に[control + c]で停止済みの場合は、一度サーバーを再起動します。

 

 

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

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

 

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

 

確認できたら、control  + c でgnicornを停止します。

仮想環境から抜けます。

 

GunicornをOSの起動時に動作するように設定する

 

gunicorn単体の動作が確認できましたので、OSの起動時に自動的にgunicornが起動するように設定します。

 

gunicornのシステムファイルが含まれるディレクトリに移動します。

 

gunicornのサービスファイル作成

*ここではgunicorn.service というファイル名で作成します。

 

作成したファイルを下記のように編集します。

 

編集後にファイルの動作を確認します。

ファイルが正常に動作するば、何も表示されずコマンドプロンプトが返ってきます。

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

 

OS起動時にgunicornを起動するように設定する。
以下のように表示され、/etc/systemd/system/gunicorn.service にシンボリックリンクが作成される

 

シンボリックリンクと、ソケットが表示されている場所、指定した場所に作成されているか確認します。

 

gunicornのログの表示(何か動作に不具合があるときはこちらにエラー内容が表示される)(終了は ’q’ )

 

 

一度シンボリックリンクを削除して、gunicorn.serviceを編集します。

次にソケットがあるディレクトリに移動してソケットも削除します。

ファイルを変更した後は再読み込みを行います。

gunicornをリスタートします

その後再度、シンボリックリンクを貼り、指定のディレクトリにソケットができている事を確認し再度試します。

 

これでOSの起動時にgunicornが起動する設定ができました。

スポンサードリンク

Nginxの設定

 

これからは、WEBサーバーNginxの設定を行います。

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

 

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

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

 

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

 

次に今回のDjangoプロジェクトで使用するオリジナルのエントリーファイルを作成します。

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

 

作成したエントリーファイルを、新しいサイト(sites-available)のシンボリックリンクに貼る
 

作成したエントリーファイルの検証

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

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

 

Nginxの起動とサイト表示確認

 

8000番ポートの無効化

 

nginxへのアクセス許可

 

Nginxのリスタート

 

gunicornの再起動

 

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

 

 

もう一度configファイルを中心に見直し内容を編集します。

 

編集後は、既に作成済みのシンボリックリンクを削除し、編集し直したもので再度作成します。

 

リスタートして表示を確認します。

 

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

 

独自ドメインの設定

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

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

 

独自ドメインのアクセス許可
Settings.pyの設定
 

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

 

 

すでに設定しているsites-enabledのエントリーファイルを一旦削除します。

 

編集したエントリーファイルのシンボリックリンクをを、sites-availableに貼る
nginx再起動

 

gunicornの再起動

 

SSL化とリダイレクト設定

今回はLet’s Encryptを利用してSSL化を行います。

letsencryptをインストール

 

SSL/TLS サーバ証明書の取得
letsencryptがport80を使用するので、一旦nginxを停止する
 

証明書を取得

 

詳しい方法は下記の記事にて確認してください。

独自ドメインサイトのSSL化(HTTPS化)【Letsencrypt,Ubuntu,Nginx】

 

参考)レート制限がかかると、以下のエラーメッセージが出るので1週間待ってから行う。

 

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

 

 

nginxの起動
 

gunicornの再起動

 

ブラウザでサイトの表示が行われるか、URL欄の表示がhttps対応になっているかを確認します。

スポンサードリンク

letsencryptの証明書更新の自動化

letsencryptの証明書は3ヶ月ごとに更新する必要があります。

自動で更新を行うためにバッジ処理の設定を加えます。

 

詳しい方法は下記の記事にて確認してください。

独自ドメインサイトのSSL化(HTTPS化)【Letsencrypt,Ubuntu,Nginx】

 


本番環境での運用に向けて(static、mediaファイル表示の設定)

 

開発環境

例えばこのようにCSSフォルダを設置しても、Djangoは認識しません。

ですので、settings.pyに設定を加えます。

そうすることで、runserverするごとに設定したファルダから静的ファイルを読み込み、配信してくれます。

 

settings.py

BASE_DIR はプロジェクトディレクトリの絶対パスです。
settings.pyの分割
Djangoはサーバー起動時に読み込むファイルを指定する事ができます
  • 共通で利用するもの(settings_common.py)
  • 本番環境用(settings.py)
  • 開発環境用(settings_dev.py)

この3つに分割します。

 

まず、現在使用中のコードを共通用にコピーして、本番環境用は中身を削除します。

次に開発用を編集します。

共通用のファイルをインポートしています

デバックを使用します

メール送信した際は、内容をコンソールに表示するようにします

 

開発サーバー起動時の読み込みファイルの設定

 

ローカルでサーバーを立ち上げる際は、settings_dev.pyを選択する必要があるので、pycharmのrunserverコマンドに開発用のファイルを読み込むようにします。

 

[runserver]→[edit configuration]を開き

Environment variablesの欄(PYTHONUNBUFFERED=1となっている箇所)を以下のように変更します。

 

その他のエディター使用の際は、ローカル環境でサーバを立ち上げる際にコードを追加して対応します。

スポンサードリンク

開発環境でのメディアファイルの設定

 

画像表示に対応するために、必要なライブラリをインストールします。

 

 

開発環境では、プロジェクトディレクトリ直下にmediaディレクトリを作りその中に保存します。

 

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

settings_dev.py

これでmediaフォルダがベースディレクトリに作成されます。

*mediaフォルダは作成しなくても、初回の画像アップ時に作成されます。

 

以下のコードを編集します。

settings_common.py

これで開発環境内で立ち上げブラウザで確認する際に、表示する画像は↑のURLに続くようになります。

 

上記のメディアファイルの表示に対応させるために、プロジェクトディレクトリのurls.pyに以下のコードを追加します。

これで、開発サーバーでメディアファイルを配信できるようになりました。

 

開発サーバーでのメディアファイル表示確認

これまでの設定を確認するために、画像をアップロードし、サーバー上でその画像を確認する最低限のアプリを追加して、動作を確認します。

 

プロジェクトディレクトリ直下で、uploadアプリを作成します。

 

作成したuploadディレクトリ直下にtemplatesディレクトリを作成し、その中にupload.htmlを作成

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

upload.html  upload/templates

 

view.py upload/

 

urls.py /project

 

settings.py /project

 

これで開発サーバーを立ち上げ、表示と動作を確認できればOKです。

 


本番環境用のメディアファイルの設定

環境開発同様の表示、動作を行えるように本番環境の設定を行います。

 

settings.py

本番環境の場合、STATIC_ROOTとMEDIA_ROOTは開発環境での、ベースディレクトリ下と指定していたものあたります。

スポンサードリンク

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

開発環境ではdDjangoのプロジェクト内の画像をそのまま表示してましたが、本番環境は負担をへらすためnginxから、静的なファイルを表示するようにします。

 

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

 

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

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

 

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

新たに作成したディレクトリに対応させるために、nginxのコンフィグファイルを編集します。

 

記入済みのstaticファイルのコードを削除

 

削除した場所に以下の記入を追加

 

デプロイ後はnginx,guncornの再起動を行います。

 

nginx再起動

 

gunicornの再起動

 

 

本番環境でもファイルのアップロード、表示の確認ができればOKです。

 

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

 


以上、Ubuntu20.04,Python3.7,Nginx,Gunicorn,PostgreSQLを利用して、Djangoプロジェクトの本番環境構築の方法について紹介しました。

 

参考ソース:https://docs.gunicorn.org/en/latest/install.html