見出し画像

【IT】DjangoをNGINXとgunicorn(uvicorn)で動かす方法

皆さま、
こんにちは

Djangoを使って外部公開できる様に
設定を行なって行きます。

Django+gunicorn(uvicorn)+nginxを
使ってサーバーを構成します。

Djangoのコンテンツは、
「Django Girls のチュートリアル」のチュートリアルを使用します。


1.Djangoのプロジェクト作成

プロジェクト名は、プロジェクトフォルダー直下に
configという名前で作成します。

# 作業ディレクトリを作成します。
$ mkdir djangogirls
$ cd djangogirls

# 使用するpythonのバージョンを指定します。
$ pyenv local 3.11.1

# 仮想環境を作成します。
$ python -m venv .venv
$ source .venv/bin/activate

# 以下の内容でrequirements.txtを作成
$ more requirements.txt
asgiref==3.6.0
click==8.1.3
Django==4.1.5
gunicorn==20.1.0
h11==0.14.0
python-dotenv==0.21.1
sqlparse==0.4.3
unicorn==2.0.1.post1
uvicorn==0.20.0
whitenoise==6.3.0

# 必要モジュールをインストールします。
$ pip install -r requirements.txt

# プロジェクト名「config」で作業ディレクトリ直下に作成します。
$ django-admin startproject config .

あとは、チュートリアルを見ながらDjangoプロジェクトを作成します。


2.Gunicornの設定

まず、 gunicorn単体で起動確認します。

$ gunicorn config.asgi:application -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
[2023-02-02 22:41:33 +0900] [6216] [INFO] Starting gunicorn 20.1.0
[2023-02-02 22:41:33 +0900] [6216] [INFO] Listening at: http://0.0.0.0:8000 (6216)
[2023-02-02 22:41:33 +0900] [6216] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2023-02-02 22:41:33 +0900] [6217] [INFO] Booting worker with pid: 6217
[2023-02-02 22:41:33 +0900] [6218] [INFO] Booting worker with pid: 6218
[2023-02-02 22:41:33 +0900] [6219] [INFO] Booting worker with pid: 6219
[2023-02-02 22:41:33 +0900] [6220] [INFO] Booting worker with pid: 6220
[2023-02-02 22:41:33 +0900] [6217] [INFO] Started server process [6217]
[2023-02-02 22:41:33 +0900] [6217] [INFO] Waiting for application startup.
[2023-02-02 22:41:33 +0900] [6217] [INFO] ASGI 'lifespan' protocol appears unsupported.
[2023-02-02 22:41:33 +0900] [6217] [INFO] Application startup complete.
[2023-02-02 22:41:33 +0900] [6219] [INFO] Started server process [6219]
[2023-02-02 22:41:33 +0900] [6219] [INFO] Waiting for application startup.

Djangoは起動しますが、static配下のCSSファイル等は読めていません。
あとでnginxで表示できる様にパスを設定します。

起動が確認できたら仮想環境を抜けます。

$ deactivate

gunicornのソケットファイルを作成します。

more /etc/systemd/system/gunicorn.socket
#----------------------------------------
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target
#----------------------------------------

次にgunicornのサービスファイルを作成します。
ユーザ名は、testpyとなります。

#----------------------------------------
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=testpy
Group=www-data
WorkingDirectory=/home/testpy/djangogirls
ExecStart=/home/testpy/djangogirls/.venv/bin/gunicorn \
          --access-logfile - \
          -k uvicorn.workers.UvicornWorker \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          config.asgi:application

[Install]
WantedBy=multi-user.target
#----------------------------------------

gunicornのソケットを有効化し、起動します。

# gunicornソケットを有効化します。
$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

# gunicornソケットのステータスを確認します。
$ sudo systemctl status gunicorn.socket
● gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-02-02 18:14:39 JST; 4h 52min ago
   Triggers: ● gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Feb 02 18:14:39 xxx999 systemd[1]: Listening on gunicorn socket.

$ file /run/gunicorn.sock
/run/gunicorn.sock: socket

# gunicornサービスを有効化し、起動します。
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

$ sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-02-02 23:10:57 JST; 3s ago
TriggeredBy: ● gunicorn.socket
   Main PID: 6610 (gunicorn)
      Tasks: 4 (limit: 9188)
     Memory: 115.4M
        CPU: 2.310s
     CGroup: /system.slice/gunicorn.service
             ├─6610 /home/testpy/ZZ_Django/WebPage/djangogirls/.venv/bin/python /home/testpy/ZZ_Djang>
             ├─6611 /home/testpy/ZZ_Django/WebPage/djangogirls/.venv/bin/python /home/testpy/ZZ_Djang>
             ├─6612 /home/testpy/ZZ_Django/WebPage/djangogirls/.venv/bin/python /home/testpy/ZZ_Djang>
             └─6613 /home/testpy/ZZ_Django/WebPage/djangogirls/.venv/bin/python /home/testpy/ZZ_Djang>

Feb 02 23:10:58 ta64 gunicorn[6612]: [2023-02-02 23:10:58 +0900] [6612] [INFO] ASGI 'lifespan' protoc>
Feb 02 23:10:58 ta64 gunicorn[6612]: [2023-02-02 23:10:58 +0900] [6612] [INFO] Application startup co>
Feb 02 23:10:58 ta64 gunicorn[6611]: [2023-02-02 23:10:58 +0900] [6611] [INFO] Started server process>
Feb 02 23:10:58 ta64 gunicorn[6611]: [2023-02-02 23:10:58 +0900] [6611] [INFO] Waiting for applicatio>
Feb 02 23:10:58 ta64 gunicorn[6611]: [2023-02-02 23:10:58 +0900] [6611] [INFO] ASGI 'lifespan' protoc>
Feb 02 23:10:58 ta64 gunicorn[6611]: [2023-02-02 23:10:58 +0900] [6611] [INFO] Application startup co>
Feb 02 23:10:58 ta64 gunicorn[6613]: [2023-02-02 23:10:58 +0900] [6613] [INFO] Started server process>
Feb 02 23:10:58 ta64 gunicorn[6613]: [2023-02-02 23:10:58 +0900] [6613] [INFO] Waiting for applicatio>
Feb 02 23:10:58 ta64 gunicorn[6613]: [2023-02-02 23:10:58 +0900] [6613] [INFO] ASGI 'lifespan' protoc>
Feb 02 23:10:58 ta64 gunicorn[6613]: [2023-02-02 23:10:58 +0900] [6613] [INFO] Application startup co


3.Nginxの設定

Port 80は他のサービスで利用中ため、
今回は、85番Portを使用します。

HTTPS化は他に構成するリバースプロキシサーバ側で
設定するものとします。

# 以下の内容でファイルを作成します。
$ more /etc/nginx/sites-available/djangogirls
#----------------------------------------
server {
    listen 85;
    server_name 0.0.0.0;

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

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}
#----------------------------------------

# nginxで有効化します。
sudo ln -s /etc/nginx/sites-available/djangogirls /etc/nginx/sites-enabled

# 構文を確認します。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# nginxを再起動します。
$ sudo systemctl restart nginx

無事、アプリが表示されました。
CSSも適用されております。

では

この記事が気に入ったらサポートをしてみませんか?