# 建置 Django 應用系統運作平台

# 摘要

說明 Django 應用系統,「首度」佈署之作業程序。

# Django 應用系統作業平台

  • HTTP 伺服器: Nginx
  • uWSGI 介面: 將 Nginx 收到之 HTTP Request 轉成 unix socket ,並傳 送予 Django 應用系統
  • Django App: Django 應用系統

# Django 應用系統目錄結構

# 作業程序

# (1) 自 GitHub 下載及安裝 Django 應用系統

  1. 自 GitHub 下載原始碼。
cd ~/workspace/apps
git clone git@github.com:AlanJui/Django4.git
cd Django4 
1
2
3
  1. 建置所需之 python 虛擬環境

參考《作業指引》

  1. 安裝 Django 應用系統所需之 python 套件。
pipenv shell
pipenv install
1
2
  1. 組建 Django 應用系統。
./manage.py migrate
./manage.py collectstatic
1
2
  1. 建立 Django 應用系統之「後台管理員」。
./manage.py createsuperuser 
1

# (2) 驗證 Django 應用系統已能獨立運作

  1. 以 Debug 模式,啟動 Django 應用系統。
./manage.py runserver 0.0.0.0:8000
1
  1. 在伺服器、用戶端,使用 Web 瀏覽器瀏覽以下網址, 以此方式驗證 Django 應用系統在 Debug 模式,已能正常 運作。

在「伺服器端」使用之網址:

http://127.0.0.1:8000/
1

在「用戶端」使用之網址:

http://192.168.66.10:8000/
1

# (3) 建置與 Django App 協同運作之 HTTP 虛擬網站

  1. 建置 Django 應用系統之 Host 名稱
sudoedit /etc/hosts
1

/etc/hosts:

192.168.66.10   app1.ccc.tw.local
1
  1. 建置 Nginx 虛擬網站設定檔。
cd /etc/nginx/site-available
sudo cp default blog.ccc.tw.local
sudoedit app1.ccc.tw.local
1
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
  1. 檢測設定檔,確認內容無誤。
sudo nginx -t
1

# (3) 啟用 nginx 虛擬網站

  1. 建立啟用 nginx 虛擬網站之 symlink 。
sudo ln -fns /etc/nginx/sites-available/app1.ccc.tw.local
/etc/nginx/sites-enable
1
2
  1. 重啟 nginx 服務。
sudo systemctl restart nginx
sudo systemctl status nginx
1
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
  1. 透過 pipenv 套件管理工具,安裝 python 套件:uwsgi 。
pipenv install uwsgi
1
  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
  1. 複製 nginx 所提供的 uwsgi 設定檔:uwsi_params
sudo cp /etc/nginx/uwsgi_params .
chown www-data:www-data uwsgi_params
1
2

# (6) 驗證 Nginx + uWSGI + Django App 已完成整合

  1. 執行 uwsgi 。
uwsgi --ini mysite_uwsgi.ini
1
  1. 透過瀏覽器,驗證 HTTP Request 已能循下列路徑運作: nginx <--> uwsgi <--> Django App 。

在瀏覽器輸入以下網址:

http://app1.ccc.tw.local/polls/
1

# (7) 建置自動開機服務

為使已佈署之 Django 應用系統,能於開機後自動啟動。故需建置及啟用 Django 應用系統專用之服務。

  1. 建置 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
  1. 啟用 app1 服務。
sudo systemctl enable app1
sudo systemctl start app1
1
2
  1. 檢視 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

# 參考資料