FedoraにPostgreSQL 11をインストールする方法

FedoraにPostgreSQLをインストールする

今日はFedoraにPostgreSQLのデータベースをインストールする方法を紹介します。FedoraはLinuxのディストロの中でも安定性とソフトウェアが最新にそろっていることで知られています。Debian(Ubuntu)を使わない場合で、さらにキレイなデスクトップを使いたい方は是非Fedoraがお勧めです。またPostgreSQLはオープンソースで実際のプロダクションでも使用できるリレーショナルデータベースです。ぜひ活用してください。 Fedoraのバージョンの確認 では早速、Fedoraのバージョンを確認しましょう。 システムのアップデート Postgresをインストールする前にシステムが最新のものになっているかを確認しましょう。 最後に再起動を忘れずに。 PostgreSQL Yum Repositoryを追加 PostgresのリポジトリをFedoraのシステムに追加します。 このコマンドを実行するとインストールをするか再度きかれるのでyを入力してエンターを押します。 PostgreSQL Server and Client packagesを追加 次にPostgreSQLのサーバーとクライアントパッケージを追加します。 これも本当にインストールしてよいか聞かれるのですべてにyで答えて進めます。 データベースのイニシャライズと自動スタート では、データベースをイニシャライズし、OSの起動と同時にデータベースのサーバーも起動するように設定します。 ここまでできたら、postgreSQLが間違いなく起動しているか確かめてみましょう。 問題ないですね。 PostgreSQLのコンフィグファイル PostgreSQLのコンフィグファイルは下記のファイルパスにあります。 /var/lib/pgsql/11/data/postgresql.conf ファイヤーウォールの設定 もしローカルホストではなくネットワークからPostgreSQLにアクセスをさせる場合はファイアウォールで許可させます。 PostgreSQLへのリモートアクセスを許可 /var/lib/pgsql/11/data/postgresql.confのコンフィグファイルを編集してすべてのIPからのアクセスを許可できます。 PostgreSQLにリモートアクセスを許可させます。 PostgreSQLのサービスをリスタートさせてコンフィグファイルを再読み込みさせます。 PostgreSQLアドミンユーザーのパスワード PostgreSQLにアドミン権限を与えます。 ではユーザーとデータベースを作成します。 もしcreatedb: could not connect to database template1: FATAL: Peer authentication failed for user “ユーザー名”のエラーが出た場合はpg_hba.confのコンフィグファイルでパスワードでデータベースを作成できるようにします。 では作成したデータベースを見てみましょう。 ここでデータベースの所有者やDB名が確認できます。 では今日はここまでです。 お疲れ様でした。

Pythonでpsycopg2を使ってみる

Python Psycopg2 使い方

今日はPythonを使ってローカルのPostgreSQLのデータベースとつなげてみます。 今日の環境 psycopg2のインストール ではpipを使って、psycopg2をインストールしていきます。これは、PostgreSQLのデータベースのアダプターになります。 OKですね。 DBに接続する ではPgAdmin4、もしくはコマンドラインからデータベースと接続したテーブルがあることを確認しましょう。 接続したらちゃんと接続を閉じるのでそこまで書きます。 DBに接続できなかった時にエラーを出す方法 ダミーのデータを入れる 次にPythonでテーブルのデータを表示させる前にデータを入れておきます。 PostgreSQLのデータベースのデータを表示 では下記のコードで実際のデータベースのlistingテーブルのデータを表示させます。 では、コマンドプロンプトで試すとデータが表示されました! psycopg2でレコードを追加する では、PyhtonからPostgreSQLのデータベースにデータ(レコード)を追加しましょう。 下記のコードを追加しましょう。 レコードが追加されました! CSVファイルからデータベースに書き込む ではCSVファイルを使って、Postgresのターブルにデータをコピーさせます。 該当するカラムにデータを流し込む 先ほどのやり方だと、データベースのテーブルのカラムとCSVファイルのヘッダーの数が一致しないとシンタックスエラーとかになります。 これで解決します。 とりあえず、今日はこれくらいで! お疲れ様です。

PostgreSQLでクエリを書こう②

クエリの書き方

前回はクエリでCRUD(Create,Read,Update,Delete)を行いました。今日はその続きです。 リレーショナルなデータとは データ同士でつながっているものがありますね。例えば、レストランなら、会社の情報、メニューの情報、お客さんの情報は、それぞれ別のデータベースのテーブルに格納されますが、そのうちのカラムは他のテーブルに依存することになります。 下記に、その関係となる3つのタイプを紹介します。 Foreign key (外部キー)を作る では、FOREIGN KEYのあるテーブルを作ってみましょう。 CONSTRAINTはデータベースにこのカラムが特別であることを教えてあげます。慣習的に外部キーを使う場合はfk_で名称を付けてあげます。 FOREIGN KEYが先ほど説明した外部キーのことです。user_idが外部キーになることを教えてあげます。 REFERENCEはどのテーブルのどのカラムが対象になるか指定してあげています。 テーブルができました。 データを追加する データ外部キーの部分をuserテーブルidの1としてサンプルのデータを追加してみます。 データが入りました。 しかし、このままだとユーザー1が誰か分かりませんね。 JOINのコマンドでデータを結合して表示させてみます。 これで外部キーが結合されたデータが表示されました。

PostgreSQLでCRUDのクエリを書こう①

クエリの書き方

お疲れ様です。今日はPostgreSQLについて紹介します。PostgreSQLは1996年に市場に出てから多くの参考書や動画で色々説明しているので詳しい説明は省きます。 知っておくべきことを順番にまとめたので分からないところは自分で調べてください。 PostgreSQLがインストールされているところまで進めてもらえると分かりやすいです。 PostgreSQLってなに? リレーショナルデータベースのことです。 SQLのクエリを使ってデータベースを操作することができます。 テーブルって何? MSのエクセルやスプレッドシートをイメージしてください。 テーブルはカラム(行)とロウ(段)でできています。そこにデータが保管されます。 PgAdmin4 PgAdmin4はPostgreSQLが提供するUIツールです。ここでデータベースの操作を画面を使って操作できます。PostgreSQLのインストールの際に一緒にインストールしたかと思います。 スキーマ(Schema)って何? テーブルをまとめているものです。 なぜSQLを書く必要があるの もし、UIパネルから同じことができるならなぜSQLを書く必要があるのでしょうか? それは、PythonなどでPosgreSQLに指示をする際にコードで書いてあげないといけないからです。 これらを自動化するためにはやはりクエリを覚えておかないといけないのですね。 SQLを書く では、PgAdmin4からQueryToolを開きましょう。 ;(セミコン)を忘れない ;(セミコロン)はクエリの最後に必ずつけます。これでクエリが終わりであることを宣言してあげます。 これがないとエラーが出るので忘れないように。 テーブルを作る では、クエリツールを開いたら下記のようにクエリを書いていきます。プロフィールのテーブルを例とします。 SQLの世界では、CREATE TABLEやPRIMARY KEYなどのキーワードは大文字で書きます。(大文字でなくても実行できますが) テーブルに関係するもの、自分で命名したもの(カラム名など)は小文字で書きます。 この場合、id、name、email、password、ageはカラム名になります。その右にあるのがデータタイプです。 VARCHARはストリング(文字、テキスト)のデータタイプになります。(255)は最大で255文字まで入力できるという事になります。 INTは数字のデータになります。 指定した以外のデータはそれぞれのカラムに入力できないようになっています。 SERIALはデータが作成されるとデータベース側で自動で数字が+1されます。 PRIMARY KEYはユニークなデータで他のデータと被らないものになります。 クエリを実行する では、クエリツールの再生ボタンを押して、書いたクエリを実行します。 ※テーブルを作成するデータベースが選択されていることを確認してね。 サクセス(成功)の返事が返ってきました。ありがとう。 作成したテーブルを見る では、スキーマの下にTable(テーブル)があるのでそれをクリックして先ほど作成したProfileテーブルを右クリックしてViewを押し、表示させます。 データが空のテーブルが表示されました! テーブル名は慣習的にsの付かない単数形で記載することが多いです。なのでprofilesではなくprofileになります。(どっちでもいいんだけどね) ユーザーテーブルを作成する では、先ほどのProfileテーブルを削除します。単純にテーブルのアイコンを右クリックしてDelete/Dropを押すだけです。データがある場合はそれも全部消えてしまいます。 次にユーザーテーブルを同じクエリで作成してみます。 ここで気が付いてほしいのが”user”とダブルクオーテーションで囲っていることです。userやtableはpostgresのキーワードなので、このようにキーワードをストリングにしてあげないといけないのですね。 ちなみにシングルクォーテーションではエラーが出ます。 データを追加する では下記のようにデータを追加するクエリを書きます。 VALUESの後に、指定した順に、データを教えてあげます。ストリングのデータはシングルクオートで囲ってあげます。ここはダブルクォーテーションだとエラーが出ます。 で、実行してあげると同じようにテーブルにデータが追加されました。 IDも自動で追加されましたね。 データを表示させる では追加したデータを表示させる(選択する)クエリを書きます。 … Read more

WindowsにPostgreSQLをインストールする

PostgreSQLをインストールしよう

今日はPostgreSQLのデータベースをWindowsにインストールする手順を説明します。 では下記のサイトからインストーラーをダウンロードします。 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 特に指定がない場合は最新版のバージョン15をダウンロードしましょう。 ダウンロードできたら、.exeの実行ファイルをクリックしてインストールを始めます。 Nextを押します。 ファイルの保管場所を教えてあげます。通常はこのままでOKです。 Stack Builderは使わないかもしれないのでチェックをはじしてもOkです。 後は使うと思うのでそのままにしてNextを押します。 データを保管するディレクトリです。これもこのままNextです。 postgresユーザーのパスワードを設定します。 後からつかうので忘れないものに! 次にポートの設定です。 外からアクセスする場合にポート番号を指定してあげます。(データベースがアパートのビルなら、ポートはそのドア番号みたいなものです。) Localです。 これはデフォルトのままでOKです。 で、Next。 インストールを開始だっ。 インストールが始まります。。。 あとちょっとだね。 インストールが完了しました。 最後のチェックボックスは外してFinishして大丈夫です。 とくに追加でインストールしたツールとかはないので。 おまけ もし、コマンドラインからPSQLを実行したい場合は環境変数にPostgresのパスを登録してあげる必要があります。 それは調べてやってみてください。

DjangoをPostgreSQLに接続しよう

DjangoアプリをPostgreSQLに接続しよう

PostgreSQLのインストール

では自分が使っているPCにPostgresをインストールしましょう。

本番環境ではUbuntuとかのLinuxのサーバーにPostgresを入れなおすことになりますが、テスト環境として入れておいたら後からコードも書き直さなくてよいので準備しておきます。

Postgresの公式サイト

https://www.postgresql.org/

インストールはここから

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

この際にDB名とユーザー名、そのPWを保管しておきましょう。

 psycopg2のインストール

ではDjangoがPostgreSQLのデータベースとコミュニケーションを取るためのアダプターをインストールします。

pip install psycopg2

https://github.com/psycopg/psycopg2

Settings.pyの設定

ではSSQLiteの設定をコメントアウトして下記の用に設定していきます。

DATABASES = {

   'default': {

       'ENGINE': 'django.db.backends.postgresql',

       'NAME': '<database_name>',

       'USER': '<database_username>',

       'PASSWORD': '<password>',

       'HOST': '<database_hostname_or_ip>',

       'PORT': '<database_port>',

   }

}

あとはいつも通りにDBのマイグレーションを行います。

python manage.py makemigrations

python manage.py migrate

python manage.py createsuperuser

http://127.0.0.1:8000/admin/

DjangoをUbuntu(22.04)からデプロイする

先に知っておくべきこと

・SSHの概念、簡単なコマンド

・IPアドレスの基礎

・Linuxの基礎

・Djangoフレームワークの基礎

準備するもの

・レンタルサーバーにSSHで入れる状態、若しくは

・自宅のゴミPCにUbuntuサーバーが入った状態

今日の課題

今日は自分で作ったDjangoアプリをデプロイする作業を行います。いつもLinuxを使っていない方には混乱する作業が多いと思います。

もし難しいと思ったらLinuxをインストールしてみてターミナル(コマンドライン)をいじってみたりSSHで接続してプログラムをインストールする練習をしてみてください。

SSHでサーバーに入る

SSHはセキュアセルといってコマンドラインからネットワークを通して他のサーバー等に接続するテクノロジーの事です。

まずは、SSHクライアントでサーバーに入り込みましょう。

別の記事で詳しく説明しますが、サーバー側でOpenSSH等でサーバーを設定してポートを開けておきます。

私の場合は、MobaXtermという無料のSSHクライアントを使います。

MobaXtermはこちらはから、インストーラかポータブルのアプリをダウンロードできます。

https://mobaxterm.mobatek.net/

で、セッション開始!

Host側(サーバー側)にアクセスしたいIPアドレスを入力し、usernameにサーバーで作成したユーザーネームを入力します。レンタルサーバーでOSを作成した際にrootのPWを設定した場合はusernameはrootになります。

SSHでログイン出来たら

では、SSHでログインできたらちょっとコーヒー休憩。ここでサーバーの中に入り込めたという事ですね。

では、Ubuntuの設定を行い、Djangoのデプロイに必要なdependency(デペンデンスィー:必要なライブラリ等)をインストールしていきます。

sudo apt update

OSのアップデートが終わりました。

では、Python3が入っていることを確かめましょう。

python3 --version


このサーバーにpythonの3.9.7が入っていることが確認できました。

※python2でもできますが、2020年の1月に公式サポートが終了したのでバージョン3をお勧めします。

では次。

Ubuntuユーザーの作成

もし、Ubuntuでユーザーを作成していない場合は新しくubuntuにユーザーを追加しましょう。

すでにroot以外のUbuntuユーザーがある場合は飛ばしてください。

sudo adduser ユーザー名
sudo adduser dan

usermod -aG sudo ユーザー名(ユーザーにsudo権限を与える)
usermod -aG sudo dan

sudo adduser dan www-data

rootからユーザーに入れ替える。

su ユーザー名 ※(rootで入っている場合はユーザーに入れ替えます。)
su dan

ライブラリのインストールと設定

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl


このコマンドで下記のライブラリがインストールされます。

python3-pipはパッケージマネージャー

python3-devはスタティックライブラリ、デベロップメントツール

Libpq-devはクライアント側からpostgresにクエリを流すツール

postgresql-contribはエクステンション

nginxはウェブサーバー

curlはClient URLの略でコマンドラインツール

本当にインストールしますか?と聞かれたらyとタイプ(yesのy)

もしくはインストールの際に最後に-yを打ちます。

PostgreSQLのデータベースを作成

Postgresのdb(データベース)を作ったことがある人ならここは簡単です。

postgresをインストールしたときに自動でpostgres というアドミン権限のユーザーが作成されます。

この権限を使って新しいデータベースとユーザーを作成します。

sudo -u postgres psql

postgres=#に現在のディレクトリが変わったことでpostgresに入れたことが確認できます。

CREATE DATABASE myproject; myprojecyはDB名

でdbを作成します。myprojectの部分はdb名になるので好きな名前でどうぞ。

【注意】

SQLのコマンドは全てセミコロン;で終わります。必ずつけ忘れないように!

エラーがでずに次に進めたらdbができたはずです。

これを確認するには\l(バックスラッシュと小文字のL)です。

これで現在のdbがList(一覧)で表示されました。

PostgreSQLのユーザーを作成

CREATE USER myprojectuser WITH PASSWORD 'password';

このコマンドでユーザーとそのパスワードを作成します。

Myprojectuserはユーザー名なのでお好きなものを。

‘Password’ の部分も自分で決めたパスワードを入力。

PostgreSQLをモディファイ(修正)

ではpostgresの接続をスムースにするためにコネクションパラメーターを変えます。

まずはエンコーディングをutf-8に変えます。

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';

次に下のコマンドでpostgresがコミット(確定)したデータのみを読み取るようにします。

ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';

Djangoのタイムゾーンがデフォルト(初期設定)でUTCにセットさせているのでそれに合わせます。

ALTER ROLE myprojectuser SET timezone TO 'UTC';

Djangoのドキュメンテーションを読んで変更したい箇所があれば詳しく見てみましょう。

https://docs.djangoproject.com/en/4.0/ref/databases/#optimizing-postgresql-s-configuration

作成したユーザーにdbのアドミン権限をつける

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

とりあえずpostgresは一旦完了なのでquitのコマンドでpostgresから抜け出しましょう。

Django用に仮想環境を作成

Djangoアプリのデプロイまでもう少しの辛抱です!

pythonではいくつか仮想環境のライブラリがありますが今回はvirtualenvを使用します。

仮想環境を使ったことがない人は詳しく理解しておいた方が良いですね。

簡単に説明すると同じサーバーで違うバージョンのライブラリを使いたいとき(例えばDjangoの3.0と4.0)に仮想環境をアクティベートして同じマシンでも同時に使用できる様になります。

また、複数人で仕事をするときもバージョンを統一してするために使います。

Pipの準備

pipはpythonパッケージマネージャーでpythonのライブラリをインストールする際に使用しますね。

-HのフラグはsudoのコマンドでユーザーのhomeディレクトリではなくrootのHOMEディレクトリにインストールするように指示します。

まずはpipを最新のものにします。

sudo -H pip3 install --upgrade pip

次にvirtualenvをインストールします。

sudo -H pip3 install virtualenv

Djangoのプロジェクトディレクトリを作成

では、どこにDjangoのプロジェクトを置くか決めましょう。

これは特に決まりはありません。

今日はhome/user名の直下にプロジェクトを置きます。理由はvar/www直下にプロジェクトを作成するとユーザーのパーミッション設定が面倒なので、すべての権限があるユーザーの為に作成されたフォルダを使いたいからです。

ここで簡単なLinuxコマンドを知っていると理解できやすいと思います。

若しくはSSHの代わりにFTPとかでサーバーに入ればUIツールでディレクトリを作成できるようになります。今日使っているSSHクライアントにはどちらのツールも入っているので是非試してください。

Linuxの基本コマンド

  • pwdで現在のパス
  • cd ..で一階層上に移動
  • lsで現在のパスにあるファイルを一覧で表示

で、/varまで移動したら下のコマンドでディレクトリを作成します。

ルートのパスにいる場合は一階層上がり、varフォルダに入ります。

cd..

cd var/www

ls

ではこのコマンドでディレクトリを作成します。

mkdir myprojectdir(myprojectdirはフォルダ名です。)

※ディレクトリ名は自分で好きなものに名前を変えてください。

で、cdコマンドで先ほど作成したディレクトリに入ります。

cd myprojectdir

仮想環境をアクティベート

下のコマンドでvirtualenvで仮想環境を作成します。envの所はディレクトリ名なので自分で好きなものを決めてください。

virtualenv env

バーチャル環境ができたら下のコマンドでアクティベートします。

source env/bin/activate

画像を見てわかるようにユーザー名の前に(env)がつきましたね。

これで仮想環境がアクティベートされたことがわかります。

ここからpipでインストールしたライブラリは全てこの仮想環境内のみでインストールされるのでディアクティベートしたらあとはサーバー自体には全く影響しません。

pipでDjangoプロジェクトのライブラリをインストール

pipで下記のライブラリをインストールします。

他に使っているライブラリがある場合はここで全てインストールしてしまいましょう。

もし、requirements.txt 等でライブラリを一覧で書き出している場合はそれを使ってインストールしましょう。

pip install django gunicorn psycopg2-binary

もしくは、FTP等を使って自分で使ったDjano プロジェクトを持ってきましょう。

私の使っているSSHクライアントのmobaXtermはFTPもついてくるのでそのままファイルをドラグandドロップで転送しちゃいます。

もし、WindowsのPCでvirtualenvを使ってDjangoのプロジェクトを作成している場合は下記のコマンドでrequreiments.txtの名前(一般的なので)でデペンデンスィーを書き出します。

pip freeze > requirements.txt

私の場合の requirements.txtの中身はこんな感じになります。

asgiref==3.4.1

autopep8==1.6.0

distlib==0.3.4

Django==4.0.1

django-ckeditor==6.2.0

django-cors-headers==3.11.0

django-js-asset==1.2.2

djangorestframework==3.13.1

filelock==3.4.0

platformdirs==2.4.0

psycopg2==2.9.3

pycodestyle==2.8.0

pytz==2021.3

six==1.16.0

sqlparse==0.4.2

toml==0.10.2

tzdata==2021.5

virtualenv==20.13.0

ではWindowsのPCから必要なファイルだけサーバーに上げていきます。

画像はMobaXtermのSFTPを使用しています。

SSHの方にもファイル転送の機能があるのでわざわざSFTPで接続しなくてもOKです。

requirements.txtからライブラリをインストールしたい場合はこれ。

pip install -r requirements.txt

Gunicornを入れ忘れずに。デベロップメントでは入れていないと思うので。

pip install gunicorn 

Djangoプロジェクトの設定

Djangoプロジェクトを新規で作る場合

Djangoのアプリをデプロイする前に練習で新しいプロジェクトを作成したい場合はこちらです。

インストールしたDjangoから下記のコマンドでプロジェクトを作成します。

django-admin.py startproject myproject ~/myprojectdir

すでにDjangoプロジェクトを転送した人は飛ばしてください。

Settings.pyのコンフィグ設定

Djangoのプロジェクトを作成した際に自動settings.pyが作成されます。

このファイルでホスト側の設定とDBの設定を行います。

まずは、setting.pyがあるディレクトリに移動しましょう。

nano settings.py

ALLOWED_HOSTSの箇所を見つけて、下記のように変更します。

ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']

ALLOWED_HOSTS = [ *] で全てのIpを許可しますが、セキュリティ上、良くないのでこれはやめましょう。

DBの設定

同じく、settings.pyの所でDATABASEの箇所を見つけて、ENGINE、ユーザー名とパスワード、ホストのIPを確認しましょう。

ちなみにこの作業はデベロップメント(開発)の際に既に接続を確認しているべきですので、windowsとmacをそれぞれ使っている人はその時からDBを接続しておきましょう。

ポートはローカルで接続する場合は空でOKです。

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.postgresql_psycopg2',

        'NAME': 'project',

        'USER': 'postgres',

        'PASSWORD': 'password',

        'HOST': '127.0.0.1',

        'PORT': '5432',

    }

}

Staticファイルの扱い

同じくsettings.pyです。

下記のようにosモジュールをインポートしてStaticファイル(CSS,JS,画像ファイル)等の保管場所を指定してあげます。

import os


STATIC_URL = '/static/'


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

データベースのマイグレーション

ではmanage.pyがあるディレクトリから下記のコマンドで接続したDBにDjangoのモデルで作成したテーブルの枠組みをmigration(マイグレーション:移動)します。

python3 manage.py makemigrations

python3 manage.py migrate

ここでエラーがでなければ問題なくDBにテーブル(スキーマ)が作成されました。

おめでとう。

スーパーユーザーの作成

次にDjangoのアドミンパネルに入るためのスーパーユーザを作成します。

python3 manage.py createsuperuser

今回は説明の為にユーザー名:admin、パスワード:adminで作成し警告が出ましたが、本番環境ではハッキングされないものを作りましょう。

collectstaticの実行

ではmanage.pyから下記のコマンドを実行して、Staticファイルをデプロイ用に一か所にまとめます。

python3 manage.py collectstatic

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

では、このDjangoプロジェクトをテストで公開するために下記のコマンドでサーバーのポートを開けます。

sudo ufw allow 8000

Djangoのテストサーバーでテスト

では下記のコマンドでDjangoにおまけでついてきたウェブサーバーで実際にpublicのネットワークから見れるか確認しましょう。

ちなみに自宅のLAN環境の場合はポートフォワーディングをして外からのアクセスを許可しないといけません。※おすすめしません。

python3 manage.py runserver 0.0.0.0:8000

やったよー。

ここまでできたらちょっとうれしいですね。

で、さっき作成したDjanogoのアドミンパネルにも入れますね。

Gunicornを使ってテスト

では、今度はgunicornを使って同じようにDjangoアプリをデプロイできるか試してみましょう。

※このproject.wsgiのprojectはDjangoのアプリ名です。settings.pyが入っているディレクトリ名ですね。

gunicorn --bind 0.0.0.0:8000 project.wsgi

※必要に応じてパスを移動(pwdで確認)
gunicorn --bind 0.0.0.0:8000 Djangoのプロジェクト名.wsgi

【ちなみに】

gunicornでサーブしたDjangoプロジェクトのアドミンパネルのCSSスタイルが抜けてますよね?これはgunicornがどこのCSSを見たらいいか分かっていないからです。今は無視しておきましょう。

では、ここまでできたら、一旦テストサーバーを止めて、仮想環境もディアクティベートしましょう。

サーバーはCtrl(コントール)+Cで止められます。

Systemdソケットとサービスファイルの作成

ではここからgunicorn様にsystemd socket(ソケット)とサービスファイルを作成します。

さっき、gunicornが動くことが分かったのですが、よりコントロールのある設定をしていきます。

下記のコマンドでソケットファイルを作成します。

sudo nano /etc/systemd/system/gunicorn.socket

中身をこんな感じで書きましょう。

[Unit]

Description=gunicorn socket



[Socket]

ListenStream=/run/gunicorn.sock



[Install]

WantedBy=sockets.target

次に、systemdサービスファイルを作成します。

sudo nano /etc/systemd/system/gunicorn.service

中はこんな感じです。

UserはUbuntuのユーザー名になります。

[Unit]

Description=gunicorn daemon

Requires=gunicorn.socket

After=network.target



[Service]

User=sammy(Ubuntuのユーザー名)

Group=www-data

WorkingDirectory=/home/sammy/myprojectdir

ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \

          --access-logfile - \

          --workers 3 \

          --bind unix:/run/gunicorn.sock \

          myproject.wsgi:application(※myprojectはDjangoのプロジェクト名)




[Install]

WantedBy=multi-user.target

次に下のコマンドでGunicornソケットを実行します。これで自動でソケットファイルが作成されます。

sudo systemctl start gunicorn.socket

次にこれをEnable(実行:オン)にします。これで、ソケットに接続された際にsystemdが自動でgunicorn.socketを実行して処理してくれるようになります。

Gunicorn Socketファイルを確認しよう

gunicorn.socketをアクティブにします。

sudo systemctl enable gunicorn.socket

では下記のコマンドでプロセスのステータスを確認しましょう。

sudo systemctl status gunicorn.socket

Output

● gunicorn.socket – gunicorn socket

     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese>

     Active: active (listening) since Thu 2021-12-02 19:58:48 UTC; 14s ago

   Triggers: ● gunicorn.service

     Listen: /run/gunicorn.sock (Stream)

      Tasks: 0 (limit: 1136)

     Memory: 0B

     CGroup: /system.slice/gunicorn.socket

Dec 02 19:58:48 gunicorn systemd[1]: Listening on gunicorn socket.

次に、/runディレクトリ直下にgunicorn.sockファイルがあるか確認します。

file /run/gunicorn.sock

※もしここで、systemctl statusのコマンドでエラーが出るか、gunicorn.sockファイルが見つからないメッセージが出た場合はgunicornソケットが作成されていないことが原因になるかと思います。下記のコマンドでgunicornソケットのログを出しましょう。

sudo journalctl -u gunicorn.socket

次のステップに進む前に下記のファイルに問題が無いか確認してください。

/etc/systemd/system/gunicorn.socket

ソケットアクティベーションのテスト

Gunicorn.scoketユニットをスタートしただけだとgunicorn.serviceはアクティブになりません。それはソケットが接続を受けていないからです。

下記のコマンドでステータスをチェックしましょう。

sudo systemctl status gunicorn

ソケットのアクティベーションのメカニズムをテストするには、curlコマンドを使ってソケットに接続シグナルを送ります。

curl --unix-socket /run/gunicorn.sock localhost

ここでHTMLの200のレスポンスが返ってきたらOKです。

これでGunicornが開始し、Djangoのアプリをデプロイする準備ができました。

では、Gunicornのステータスをもう一度確認してみましょう。

sudo systemctl status gunicorn

修正したら下記のコマンド

sudo systemctl daemon-reload

で、gunicornのプロセスもリスタートしましょう。

sudo systemctl restart gunicorn

では、次に進む前にここまでで問題ないことを確認しましょう。

NginxのGunicornにパスするプロキシを設定する

では、gunicornも設定ができたところで、次にプロセスにnginxのトラフィックを設定してきます。

Nginxのsites-availableディレクトリに新しいサーバーブロックを作成します。

sudo nano /etc/nginx/sites-available/myproject

ではこの中に下記のようにコンフィグを書いていきます。

server {

    listen 80;

    server_name server_domain_or_IP;

}

Nginxはfavicon(ファビコン:お気に入りのアイコン)とスタティックファイルを無視をするので、マニュアルで場所を教えてあげます。

server {

    listen 80;

    server_name server_domain_or_IP;



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

    location /static/ {

        root /home/sammy/myprojectdir;

    }

}

最後に、location / {} ブロックで通常のproxy_paramsを含めた全てのリクエストを処理するようにします。

server {

    listen 80;

    server_name server_domain_or_IP;



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

    location /static/ {

        root /home/sammy/myprojectdir;

    }



    location / {

        include proxy_params;

        proxy_pass http://unix:/run/gunicorn.sock;

    }

}

このファイルができたらシンボリックリンクでsites-enabledディレクトリとリンクしてあげます。

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

では、nginxのコンフィグレーションをテストしてみましょう。

sudo nginx -t

ここでエラーがでなければ、再度nginxをリスタートします。

sudo systemctl restart nginx

では、最初に開けた8000番のポートはデベロップメント用なので閉じてあげます。

sudo ufw delete allow 8000

それから、通常のアクセスは80番と443番のポートなので HTTPとHTTPSのポートを下記のように許可します。

sudo ufw allow 'Nginx Full'

ファイヤーウォールが起動しているか確認したい場合はこれで。

 

ufw status

sudo ufw enable

rootでしか変更できない場合はいったんrootのアカウントに変更します。

これで、サーバーのIPかドメインでDjangoのアプリが見れるようになりました。

トラブルシュート

DjangoのアドミンぺージのCSSが読み込めていない。

読み込まれていないCSSをクリックします。

CSSのソースページに=アクセスできない場合、www-dataが許可(permission)がないことが理由です。

まずは下記のコマンドでエラーがあるか見てみましょう。

sudo tail -F /var/log/nginx/error.log

必要に応じて、ユーザーのグループに追加しましょう。

etc/nginx/sites-enabled# gpasswd -a www-data root
etc/nginx/sites-enabled# gpasswd -a www-data ユーザー名

でサービスをリスタートして直るはずです。

sudo systemctl restart nginx

sudo systemctl restart gunicorn

トラブルシューティングはプログラミングの基本です。

他人の汚い部屋をきれいにしたり、分厚い契約書を見てミスがない確認するのと同じようで、練習を重ねていけば面倒でも慣れていきます。

慣れてくると、楽しい部分が見えてくるものです。

頑張りましょう!