1. 初めに

  1. Djangoは、PythonアプリケーションやWebサイトを軌道に乗せるのに役立つ強力なWebフレームワークです。Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に関連するものでも、より安全で強力なWebサーバーが必要です。

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

  3. Digtal Ocean2を参考にWSL上に構築していきます。

2. 前提条件と目標

  1. VPS : Ubuntu22.04 on WebAREANA Indigo
  2. フレームワークはDjango
  3. DBはPostgreSQL
  4. アプリケーションサーバはGunicorn
  5. WebサーバはNginx
  6. 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ログイン

WebArena Indigoの環境設定を参照

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をインストールする方法

参考URL

参考動画

  1. PPAの追加 (注意)PPAはUbuntu22.10をサポートしていません。

    sudo apt update
    sudo apt install software-properties-common
    sudo add-apt-repository ppa:deadsnakes/ppa
    

求められたらユーザーパスワードを入力し(アスタリスクフィードバックなし)、Enterキーを押して続行します。

  1. 次に、以下のコマンドを使用してパッケージキャッシュを更新しますが、Ubuntu 20.04+では自動的に行われます。

    sudo apt update
    
  2. 最後に、次のコマンドを使用して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)
    
  3. 確認

    
    (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
    
  4. 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.
    >>> 
    
  5. sudo apt update時のエラー対策 sudo update-alternatives –config python3 ここで3.10に戻してから apt updateを実行します。

    それはもはやバグとは見なされておらず、問題を解決するために実行する何かを見つけることを望んでいました。

6-2. Nginxのインストール

Ubuntu 22.04 LTSのOS標準となるNginxは古いので、最新版をインストールします。

  1. 最新版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
    
  2. 最新版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
    
  3. これは、リポジトリが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
    
  4. 再度パッケージを更新

    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
    
  5. 最新版Nginxのインストール

    sudo apt info nginx 
    (Output)
    Package: nginx
    Version: 1.22.1-1~jammy
    
    バージョンが、1.18.0から1.20.2に変わっています。
    
  6. 最新版Ngnixのインストール

    sudo apt install -y nginx
    
  7. 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.
    
  8. 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のインストール
  1. インストール

    sudo apt install postgresql
    psql -V
     psql (PostgreSQL) 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1)
    which psql
     /usr/bin/psql
    
  2. 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
    
  3. 再起動

    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.
    
  4. 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
    
  5. postgresql.confの編集

    sudo vi postgresql.conf
    
    #listen_addresses = 'localhost'   >>>   listen_addresses = '*'
    
  6. 再起動

    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のインストール
  1. python3.11のインストール時にpip3はインストール済です。

    pip3 --version
    pip 22.3.1 from /home/ubuntu/.local/lib/python3.11/site-packages/pip (python 3.11)
    
  2. 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. アプリケーションの準備
  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
  1. 仮想環境の作成
sudo apt-get install python3-venv
python3 -m venv venv
  1. モジュールのインストール
/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
  1. 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
以上

  1. Gunicorn​は、WSGI アプリケーション用の純粋な Python HTTP サーバーです。単一 dyno 内で複数の Python プロセスを実行することによって、任意の Python アプリケーションを並列して実行できるようにします。Gunicorn は、パフォーマンス、柔軟性、設定のシンプルさの絶妙なバランスを提供します。 ↩︎

  2. 参考URL:Digtal Ocean ↩︎