CentOS 7でPostgres、Nginx、Gunicornを使用してDjangoをセットアップする方法

前書き

Djangoは強力なWebフレームワークであり、PythonアプリケーションまたはWebサイトの開発を支援します。 Djangoには、ローカルでコードをテストするための簡素化された開発サーバーが含まれていますが、わずかに生産関連の場合でも、より安全で強力なWebサーバーが必要です。

このガイドでは、Djangoアプリケーションをサポートおよび提供するために、CentOS 7にいくつかのコンポーネントをインストールおよび構成する方法を示します。 デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースをセットアップします。 Gunicornアプリケーションサーバーを構成して、アプリケーションとインターフェイスします。 次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。

前提条件と目標

このガイドを完了するには、 `+ sudo +`特権が設定された非rootユーザーを持つ新しいCentOS 7サーバーインスタンスが必要です。 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [初期サーバー設定ガイド]を実行して、これを設定する方法を学ぶことができます。

仮想環境に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
# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128

終了したら、ファイルを保存して閉じます。

新しい構成の変更に伴い、サービスを再起動する必要があります。 また、ブート時に自動的に起動するように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 ;

すべてのコマンドはセミコロンで終了する必要があるため、問題が発生している場合はコマンドがセミコロンで終了することを確認してください。

次に、プロジェクトのデータベースユーザーを作成します。 安全なパスワードを選択してください:

CREATE USER  WITH PASSWORD '';

これで、新しいユーザーに新しいデータベースを管理するアクセス権を与えることができます。

GRANT ALL PRIVILEGES ON DATABASE  TO ;

終了したら、次を入力してPostgreSQLプロンプトを終了します。

\q

次に、「+ postgres +」ユーザーのシェルセッションを終了して、次のように入力して通常のユーザーのシェルセッションに戻ります。

exit

プロジェクト用のPython仮想環境を作成する

データベースの準備ができたので、残りのプロジェクト要件の準備を開始できます。 管理を容易にするために、仮想環境にPython要件をインストールします。

これを行うには、最初に `+ virtualenv `コマンドにアクセスする必要があります。 ` pip +`でこれをインストールできます:

sudo pip install virtualenv

`+ virtualenv +`をインストールすると、プロジェクトの形成を開始できます。 プロジェクトを保持するディレクトリを作成し、その後ディレクトリに移動します。

mkdir ~/
cd ~/

プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。

virtualenv

これにより、「」ディレクトリ内に「」というディレクトリが作成されます。 内部では、Pythonのローカルバージョンと `+ pip +`のローカルバージョンがインストールされます。 これを使用して、プロジェクトの分離されたPython環境をインストールおよび構成できます。

プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力して、それを行うことができます。

source /bin/activate

プロンプトが変わり、Python仮想環境内で操作していることを示す必要があります。 次のようになります: +()@:〜/ $ +

仮想環境をアクティブにして、Django、Gunicorn、および + psycopg2 + PostgreSQLアダプターをローカルインスタンスの `+ pip +`とともにインストールします。

pip install django gunicorn psycopg2

新しいDjangoプロジェクトを作成して構成する

Pythonコンポーネントをインストールすると、実際のDjangoプロジェクトファイルを作成できます。

Djangoプロジェクトを作成する

すでにプロジェクトディレクトリがあるので、ここでファイルをインストールするようDjangoに指示します。 通常の実際のコードで第2レベルのディレクトリを作成し、このディレクトリに管理スクリプトを配置します。 これの鍵は、Djangoに現在のディレクトリにファイルを作成するように指示する最後のドットです。

django-admin.py startproject  .

プロジェクト設定を調整する

新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。 テキストエディターで設定ファイルを開きます。

nano /settings.py

データベースアクセスを構成するセクションを見つけることから始めます。 `+ DATABASES +`で始まります。 ファイル内の構成は、SQLiteデータベース用です。 プロジェクト用にPostgreSQLデータベースをすでに作成しているため、設定を調整する必要があります。

PostgreSQLデータベース情報を使用して設定を変更します。 `+ pip `でインストールした ` psycopg2 `アダプタを使用するようDjangoに指示します。 データベース名、データベースユーザー名、データベースユーザー名のパスワードを指定し、データベースがローカルコンピューターにあることを指定する必要があります。 ` PORT +`設定は空の文字列のままにしておくことができます:

DATABASES = {
   'default': {
       'ENGINE': '',
       'NAME': '',
       'USER': '',
       'PASSWORD': '',
       'HOST': 'localhost',
       'PORT': '',
   }
}

次に、ファイルの一番下まで移動し、静的ファイルを配置する場所を示す設定を追加します。 これは、Nginxがこれらのアイテムのリクエストを処理できるようにするために必要です。 次の行は、Djangoにベースプロジェクトディレクトリの `+ static +`というディレクトリに配置するように指示します。

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

完了したら、ファイルを保存して閉じます。

初期プロジェクトのセットアップを完了する

これで、管理スクリプトを使用して初期データベーススキーマをPostgreSQLデータベースに移行できます。

cd ~/
./manage.py makemigrations
./manage.py migrate

次を入力して、プロジェクトの管理ユーザーを作成します。

./manage.py createsuperuser

ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。

次のように入力して、すべての静的コンテンツを構成したディレクトリの場所に収集できます。

./manage.py collectstatic

操作を確認する必要があります。 静的ファイルは、プロジェクトディレクトリ内の「+ static +」というディレクトリに配置されます。

最後に、次のコマンドでDjango開発サーバーを起動して、プロジェクトをテストできます。

./manage.py runserver 0.0.0.0:8000

ウェブブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」を入力します。

http://:8000

デフォルトのDjangoインデックスページが表示されます。

image:https://assets.digitalocean.com/articles/django_gunicorn_nginx_centos7/django_index.png [Django index page]

アドレスバーのURLの末尾に「+ / admin 」を追加すると、「 createsuperuser」コマンドで作成した管理ユーザー名とパスワードの入力を求められます。

画像:https://assets.digitalocean.com/articles/django_gunicorn_nginx_centos7/admin_login.png [Django admin login]

認証後、デフォルトのDjango管理インターフェースにアクセスできます。

image:https://assets.digitalocean.com/articles/django_gunicorn_nginx_centos7/admin_interface.png [Django admin interface]

探索が終了したら、ターミナルウィンドウでCTRL-Cを押して、開発サーバーをシャットダウンします。

Gunicornのプロジェクト提供能力のテスト

仮想環境を離れる前にやりたい最後のことは、Gunicornをテストして、アプリケーションにサービスを提供できることを確認することです。 次のように入力することで、これを簡単に行うことができます。

cd ~/
gunicorn --bind 0.0.0.0:8000 .wsgi:application

これにより、Django開発サーバーが実行されていたのと同じインターフェースでGunicornが起動します。 戻ってアプリをもう一度テストできます。 Gunicornはこれに関与する静的コンテンツを知らないため、管理インターフェイスにはスタイルが適用されないことに注意してください。

Pythonのモジュール構文を使用して、アプリケーションへのエントリポイントであるDjangoの `+ wsgi.py `ファイルへの相対ディレクトリパスを指定して、Gunicornにモジュールを渡しました。 このファイルの内部には、アプリケーションとの通信に使用される「 application +」という関数が定義されています。 WSGI仕様の詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14をクリックしてください。 -04#definitions-and-concepts [こちら]。

テストが終了したら、ターミナルウィンドウでCTRL-Cを押してGunicornを停止します。

これで、Djangoアプリケーションの構成が完了しました。 次のように入力して、仮想環境からバックアウトできます。

deactivate

Gunicorn Systemd Serviceファイルを作成する

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=
Group=nginx
WorkingDirectory=/home//
ExecStart=/home////bin/gunicorn --workers 3 --bind unix:/home///.sock .wsgi:application

最後に、 `+ [Install] +`セクションを追加します。 これにより、起動時に起動できるようにした場合、このサービスをリンクする対象がSystemdに通知されます。 通常のマルチユーザーシステムが稼働しているときにこのサービスを開始する必要があります。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=
Group=nginx
WorkingDirectory=/home//
ExecStart=/home////bin/gunicorn --workers 3 --bind unix:/home///.sock .wsgi:application

[Install]
WantedBy=multi-user.target

これで、Systemdサービスファイルが完成しました。 今すぐ保存して閉じます。

これで、作成したGunicornサービスを開始し、起動時に開始できるように有効化できます。

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

NunicornをGunicornにプロキシパスするように構成する

Gunicornがセットアップされたので、プロセスにトラフィックを渡すようにNginxを構成する必要があります。

Nginx構成ファイルを変更する

メインのNginx構成ファイルを編集して、サーバーブロック構成を変更できます。

sudo nano /etc/nginx/nginx.conf

内部で、既に存在するサーバーブロックのすぐ上に新しいサーバーブロックを開きます。

http {
   . . .

   include /etc/nginx/conf.d/*.conf;




   server {
       listen 80 default_server;

       . . .

Djangoアプリケーションのすべての構成をこの新しいブロック内に配置します。 このブロックが通常のポート80でリッスンし、サーバーのドメイン名またはIPアドレスに応答するように指定することから始めます。

server {
   listen 80;
   server_name ;
}

次に、ファビコンを見つける際の問題を無視するようにNginxに指示します。 また、 `+〜// static +`ディレクトリで収集した静的アセットの場所を指定します。 これらのファイルにはすべて「/ static」の標準URIプレフィックスが付いているため、これらの要求に一致する場所ブロックを作成できます。

server {
   listen 80;
   server_name ;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home//;
   }
}

最後に、他のすべてのリクエストに一致するように、 `+ location / {} +`ブロックを作成します。 この場所内で、Gunicornがリモートクライアント接続に関する情報を取得できるように、標準のプロキシHTTPヘッダーを設定します。 次に、Gunicorn Systemdユニットファイルで指定したソケットにトラフィックを渡します。

server {
   listen 80;
   server_name ;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home//;
   }

   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///.sock;
   }
}

完了したら、ファイルを保存して閉じます。

グループメンバーシップとアクセス許可を調整する

`+ nginx `ユーザーは、静的ファイルを提供したり、ソケットファイルにアクセスしたりできるように、アプリケーションディレクトリにアクセスできる必要があります。 CentOSは各ユーザーのホームディレクトリを非常に厳しくロックダウンするため、ユーザーのグループに「 nginx +」ユーザーを追加して、これが機能するために必要な最小限の権限を開放できるようにします。

次のコマンドを使用して、 `+ nginx `ユーザーをグループに追加します。 コマンドの「+」を独自のユーザー名に置き換えます。

sudo usermod -a -G  nginx

これで、ユーザーグループにホームディレクトリの実行許可を与えることができます。 これにより、Nginxプロセスは次の範囲内でコンテンツを入力およびアクセスできます。

chmod 710 /home/

アクセス許可を設定したら、Nginx構成ファイルの構文エラーをテストできます。

sudo nginx -t

エラーが存在しない場合は、次を入力してNginxサービスを再起動します。

sudo systemctl start nginx

次のように入力して、起動時にNginxサーバーを起動するようにinitシステムに指示します。

sudo systemctl enable nginx

これで、ポートを指定せずに、サーバーのドメイン名またはIPアドレスを介して、ブラウザーでDjangoアプリケーションにアクセスできるはずです。

結論

このガイドでは、独自の仮想環境でDjangoプロジェクトを設定しました。 Djangoがクライアントリクエストを処理できるように、クライアントリクエストを変換するようにGunicornを設定しました。 その後、Nginxを設定してリバースプロキシとして機能し、クライアント接続を処理し、クライアントのリクエストに応じて正しいプロジェクトを提供します。

Djangoは、多くの共通部分を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明した一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。

Related