【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も適用されております。
では