# 建置 Django 應用系統運作平台
# 摘要
說明 Django 應用系統,「首度」佈署之作業程序。
# Django 應用系統作業平台
- HTTP 伺服器: Nginx
- uWSGI 介面: 將 Nginx 收到之 HTTP Request 轉成 unix socket ,並傳 送予 Django 應用系統
- Django App: Django 應用系統
# Django 應用系統目錄結構
# 作業程序
# (1) 自 GitHub 下載及安裝 Django 應用系統
- 自 GitHub 下載原始碼。
cd ~/workspace/apps
git clone git@github.com:AlanJui/Django4.git
cd Django4
1
2
3
2
3
- 建置所需之 python 虛擬環境
參考《作業指引》。
- 安裝 Django 應用系統所需之 python 套件。
pipenv shell
pipenv install
1
2
2
- 組建 Django 應用系統。
./manage.py migrate
./manage.py collectstatic
1
2
2
- 建立 Django 應用系統之「後台管理員」。
./manage.py createsuperuser
1
# (2) 驗證 Django 應用系統已能獨立運作
- 以 Debug 模式,啟動 Django 應用系統。
./manage.py runserver 0.0.0.0:8000
1
- 在伺服器、用戶端,使用 Web 瀏覽器瀏覽以下網址, 以此方式驗證 Django 應用系統在 Debug 模式,已能正常 運作。
在「伺服器端」使用之網址:
http://127.0.0.1:8000/
1
在「用戶端」使用之網址:
http://192.168.66.10:8000/
1
# (3) 建置與 Django App 協同運作之 HTTP 虛擬網站
- 建置 Django 應用系統之 Host 名稱
sudoedit /etc/hosts
1
/etc/hosts:
192.168.66.10 app1.ccc.tw.local
1
- 建置 Nginx 虛擬網站設定檔。
cd /etc/nginx/site-available
sudo cp default blog.ccc.tw.local
sudoedit app1.ccc.tw.local
1
2
3
2
3
/etc/nginx/sites-available/app1.ccc.tw.local:
upstream django {
# server 127.0.0.1:8001;
server unix:///home/alanjui/workspace/apps/django-v4/mysite.sock;
}
server {
listen 80;
server_name app1.ccc.tw.local;
charset utf-8;
# max upload size
client_max_body_size 75M;
# Django media
location /media {
alias /home/alanjui/workspace/apps/django-v4/media;
}
location /static {
alias /home/alanjui/workspace/apps/django-v4/static_collected;
}
location / {
uwsgi_pass django;
include /home/alanjui/workspace/apps/django-v4/uwsgi_params;
}
access_log /var/log/nginx/app1-ccc-tw-local.log;
error_log /var/log/nginx/app1-ccc-tw-local-error.log;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- 檢測設定檔,確認內容無誤。
sudo nginx -t
1
# (3) 啟用 nginx 虛擬網站
- 建立啟用 nginx 虛擬網站之 symlink 。
sudo ln -fns /etc/nginx/sites-available/app1.ccc.tw.local
/etc/nginx/sites-enable
1
2
2
- 重啟 nginx 服務。
sudo systemctl restart nginx
sudo systemctl status nginx
1
2
2
# (4) 驗證 HTTP 虛擬網站已能獨立運作
在 Web 用戶端,透過「瀏覽器」發送 HTTP Request,要求瀏覽某靜態檔案 (如:.html / .css / .jpg / .png / ...) ,若瀏覽器能顯示該靜態檔案的內容,即代表 Nginx 所建置的「虛擬網站」 ,已能正常作業,對於 HTTP Request 要求,能提供相對映,應有之 HTTP Response 。
在瀏覽器輸入以下網址,要求瀏覽 style.css 靜態檔。
http://app1.ccc.tw.local/static/polls/style.css
1
# (5) 建置 uWSGI 介面設定檔
執行以下作業前,需先確認以下兩事:
- 目錄路徑位於: ~/workspace/apps/django-v4/ ;
- Django 應用系統使用之【Python 虛擬環境】已啟用。
此步驟的主要目的,用於建立下列所示之 HTTP Request 傳送通道:
web client <-> web server <-> unix socket <-> uWSGI <-> Python
(Nginx) (uwsgi) (Django)
1
2
2
- 透過 pipenv 套件管理工具,安裝 python 套件:uwsgi 。
pipenv install uwsgi
1
- 建置 uwsgi 用設定檔:mysite_uwsgi.ini 。
~/workspace/apps/django-v4/mysite_uwsgi.ini :
[uwsgi]
# Django-related settings
# the base directory
chdir = /home/alanjui/workspace/apps/django-v4
# Django's wsgi file
module = mysite.wsgi
# the virtualenv
home = /home/alanjui/.pyenv/versions/3.10.0/envs/django-4.0/
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket
socket = /home/alanjui/workspace/apps/django-v4/mysite.sock
# ... with appropriate permissions
chmod-socket = 666
# clear environment on exit
vacuum = true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 複製 nginx 所提供的 uwsgi 設定檔:uwsi_params
sudo cp /etc/nginx/uwsgi_params .
chown www-data:www-data uwsgi_params
1
2
2
# (6) 驗證 Nginx + uWSGI + Django App 已完成整合
- 執行 uwsgi 。
uwsgi --ini mysite_uwsgi.ini
1
- 透過瀏覽器,驗證 HTTP Request 已能循下列路徑運作: nginx <--> uwsgi <--> Django App 。
在瀏覽器輸入以下網址:
http://app1.ccc.tw.local/polls/
1
# (7) 建置自動開機服務
為使已佈署之 Django 應用系統,能於開機後自動啟動。故需建置及啟用 Django 應用系統專用之服務。
- 建置 app1 服務設定檔。
sudoedit /etc/systemd/system/app1.service
1
【檔案內容】:
[Unit]
Description=uWSGI instance to serve app1.ccc.tw.local
[Service]
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown www-data:www-data /run/uwsgi'
ExecStart=/usr/bin/bash -c 'cd /home/alanjui/workspace/apps/django-v4; \
/home/alanjui/.pyenv/bin/pyenv activate django-v4; \
/home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini'
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 啟用 app1 服務。
sudo systemctl enable app1
sudo systemctl start app1
1
2
2
- 檢視 app1 服務,確認該服務已能正常運作。
sudo systemctl status app1
1
【app1 服務狀態】:
● app1.service - uWSGI instance to serve app1.ccc.tw.local
Loaded: loaded (/etc/systemd/system/app1.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-07-05 08:21:43 CST; 1h 54min ago
Process: 3839 ExecStartPre=/usr/bin/bash -c mkdir -p /run/uwsgi; chown www-data:www-data /run/uwsgi (code=exited, status=0/SUCCESS)
Main PID: 5067 (bash)
Tasks: 12 (limit: 19083)
Memory: 90.0M
CGroup: /system.slice/app1.service
├─5067 /usr/bin/bash -c cd /home/alanjui/workspace/apps/django-v4; /home/alanjui/.pyenv/bin/pyenv activate django-v4; /home/alanju>
├─5103 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6654 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6655 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6657 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6658 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6659 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6663 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6664 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6665 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
├─6666 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
└─6667 /home/alanjui/.pyenv/versions/django-4.0/bin/uwsgi --ini mysite_uwsgi.ini
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 5 (pid: 6659, cores: 1)
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 6 (pid: 6663, cores: 1)
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 7 (pid: 6664, cores: 1)
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 8 (pid: 6665, cores: 1)
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 9 (pid: 6666, cores: 1)
7月 05 08:21:44 SRV-2020 bash[5103]: spawned uWSGI worker 10 (pid: 6667, cores: 1)
7月 05 09:08:11 SRV-2020 bash[6667]: Not Found: /favicon.ico
7月 05 09:08:11 SRV-2020 bash[6667]: [pid: 6667|app: 0|req: 1/1] 192.168.66.21 () {44 vars in 842 bytes} [Tue Jul 5 01:08:11 2022] GET /favicon>
7月 05 09:39:34 SRV-2020 bash[6667]: Not Found: /favicon.ico
7月 05 09:39:34 SRV-2020 bash[6667]: [pid: 6667|app: 0|req: 2/2] 192.168.66.10 () {44 vars in 820 bytes} [Tue Jul 5 01:39:34 2022] GET /favicon>
~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32