Ubuntu 22.04でPostgres、Nginx、Gunicornを使用してDjangoをセットアップ
1. 初めに
Djangoは、PythonアプリケーションやWebサイトを軌道に乗せるのに役立つ強力なWebフレームワークです。Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に関連するものでも、より安全で強力なWebサーバーが必要です。
このガイドでは、Djangoアプリケーションをサポートおよび提供するために、Ubuntu22.04にいくつかのコンポーネントをインストールして構成します。デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースを設定します。アプリケーションとインターフェイスするように Gunicorn1 アプリケーションサーバーを構成します。次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。
Digtal Ocean2を参考にWSL上に構築していきます。
2. 前提条件と目標
- VPS : Ubuntu22.04 on WebAREANA Indigo
- フレームワークはDjango
- DBはPostgreSQL
- アプリケーションサーバはGunicorn
- WebサーバはNginx
- VSCodeからSSH接続環境
- VPS-IP : 160.248.11.107
- ubuntu : password
- Djangoは仮想環境内にインストールします。プロジェクトに固有の環境にDjangoをインストールすると、プロジェクトとその要件を個別に処理できるようになります。
- データベースとアプリケーションを稼働させたら、Gunicornアプリケーションサーバーをインストールして構成します。これはアプリケーションへのインターフェイスとして機能し、クライアント要求をHTTPからアプリケーションが処理できるPython呼び出しに変換します。次に、Gunicornの前にNginxをセットアップして、高性能の接続処理メカニズムと実装が簡単なセキュリティ機能を利用します。
- Python 3.11は、以前の3.10よりも10〜60%高速であると主張し、次の機能を備えています。
3. VPSへのログイン
3-1. OSの初期設定(アップデート、アップグレード)
sudo apt update
apt list --upgradable
(root change)
sudo su -
4. 新規ユーザーを追加
以下rootで実行します。
adduser vpsadmin
新しく追加したユーザーにsudo権限を持たせ、sudo権限を持ったユーザーを表示して確認します。
gpasswd -a vpsadmin sudo
(確認)
cat /etc/group | grep sud
sudo❌27:ubuntu,vpsadmin
追加したユーザーのパスワード設定
passwd vpsadmin
5. VSCodeでSSHログイン
5-1. WindowsのSHH設定ファイルへ追記
(config file)
Host Indigo-Ubuntu-4vCPU4GB-Django
HostName 160.248.11.107
User ubuntu
Port 22
IdentityFile ~/.ssh/indigo_django_private_key.txt
5-1. ポートを開ける
sudo ufw enable
y
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 8000
sudo ufw allow 22
sudo ufw allow 12322
sudo ufw status verbose
(Output)
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp (Nginx HTTP) ALLOW IN Anywhere
80,443/tcp (Nginx Full) ALLOW IN Anywhere
3838 ALLOW IN Anywhere
443 ALLOW IN Anywhere
8787 ALLOW IN Anywhere
12322 ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (Nginx HTTP (v6)) ALLOW IN Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
3838 (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
8787 (v6) ALLOW IN Anywhere (v6)
12322 (v6) ALLOW IN Anywhere (v6)
sudo ufw reload
5-2. Indigoのファイアウォールの設定
5-3. Gitのバージョンを確認
$ git --version
git version 2.37.2
6. 各種インストール
6-1. Python3.11環境の構築(Ubuntu22.04)
Python 3.11は、以前の3.10よりも10〜60%高速であると主張し、次の機能を備えています。
Ubuntu22.04にPython3.11をインストールする方法
PPAの追加 (注意)PPAはUbuntu22.10をサポートしていません。
sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:deadsnakes/ppa
求められたらユーザーパスワードを入力し(アスタリスクフィードバックなし)、Enterキーを押して続行します。
次に、以下のコマンドを使用してパッケージキャッシュを更新しますが、Ubuntu 20.04+では自動的に行われます。
sudo apt update
最後に、次のコマンドを使用してPython 3.11をインストールします。
sudo apt install python3.11 sudo apt install python3.11-dev python3.11-venv python3.11-distutils python3.11-gdbm python3.11-tk python3.11-lib2to3 'python3.11-dev': C 拡張モジュールをビルドするための開発ヘッダが含まれています。 'python3.11-venv': 標準ライブラリ 'venv' モジュールを提供します。 'python3.11-distutils': 標準ライブラリの 'distutils' モジュールを提供します。 'python3.11-lib2to3': '2to3-3.11' ユーティリティと標準ライブラリ 'lib2to3' モジュールを提供します。 'python3.11-gdbm': 標準ライブラリ 'dbm.gnu' モジュールを提供します。 'python3.11-tk': 標準ライブラリ 'tkinter' モジュールを提供します。 curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 (Output) pip 22.3.1 from /home/ubuntu/.local/lib/python3.11/site-packages/pip (python 3.11)
確認
(python3.11) python3.11 -V Python 3.11.0rc1 whereis python3.11 python3.11: /usr/bin/python3.11 /usr/lib/python3.11 /etc/python3.11 /usr/local/lib/python3.11 /usr/share/man/man1/python3.11.1.gz which python3.11 /usr/bin/python3.11 python3.11 -m pip --version pip 22.3.1 from /home/ubuntu/.local/lib/python3.11/site-packages/pip (python 3.11) (python3) python3 -V Python 3.10.6 which python3 /usr/bin/python3
Python 3.11 をデフォルトとして設定する (注):UbuntuでデフォルトのPython3を変更すると、GNOMEターミナルなどの一部のデフォルトアプリで問題が発生する可能性があります。
(1)まず、コマンドを実行して、システムのデフォルトのPythonのシンボリックリンクを作成します(変更はUbuntuのエディションによって異なります)python3.10
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 110
(2)次に、次のコマンドを使用して新しいPython 3.11を追加します。
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 100
(3)その後、次のコマンドを実行して、いつでもPython3としてどのPythonを選択できます。
sudo update-alternatives --config python3 There are 2 choices for the alternative python3 (providing /usr/bin/python3). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/bin/python3.10 110 auto mode 1 /usr/bin/python3.10 110 manual mode 2 /usr/bin/python3.11 100 manual mode Press <enter> to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/python3.11 to provide /usr/bin/python3 (python3) in manual mode (確認) sudo update-alternatives --config python3 There are 2 choices for the alternative python3 (providing /usr/bin/python3). Selection Path Priority Status ------------------------------------------------------------ 0 /usr/bin/python3.10 110 auto mode 1 /usr/bin/python3.10 110 manual mode * 2 /usr/bin/python3.11 100 manual mode $ python3 Python 3.11.0rc1 (main, Aug 12 2022, 10:02:14) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
sudo apt update時のエラー対策 sudo update-alternatives –config python3 ここで3.10に戻してから apt updateを実行します。
6-2. Nginxのインストール
Ubuntu 22.04 LTSのOS標準となるNginxは古いので、最新版をインストールします。
最新版Nginxのリポジトリの追加
sudo vi /etc/apt/sources.list.d/nginx.list (以下を記入します) deb https://nginx.org/packages/ubuntu/ jammy nginx deb-src https://nginx.org/packages/ubuntu/ jammy nginx
最新版Nginxの反映(パッケージ更新)
sudo apt update (Output) W: GPG error: https://nginx.org/packages/ubuntu jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62 E: The repository 'https://nginx.org/packages/ubuntu jammy InRelease' is not signed. N: Updating from such a repository can't be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details. E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi' E: Sub-process returned an error code
これは、リポジトリがapt的には怪しいと疑っているエラーになります。 そのため、追加したモノは安心できるリポジトリだとaptに教えます。
(sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key) ⇒ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62 (Output) Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). Executing: /tmp/apt-key-gpghome.574IB4nEn7/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62 gpg: key ABF5BD827BD9BF62: public key "nginx signing key <signing-key@nginx.com>" imported gpg: Total number processed: 1 gpg: imported: 1
再度パッケージを更新
sudo apt update E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi' E: Sub-process returned an error code
最新版Nginxのインストール
sudo apt info nginx (Output) Package: nginx Version: 1.22.1-1~jammy バージョンが、1.18.0から1.20.2に変わっています。
最新版Ngnixのインストール
sudo apt install -y nginx
Ngixnを起動
sudo systemctl start nginx (確認) sudo systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-12-30 16:35:21 UTC; 22min ago Docs: https://nginx.org/en/docs/ Process: 23004 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 23005 (nginx) Tasks: 5 (limit: 4661) Memory: 4.0M CPU: 26ms CGroup: /system.slice/nginx.service ├─23005 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf" ├─23006 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ├─23007 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ├─23008 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" └─23009 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" Dec 30 16:35:21 i-50100000452180 systemd[1]: Starting nginx - high performance web server... Dec 30 16:35:21 i-50100000452180 systemd[1]: Started nginx - high performance web server.
Serverの設定
sudo vim /etc/nginx/sites-available/appsite server { server_name 160.248.11.107; root /var/www/appsite/; location / { proxy_pass <http://unix>:/run/gunicorn/socket; } location /static/ { alias /var/www/appsite/static/; } } sudo ln -s /etc/nginx/sites-available/appsite /etc/nginx/sites-enabled sudo /etc/init.d/nginx restart ~~~bash
6-3. PostgreSQLのインストール
インストール
sudo apt install postgresql psql -V psql (PostgreSQL) 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1) which psql /usr/bin/psql
PostgreSQLの設定
sudo -u postgres psql postgres=# CREATE DATABASE djangodeploy; CREATE USER djangoadmin WITH PASSWORD 'password1234'; ALTER ROLE djangoadmin SET client_encoding TO 'utf8'; ALTER ROLE djangoadmin SET default_transaction_isolation TO 'read committed'; ALTER ROLE djangoadmin SET timezone TO 'Asia/Tokyo'; GRANT ALL PRIVILEGES ON DATABASE djangodeploy TO djangoadmin; ctrl + d
再起動
sudo /etc/init.d/postgresql restart (確認) sudo systemctl status postgresql ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2022-12-30 18:40:16 UTC; 30s ago Process: 30150 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 30150 (code=exited, status=0/SUCCESS) CPU: 3ms Dec 30 18:40:16 i-50100000452180 systemd[1]: Starting PostgreSQL RDBMS... Dec 30 18:40:16 i-50100000452180 systemd[1]: Finished PostgreSQL RDBMS.
pg_hba.confの編集
cd /etc/postgresql/14/main sudo vi pg_hba.conf (L95) # "local" is for Unix domain socket connections only local all all peer >>> local all all md5
postgresql.confの編集
sudo vi postgresql.conf #listen_addresses = 'localhost' >>> listen_addresses = '*'
再起動
sudo systemctl status postgresql ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2022-12-30 18:54:57 UTC; 8s ago Process: 32335 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 32335 (code=exited, status=0/SUCCESS) CPU: 3ms Dec 30 18:54:57 i-50100000452180 systemd[1]: Starting PostgreSQL RDBMS... Dec 30 18:54:57 i-50100000452180 systemd[1]: Finished PostgreSQL RDBMS.
6-4. Python3pipのインストール
python3.11のインストール時にpip3はインストール済です。
pip3 --version pip 22.3.1 from /home/ubuntu/.local/lib/python3.11/site-packages/pip (python 3.11)
python3.10でのインストール
sudo apt install -y python3-pip (確認) pip3 --version pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
6-5. Gitのインストール
~~~bash
sudo apt -y install git
(確認)
git --version
git version 2.34.1
~~~
7. 仮想環境にpipを使用してDjangoをインストールする
システムにDjangoをインストールする最も柔軟な方法は、仮想環境内です。標準のPython 3ライブラリの一部であるモジュールを使用して作成する仮想環境にDjangoをインストールする方法を示します。このツールを使用すると、システムの他の部分に影響を与えることなく、仮想Python環境を作成し、Pythonパッケージをインストールできます。したがって、他のプロジェクトの要件との競合に関係なく、プロジェクトごとにPythonパッケージを選択できます。venv
7-1. アプリケーションの準備
- GitHubの設定
sudo mkdir /var/www/appsite
cd /var/www
sudo chown ubuntu appsite
cd appsite
sudo git init
sudo git remote add origin https://github.com/TechRZN/job-portal.git
sudo git pull origin main
- 仮想環境の作成
sudo apt-get install python3-venv
python3 -m venv venv
- モジュールのインストール
/var/www/appsite$ source venv/bin/activat
(venv)$pip install django==4.1.4
(Output)
Successfully installed asgiref-3.6.0 django-4.1.4 sqlparse-0.4.3
- Gunicornの設定
sudo vim /etc/systemd/system/gunicorn.socket
>>>
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn/socket
[Install]
WantedBy=sockets.target
sudo vim /etc/systemd/system/gunicorn.service
>>>
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
WorkingDirectory=/var/www/appsite
ExecStart=/var/www/appsite/venv/bin/gunicorn --workers 2 --bind unix:/run/gunicorn/socket job-portal.wsgi:application
[Install]
WantedBy=multi-user.target
(venv) :/var/www/appsite$ sudo /etc/init.d/nginx configtest
(Output)
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[起動]
sudo systemctl enable --now gunicorn.socket
(Output)
Created symlink /etc/systemd/system/sockets.target.wants/gunicorn.socket → /etc/systemd/system/gunicorn.socket.
sudo systemctl start gunicorn.service
sudo systemctl status gunicorn.socket
● gunicorn.socket - gunicorn socket
Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: enabled)
Active: active (listening) since Sat 2022-12-31 19:20:55 JST; 2h 44min ago
8. Djangoの初期設定
source venv/bin/activate
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
python manage.py createsuperuser