2024年2月21日 星期三

在樹莓派 Nginx 伺服器上佈署 Django 專案

今天在整理筆記時找到這篇 2019 年底寫的文章, 看起來有發布過, 不知為何又被改回草稿, 看完後覺得具有參考價值, 所以重新發布 : 

[2019-09-11] 

這幾天重回睽違一季的 Django 學習軌道, 雖然感覺有點陌生, 不過複習之前的三篇測試紀錄之後很快就恢復戰力了 :
  1. 在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器
  2. 在樹莓派 Nginx 伺服器上執行 Python 網頁應用程式
  3. Python 學習筆記 : Django 2 測試 (一) : 請求與回應處理
第三篇的 Django 2 測試 (一) 是在 Win 10 上進行的, 以下實驗則是在樹莓派 Pi 3 上進行.


1. 安裝或更新 Django :

因為之前安裝的 Django 版本可能有點舊了, 所以在重新測試之前先用 pip3 install django 指令升版, 在後面加上 -U 參數可更新到最新版 :

pi@raspberrypi:~ $ pip3 install django -U 
Collecting Django
  Using cached https://files.pythonhosted.org/packages/39/b0/2138c31bf13e17afc32277239da53e9dfcce27bac8cb68cf1c0123f1fdf5/Django-2.2.3-py3-none-any.whl
Collecting sqlparse (from Django)
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from Django)
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Installing collected packages: sqlparse, pytz, Django
Successfully installed Django-2.2.3 pytz-2019.1 sqlparse-0.3.0
pi@raspberrypi:~ $ python3 -m django --version 
2.2.3 

可見 Django 目前最新版為 v2.2.3, 有兩個相依套件 sqlparse  與 pytz.


2. 在 Nginx 虛擬目錄下建立 Djando 網站 :

我的目標是在樹莓派上以 Nginx 作為 HTTP 伺服器佈署 Django 專案, Nginx 伺服器的操作指令整理如下表 :

 Nginx 伺服器操作指令 說明
 nginx -s start 啟動伺服器
 nginx -s stop 停止伺服器
 nginx -t 檢視伺服器狀態
 nginx -s reload 重啟伺服器

Nginx 伺服器的所有站台設定檔放在 /etc/nginx/sites-enabled/ 目錄下, 預設站台設定檔為 default, 其預設根目錄絕對路徑為 /var/www/html, 預設監聽埠號為 80 埠. 安裝好 Nginx 後在瀏覽器中開啟 localhost 或 127.0.0.1 或我為樹莓派指定之固定 IP 192.168.2.192 都會看到一個 Nginx 的歡迎網頁.

我們可以直接在 /var/www/html 下佈署 Web 專案, 但為了保留 Nginx 預設站台之歡迎網頁 (作為測試 Nginx 有否開啟用), 我在前次的 "在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器" 這篇裡面已於 /var/www/ 下建立一個子目錄 test, 除了將 /var/www/test 設定為虛擬目錄外, 還進一步將此虛擬目錄設定成一個虛擬站台 test.com, 亦即若在 /var/www/test 下佈署 Django 專案的話, 可以用 localhost/test/mysite 或 test.com/mysite 去瀏覽網頁.

OK, 這樣就可以在 /var/www/test 底下建立一個 Django 網站了, 但是一出手就不太順, 直接以 Windows 下所用的 django-admin startproject mysite 指令建立網頁專案時就出現 "Command not found" 錯誤 :

pi@raspberrypi:~ $ cd /var/www/test 
pi@raspberrypi:/var/www/test $ django-admin startproject  mysite 
bash: django-admin:命令找不到  

經查詢才知道原來在 Linux 底下還要幫所安裝的 Django 套件在 /usr/local/bin 底下建立連結, 才能在任何目錄下執行其管理指令, Windows 因為在安裝 Python 時已把 Scripts 放在環境變數裡, 因此可以馬上執行所安裝的套件, 參考 :

Command not found: django-admin.py
-bash: django-admin: command not found

用 pip3 show 檢視 Django 安裝位置 :

pi@raspberrypi:~ $ pip3 show django 
Name: Django
Version: 2.2.3 
Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author: Django Software Foundation
Author-email: foundation@djangoproject.com
License: BSD
Location: /home/pi/.local/lib/python3.5/site-packages
Requires: sqlparse, pytz

可見 Django 被安裝在 /home/pi/.local/lib/python3.5/site-packages 底下, 用 ls 指令檢視 djando 子目錄 :

pi@raspberrypi:/var/www/test $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django
總計 84
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 apps
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 bin 
4 drwxr-xr-x  7 pi pi 4096  4月  9 00:37 conf
4 drwxr-xr-x 18 pi pi 4096  4月  9 00:37 contrib
4 drwxr-xr-x 11 pi pi 4096  4月  9 00:37 core
4 drwxr-xr-x  6 pi pi 4096  4月  9 00:37 db
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 dispatch
4 drwxr-xr-x  5 pi pi 4096  4月  9 00:37 forms
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 http
4 -rw-r--r--  1 pi pi  799  7月 31 08:30 __init__.py
4 -rw-r--r--  1 pi pi  211  7月 31 08:30 __main__.py
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 middleware
4 drwxr-xr-x  2 pi pi 4096  4月  9 00:37 __pycache__
8 -rw-r--r--  1 pi pi 5588  7月 31 08:30 shortcuts.py
4 drwxr-xr-x  5 pi pi 4096  4月  9 00:37 template
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 templatetags
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 test
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 urls
4 drwxr-xr-x  4 pi pi 4096  4月  9 00:37 utils
4 drwxr-xr-x  6 pi pi 4096  4月  9 00:37 views

Django 的工具程式 django-admin 則是放在 bin 子目錄下 :

pi@raspberrypi:~ $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django/bin  
總計 8
4 -rwxr-xr-x 1 pi pi  128  7月 30 16:45 django-admin.py    
4 drwxr-xr-x 2 pi pi 4096  4月  9 00:37 __pycache__

所以必須為此 django-admin.py 在 /usr/local/bin 底下建立連結才能在任何目錄下執行此程式 :

sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin

在建立連結之前先檢查 /usr/local/bin :

pi@raspberrypi:/var/www/test $ ls -ls /usr/local/bin 
總計 976
  4 -rwxrwxr-x 1 root staff     70  4月  6 15:49 checkwifi.sh
972 -rwxr-xr-x 1 root staff 992484  4月  5 10:58 uwsgi

目前只有之前回報 IP 檢查 WiFi 連線用的 shell 程式 checkwifi.sh 與所安裝的 uwsgi 而已. 執行建立 django-admin.py 連結之指令 :

pi@raspberrypi:/var/www/test $ sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin 
pi@raspberrypi:/var/www/test $ ls -ls /usr/local/bin 
總計 980
  4 -rwxrwxr-x 1 root staff     70  4月  6 15:49 checkwifi.sh   
  4 lrwxrwxrwx 1 root staff     70  7月 31 11:45 django-admin.py -> /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py 
972 -rwxr-xr-x 1 root staff 992484  4月  5 10:58 uwsgi

可見連結已建立, 但在 /var/www/test 底下用 django-admin.py 指令建立一個網站 mysite 時卻還是失敗, 但這回出現的是 "No module named django.core" 的錯誤訊息 :

pi@raspberrypi:/var/www/test $ django-admin.py startproject mysite 
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, <module>
    from django.core import management
ImportError: No module named django.core 

即使在 /home/pi 底下也是一樣 : 

pi@raspberrypi:~ $ django-admin.py startproject mysite    
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, in <module>
    from django.core import management
ImportError: No module named django.core   

經爬文研究在下面這篇文章發現可能是 Python 版本的關係, 參考 : 


因為 Rasbian 預設 python 指令是 v2.7 版, 而我的 Django 等套件都是安裝在 Python 3 底, 所以我之前在安裝完 Rasbian 後有用 alias 指令將 Python 3.5 版指令取 python3 的別名, 但執行 django-admin.py 時卻會預設執行 Python 2.7, 導致找不到 django.core 模組. 

依照其建議應移除 /usr/bin/python 與 Python 2.7 的連結, 再建立 Python 3 與 /usr/bin/python 的連結 :

pi@raspberrypi:~ $ sudo rm -f /usr/bin/python   
pi@raspberrypi:~ $ sudo ln -s /usr/bin/python3 /usr/bin/python       
pi@raspberrypi:~ $ python -V    
Python 3.5.3  
pi@raspberrypi:~ $ which python    
/usr/bin/python   

可見這樣執行 .py 預設就會使用 Python 3 了, 再次於 /home/pi 底下執行 django-admin.py 就成功了, 順利建立了 mysite 網站架構 :  

pi@raspberrypi:~ $ django-admin.py startproject mysite      
pi@raspberrypi:~ $ tree mysite    
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

這時切換到 mysite 底下執行 manage.py 並開啟 8000 運行 Django 本身的開發伺服器 :

pi@raspberrypi:~/mysite $ python manage.py runserver 127.0.0.1:8000 
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

July 31, 2019 - 11:07:19
Django version 2.2.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

然後開啟樹莓派的 Chromium 瀏覽器連線 localhost:8000 即顯示 Django 歡迎網頁 :




[31/Jul/2019 11:08:08] "GET / HTTP/1.1" 200 16348
[31/Jul/2019 11:08:08] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
[31/Jul/2019 11:08:09] "GET /favicon.ico HTTP/1.1" 404 1972


但是如果在 Nginx 的預設站台 /var/www/html 或上一篇文章中自建的虛擬目錄 /var/www/test 執行 django-admin.py 卻出現  "No module named 'django'" 的錯誤訊息, why

pi@raspberrypi:/var/www/test $ sudo django-admin.py startproject mysite   
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, in <module>
    from django.core import management
ImportError: No module named 'django'    

因為我對 Linux 的設定還不熟, 所以這個問題以後再研究.

總結以上測試, 結論是 :
  1. 要把 Django 安裝目錄下的 django-admin.py 與 /user/local/bin 建立連結 :
    sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin
  2. 要把預設的 python 指令改連結到 Python 3 程式 :
    sudo rm -f /usr/bin/python
    sudo ln -s /usr/bin/python3 /usr/bin/python
只要先完成這兩個動作, 就可以在 /home/pi 下建立 Django 站台 :

django-admin.py startproject mysite


參考 :

使用uWSGI和nginx来设置Django和你的web服务器
树莓派部署django项目
在樹莓派上搭建 Nginx + uWSGI + Django 架構伺服器的過程中所學到的
Django Uwsgi Nginx 實現生產環境部署
Python/WSGI应用快速入门
树莓派:django,uwsgi,nginx安装与设置
三步在樹莓派上部署nginx+uWSGI+flask
Setting up an NGINX web server on a Raspberry Pi
树莓派部署django项目 (一鍵重啟)
树莓派:django,uwsgi,nginx安装与设置
# linux複製指定目錄下的全部檔案到另一個目錄中,linux cp 資料夾
在Raspbian上安裝nginx、PHP、Django與uWSGI
No Module named django.core


沒有留言 :