樹莓派部署django項目 | 樹莓派小無相系列

人生苦短,快用 python。由於剛剛接觸到 django,實現項目以後,對部署不太熟悉,因此在樹莓派上嘗試一下。文中教程 Linux 通用。javascript

部署概覽

咱們採用 nginx + uwsgi 的方案進行部署。整個系統架構圖以下:php

nginx-uwsgi

環境配置

首先須要安裝 virtualenv 爲其提供獨立的環境,命令行以下:css

pip3 install virtualenv

建立並生成環境,個人項目名爲 demo,我決定將它放置在 /home/pi/www/demo 下,命令行以下:html

cd ~/www/demo
python3 -m virtualenv --no-site-packages venv

激活環境命令爲:java

source venv/bin/activate

注:激活環境後,輸入命令的指示標誌前會變成相似 (venv) pi@raspberrypi:~/www/demo $。python

退出當前環境命令爲:nginx

deactivate

django 項目配置

環境配置好後,即可以準備項目的上傳。該部分的全部命令皆是在激活虛擬環境(source venv/bin/activate)以後進行。git

(1). 在編寫 django 項目的測試機器上,進入項目根目錄(存着 manage.py 文件的目錄),cd 到該目錄,以後運行以下命令生成擴展庫信息列表:github

pip freeze > requirements.txt

(2). 把 django 項目整個傳到樹莓派上,項目根目錄(manage.py 同級目錄)下的所有文件所有複製到樹莓派項目目錄,複製以後,狀況大概是這樣:數據庫

(venv) pi@raspberrypi:~/www/demo $ ls
demo  guestbook  manage.py  requirements.txt  venv

(3). 安裝擴展庫,記住在激活的環境下執行,命令行以下:

pip3 install -r requirements.txt

(4). 上傳文件後把 /<項目名>/<app名>/migrations/ 下的相似00.. 的記錄文件所有刪除,可是不要刪除別的文件。

(5). 配置 django 項目的設置,若是設置項存在便修改,不存在則添加,改動以下:

DEBUG = False
ALLOWED_HOSTS = ['192.168.1.37', '127.0.0.1', 'demo.pi.com']
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

ALLOWED_HOSTS:容許訪問的主機,若是你想經過某個 host 訪問,就將它添加到這裏,假設你想經過樹莓派 ip(192.168.1.37) 訪問,就將 192.168.1.37 添加到這裏。

STATIC_ROOT:只在部署環境下生效的配置。部署環境下,效率更高的 niginx 會根據該目錄提供靜態環境。

(6). 將網站生成靜態文件:

python3 manage.py collectstatic

(7). 配置好上述後,即可以同步並建立數據庫了,先進入項目根目錄,以後執行以下命令:

python3 manage.py makemigrations
python3 manage.py migrate

(8). 創建管理員帳號:

python3 manage.py createsuperuser

(9). 完成上述工做後,就能夠跑一跑檢查一下是否可以正常運行啦:

python manage.py runserver 0.0.0.0:8000

注:這時候打開網頁會發現 css 樣式都未應用,是由於靜態文件已經再也不是 django 管理了,以後咱們會讓 nginx 接管它。

uwsgi 配置

仍然是在激活的環境(source venv/bin/activate)中進行。

安裝 uwsgi:

pip3 install uwsgi

注:若是安裝出現錯誤,能夠嘗試先安裝 python-dev 包:sudo apt-get install python-dev

配置 uwsgi,咱們使用 .ini 文件配置。

新建一個 uwsgi 文件夾存放 uwsgi 相關的文件(配置、日誌等),這個文件夾能夠存放在任意位置,我將它放置在了 django 項目根目錄下,其目錄即爲 /home/pi/www/uwsgi/,在文件夾下新建一個 uwsgi.ini 文件。文件內容以下:

# uwsgi使用配置文件啓動
[uwsgi]
# 項目根目錄,並不是是app目錄
chdir=/home/pi/www/demo/
# wsgi.py 的路徑,demo是wsgi.py存在的目錄名
module=demo.wsgi:application
# 指定sock的文件路徑,用來與nginx通訊       
socket=/home/pi/www/uwsgi/uwsgi.sock
# 進程個數       
workers=4
pidfile=/home/pi/www/uwsgi/uwsgi.pid
# 指定IP端口,這裏能夠用來測試uwsgi與django項目之間是否準確鏈接。調試好後能夠註釋掉
# 若是開啓了能夠不用開啓nginx服務而直接經過 ip:8000       
# http=192.168.1.37:8000

# 這裏使用上面收集的靜態文件夾目錄
static-map=/static=/home/pi/www/demo/static
# 啓動uwsgi的用戶名和用戶組
uid=pi
gid=root
# 啓用主進程
master=true
# 自動移除unix Socket和pid文件當服務中止的時候
vacuum=true
# 序列化接受的內容,若是可能的話
thunder-lock=true
# 啓用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩衝
post-buffering=4096
# 設置日誌目錄
daemonize=/home/pi/www/uwsgi/uwsgi.log

啓動 uwsgi 服務:

uwsgi --ini uwsgi.ini

nginx 配置

安裝 nginx:

sudo apt-get install nginx

由於我以前在樹莓派上作了 dns 解析,將 pi 的 ip 地址解析到了 pi.com 這個域名上,因此我爲這個項目配置的域名爲 demo.pi.com,編輯 nginx 對項目的配置文件:

sudo nano /etc/nginx/sites-available/demo.pi.com

注:ctrl+o 以後回車保存,ctrl+x 退出。

文件內容以下:

server { 
    listen 80; 
    server_name demo.pi.com; #若是解析到域名便填寫域名,不然填寫ip地址便可
    charset utf-8;
    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # 指定項目路徑uwsgi
    location / {
        # uwsgi_params在nginx文件夾下
        include /etc/nginx/uwsgi_params; 
        # 設置鏈接uWSGI超時時間
        uwsgi_connect_timeout 30; 
        # nginx與uwsgi的通訊方式,動態請求會經過sock傳遞給uwsgi處理
        uwsgi_pass unix:/home/pi/www/uwsgi/uwsgi.sock;
    }

    # 這裏使用上面收集的靜態文件夾目錄
    location /static/ {
      alias /home/pi/www/demo/static/;
      index index.html index.htm;
    }
}

接下來建立一個軟連接到 /etc/nginx/sites-enabled/ 目錄下,使配置文件生效:

sudo ln -s /etc/nginx/sites-available/demo.pi.com /etc/nginx/sites-enabled/

重啓 nginx 使其生效:

sudo nginx restart

一鍵重啓腳本

每次網站有變更時,總要在作這麼幾個事,關閉原有 uwsgi 服務,啓動 uwsgi 服務,重啓 nginx,太繁瑣,咱們寫個腳本搞定它,我把腳本放在了 ~/www/uwsgi/ 這個目錄,方便管理。腳本名爲 run.sh,內容以下:

#!/bin/sh
sudo killall -9 uwsgi
/home/pi/www/demo/venv/bin/uwsgi --ini /home/pi/www/uwsgi/uwsgi.ini
sudo /etc/init.d/nginx restart

當中第三行的 uwsgi 相關路徑換爲你的項目對應的就 OK。

別忘了給這個文件執行權限:

chmod +x run.sh

以上完成以後,運行 ./run.sh 重啓整個項目,而後在其餘設備訪問試試。

參考

部署Django項目 - Junay

系列說明

小無相功是小說《天龍八部》中「逍遙派」的一門內功,講究不着形相,無跡可尋,熟悉後再瞭解其餘武功招式即可依仗威力習得,甚至青出於藍而勝於藍。而樹莓派形似小無相功,同具無限可能,瞭解一些基礎即可輕鬆上手,去探尋其餘更多未知。所以,系列以此爲題,帶來一系列樹莓派相關的教程,同時也是對我的長期折騰樹莓派以來的一個歸檔整理。

注:本做品採用知識共享署名-非商業性使用-禁止演繹 3.0 未本地化版本許可協議進行許可。

相關文章
相關標籤/搜索