CentOS 7でPostgres、Nginx、Gunicornを使用してDjangoを設定する方法
序章
Djangoは、PythonアプリケーションまたはWebサイトを立ち上げるのに役立つ強力なWebフレームワークです。 Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に少しでも関連する場合は、より安全で強力なWebサーバーが必要です。
このガイドでは、Djangoアプリケーションをサポートおよび提供するためにCentOS7にいくつかのコンポーネントをインストールおよび構成する方法を示します。 デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースをセットアップします。 アプリケーションとインターフェイスするようにGunicornアプリケーションサーバーを構成します。 次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。
前提条件と目標
このガイドを完了するには、sudo
権限が設定されたroot以外のユーザーがいる新しいCentOS7サーバーインスタンスが必要です。 初期サーバーセットアップガイドを実行すると、これをセットアップする方法を学ぶことができます。
仮想環境内にDjangoをインストールします。 プロジェクトに固有の環境にDjangoをインストールすると、プロジェクトとその要件を個別に処理できるようになります。
データベースとアプリケーションを起動して実行したら、Gunicornアプリケーションサーバーをインストールして構成します。 これは、アプリケーションへのインターフェイスとして機能し、HTTPのクライアントリクエストをアプリケーションが処理できるPython呼び出しに変換します。 次に、Gunicornの前にNginxをセットアップして、その高性能接続処理メカニズムと実装が容易なセキュリティ機能を活用します。
始めましょう。
EPELおよびCentOSリポジトリからパッケージをインストールします
プロセスを開始するには、CentOSリポジトリから必要なすべてのアイテムをダウンロードしてインストールします。 また、メインのCentOSリポジトリに含まれていない追加のパッケージが含まれているEPELリポジトリを使用する必要があります。 後で、Pythonパッケージマネージャーpip
を使用して、いくつかの追加コンポーネントをインストールします。
まず、EPELリポジトリを有効にして、必要なコンポーネントを取得できるようにします。
sudo yum install epel-release
新しいリポジトリが利用可能になると、必要なすべての要素を1つのコマンドでインストールできます。
sudo yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gcc nginx
これにより、Pythonパッケージマネージャーであるpip
がインストールされます。 また、PostgreSQLデータベースシステムと、それを操作して構築するために必要ないくつかのライブラリやその他のファイルもインストールされます。 pip
がソフトウェアをビルドできるようにGCCコンパイラを組み込み、インストールのリバースプロキシとして使用するためにNginxをインストールしました。
Django用にPostgreSQLをセットアップする
すぐにジャンプして、インストール用にPostgreSQLをセットアップします。
PostgreSQLの設定と起動
まず、PostgreSQLデータベースを初期化する必要があります。 次のように入力することでそれを行うことができます。
sudo postgresql-setup initdb
データベースが初期化されたら、次のように入力してPostgreSQLサービスを開始できます。
sudo systemctl start postgresql
データベースを起動したら、実際に入力された構成ファイルの1つで値を調整する必要があります。 エディタとsudo
コマンドを使用して、今すぐファイルを開きます。
sudo nano /var/lib/pgsql/data/pg_hba.conf
このファイルは、データベースシステムの認証方法を構成する役割を果たします。 現在、システムユーザーがデータベースユーザーと一致する場合にのみ接続を許可するように構成されています。 これはローカルメンテナンスタスクには問題ありませんが、Djangoインスタンスにはパスワードで構成された別のユーザーがいます。
これは、ファイルの下部にある2つのhost
行を変更することで構成できます。 最後の列(認証方法)をmd5
に変更します。 これにより、パスワード認証が可能になります。
. . .
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
#host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 md5
# IPv6 local connections:
#host all all ::1/128 ident
host all all ::1/128 md5
終了したら、ファイルを保存して閉じます。
新しい構成の変更に伴い、サービスを再起動する必要があります。 また、PostgreSQLを有効にして、起動時に自動的に起動するようにします。
sudo systemctl restart postgresql
sudo systemctl enable postgresql
PostgreSQLデータベースとユーザーを作成する
PostgreSQLが希望どおりに稼働しているので、Djangoアプリケーション用のデータベースとデータベースユーザーを作成できます。
Postgresをローカルで使用するには、一時的にpostgres
システムユーザーに変更することをお勧めします。 次のように入力して、今すぐ実行してください。
sudo su - postgres
postgres
ユーザーとして操作している場合は、それ以上の認証なしでPostgreSQLインタラクティブセッションに直接ログインできます。 これは、pg_hba.conf
ファイルで変更しなかった行が原因です。
psql
要件を設定できるPostgreSQLプロンプトが表示されます。
まず、プロジェクトのデータベースを作成します。
CREATE DATABASE myproject;
すべてのコマンドはセミコロンで終了する必要があるため、問題が発生している場合は、コマンドがセミコロンで終了していることを確認してください。
次に、プロジェクトのデータベースユーザーを作成します。 安全なパスワードを選択してください。
CREATE USER myprojectuser WITH PASSWORD 'password';
これで、新しいユーザーに新しいデータベースを管理するためのアクセス権を与えることができます。
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
終了したら、次のように入力してPostgreSQLプロンプトを終了します。
\q
ここで、postgres
ユーザーのシェルセッションを終了し、次のように入力して通常のユーザーのシェルセッションに戻ります。
exit
プロジェクト用のPython仮想環境を作成します
データベースの準備ができたので、残りのプロジェクト要件の準備を開始できます。 管理を容易にするために、Python要件を仮想環境内にインストールします。
これを行うには、最初にvirtualenv
コマンドにアクセスする必要があります。 これはpip
でインストールできます。
sudo pip install virtualenv
virtualenv
をインストールすると、プロジェクトの形成を開始できます。 プロジェクトを保持するディレクトリを作成し、後でそのディレクトリに移動します。
mkdir ~/myproject
cd ~/myproject
プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。
virtualenv myprojectenv
これにより、myproject
ディレクトリ内にmyprojectenv
というディレクトリが作成されます。 内部には、Pythonのローカルバージョンとpip
のローカルバージョンがインストールされます。 これを使用して、プロジェクト用に分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力すると、次のように入力できます。
source myprojectenv/bin/activate
プロンプトが変化して、Python仮想環境内で操作していることを示します。 (myprojectenv)user@host:~/myproject$
のようになります。
仮想環境をアクティブにして、Django、Gunicorn、およびpsycopg2
PostgreSQLアダプターをpip
のローカルインスタンスとともにインストールします。
pip install django gunicorn psycopg2
新しいDjangoプロジェクトを作成して構成する
Pythonコンポーネントをインストールすると、実際のDjangoプロジェクトファイルを作成できます。
Djangoプロジェクトを作成する
すでにプロジェクトディレクトリがあるので、ここにファイルをインストールするようにDjangoに指示します。 通常の実際のコードを使用して第2レベルのディレクトリを作成し、このディレクトリに管理スクリプトを配置します。 これの鍵は、Djangoに現在のディレクトリにファイルを作成するように指示する最後のドットです。
django-admin.py startproject myproject .
プロジェクト設定を調整する
新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。 テキストエディタで設定ファイルを開きます。
nano myproject/settings.py
データベースアクセスを構成するセクションを見つけることから始めます。 DATABASES
で始まります。 ファイル内の構成はSQLiteデータベース用です。 プロジェクト用にPostgreSQLデータベースを作成済みなので、設定を調整する必要があります。
PostgreSQLデータベース情報で設定を変更します。 pip
とともにインストールしたpsycopg2
アダプターを使用するようにDjangoに指示します。 データベース名、データベースユーザー名、データベースユーザー名のパスワードを指定してから、データベースがローカルコンピューター上にあることを指定する必要があります。 PORT
設定は空の文字列のままにしておくことができます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
次に、ファイルの一番下に移動し、静的ファイルを配置する場所を示す設定を追加します。 これは、Nginxがこれらのアイテムのリクエストを処理できるようにするために必要です。 次の行は、ベースプロジェクトディレクトリのstatic
というディレクトリにそれらを配置するようにDjangoに指示しています。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
終了したら、ファイルを保存して閉じます。
プロジェクトの初期設定を完了する
これで、管理スクリプトを使用して、初期データベーススキーマをPostgreSQLデータベースに移行できます。
cd ~/myproject
./manage.py makemigrations
./manage.py migrate
次のように入力して、プロジェクトの管理ユーザーを作成します。
./manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。
次のように入力して、構成したディレクトリの場所にすべての静的コンテンツを収集できます。
./manage.py collectstatic
操作を確認する必要があります。 静的ファイルは、プロジェクトディレクトリ内のstatic
というディレクトリに配置されます。
最後に、次のコマンドを使用してDjango開発サーバーを起動することにより、プロジェクトをテストできます。
./manage.py runserver 0.0.0.0:8000
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に:8000
を続けます。
http://server_domain_or_IP:8000
デフォルトのDjangoインデックスページが表示されます。
アドレスバーのURLの末尾に/admin
を追加すると、createsuperuser
コマンドで作成した管理ユーザー名とパスワードの入力を求められます。
認証後、デフォルトのDjango管理インターフェースにアクセスできます。
探索が終了したら、ターミナルウィンドウでCTRL-Cを押して、開発サーバーをシャットダウンします。
プロジェクトにサービスを提供するGunicornの能力をテストする
仮想環境を離れる前に最後にやりたいことは、Gunicornをテストして、アプリケーションに対応できることを確認することです。 これは、次のように入力することで簡単に実行できます。
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
これにより、Django開発サーバーが実行されていたのと同じインターフェースでGunicornが起動します。 戻ってアプリをもう一度テストできます。 Gunicornはこれに関与する静的コンテンツを認識していないため、管理インターフェースにはスタイルが適用されないことに注意してください。
Pythonのモジュール構文を使用して、アプリケーションへのエントリポイントであるDjangoのwsgi.py
ファイルへの相対ディレクトリパスを指定することにより、Gunicornにモジュールを渡しました。 このファイルの中には、application
という関数が定義されており、アプリケーションとの通信に使用されます。 WSGI仕様の詳細については、ここをクリックをクリックしてください。
テストが終了したら、ターミナルウィンドウでCTRL-Cを押してGunicornを停止します。
これで、Djangoアプリケーションの構成が完了しました。 次のように入力すると、仮想環境から戻ることができます。
deactivate
GunicornSystemdサービスファイルを作成する
GunicornがDjangoアプリケーションと対話できることをテストしましたが、アプリケーションサーバーを起動および停止するためのより堅牢な方法を実装する必要があります。 これを実現するために、Systemdサービスファイルを作成します。
テキストエディタでsudo
権限を持つGunicornのSystemdサービスファイルを作成して開きます。
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
セクションから始めます。このセクションは、メタデータと依存関係を指定するために使用されます。 ここにサービスの説明を入力し、ネットワークターゲットに到達した後にのみこれを開始するようにinitシステムに指示します。
[Unit]
Description=gunicorn daemon
After=network.target
次に、[Service]
セクションを開きます。 実行する処理を行うユーザーとグループを指定します。 プロセスは関連するすべてのファイルを所有しているため、通常のユーザーアカウントにプロセスの所有権を付与します。 Nginxユーザーグループに所有権を付与して、Gunicornと簡単に通信できるようにします。
次に、作業ディレクトリをマップし、サービスの開始に使用するコマンドを指定します。 この場合、仮想環境内にインストールされているGunicorn実行可能ファイルへのフルパスを指定する必要があります。 Nginxは同じコンピューターにインストールされているため、プロジェクトディレクトリ内のUnixソケットにバインドします。 これは、ネットワークポートを使用するよりも安全で高速です。 ここでは、オプションのGunicornの微調整を指定することもできます。 たとえば、この場合、3つのワーカープロセスを指定しました。
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
最後に、[Install]
セクションを追加します。 これにより、起動時にサービスを開始できるようにした場合に、このサービスを何にリンクするかがSystemdに通知されます。 このサービスは、通常のマルチユーザーシステムが稼働しているときに開始する必要があります。
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=user
Group=nginx
WorkingDirectory=/home/user/myproject
ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
これで、Systemdサービスファイルが完成しました。 今すぐ保存して閉じます。
これで、作成したGunicornサービスを開始し、起動時に開始するように有効にすることができます。
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
NginxをGunicornへのプロキシパスに設定する
Gunicornがセットアップされたので、トラフィックをプロセスに渡すようにNginxを構成する必要があります。
Nginx構成ファイルを変更します
メインのNginx構成ファイルを編集して、サーバーブロック構成を変更できます。
sudo nano /etc/nginx/nginx.conf
内部で、すでに存在するサーバーブロックのすぐ上にある新しいサーバーブロックを開きます。
http {
. . .
include /etc/nginx/conf.d/*.conf;
server {
}
server {
listen 80 default_server;
. . .
Djangoアプリケーションのすべての構成をこの新しいブロック内に配置します。 まず、このブロックが通常のポート80でリッスンし、サーバーのドメイン名またはIPアドレスに応答するように指定します。
server {
listen 80;
server_name server_domain_or_IP;
}
次に、ファビコンの検索に関する問題を無視するようにNginxに指示します。 また、~/myproject/static
ディレクトリで収集した静的アセットの場所も示します。 これらのファイルはすべて「/static」の標準URIプレフィックスを持っているため、これらのリクエストに一致するロケーションブロックを作成できます。
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/myproject;
}
}
最後に、他のすべてのリクエストに一致するlocation / {}
ブロックを作成します。 この場所の内部で、Gunicornがリモートクライアント接続に関する情報を取得できるように、いくつかの標準プロキシHTTPヘッダーを設定します。 次に、GunicornSystemdユニットファイルで指定したソケットにトラフィックを渡します。
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/myproject;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}
終了したら、ファイルを保存して閉じます。
グループのメンバーシップと権限を調整する
nginx
ユーザーは、静的ファイルを提供したり、ソケットファイルにアクセスしたりできるように、アプリケーションディレクトリにアクセスできる必要があります。 CentOSは、各ユーザーのホームディレクトリを非常に制限的にロックダウンするため、nginx
ユーザーをユーザーのグループに追加して、これを機能させるために必要な最小限のアクセス許可を開くことができるようにします。
次のコマンドを使用して、nginx
ユーザーをグループに追加します。 コマンドのuser
を自分のユーザー名に置き換えます。
sudo usermod -a -G user nginx
これで、ユーザーグループにホームディレクトリに対する実行権限を与えることができます。 これにより、Nginxプロセスは以下のコンテンツを入力してアクセスできるようになります。
chmod 710 /home/user
権限を設定すると、Nginx構成ファイルの構文エラーをテストできます。
sudo nginx -t
エラーがない場合は、次のように入力してNginxサービスを再起動します。
sudo systemctl start nginx
次のように入力して、起動時にNginxサーバーを起動するようにinitシステムに指示します。
sudo systemctl enable nginx
これで、ポートを指定せずに、サーバーのドメイン名またはIPアドレスを介してブラウザーでDjangoアプリケーションにアクセスできるようになります。
結論
このガイドでは、独自の仮想環境でDjangoプロジェクトをセットアップしました。 Djangoがクライアントリクエストを処理できるように、クライアントリクエストを変換するようにGunicornを設定しました。 その後、クライアント接続を処理し、クライアントの要求に応じて正しいプロジェクトを提供するリバースプロキシとして機能するようにNginxを設定します。
Djangoは、多くの一般的な要素を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明する一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。