人生苦短,快用 python。由於剛剛接觸到 django,實現項目以後,對部署不太熟悉,因此在樹莓派上嘗試一下。文中教程 Linux 通用。javascript
咱們採用 nginx + uwsgi 的方案進行部署。整個系統架構圖以下:php
首先須要安裝 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
環境配置好後,即可以準備項目的上傳。該部分的全部命令皆是在激活虛擬環境(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 接管它。
仍然是在激活的環境(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:
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
重啓整個項目,而後在其餘設備訪問試試。
小無相功是小說《天龍八部》中「逍遙派」的一門內功,講究不着形相,無跡可尋,熟悉後再瞭解其餘武功招式即可依仗威力習得,甚至青出於藍而勝於藍。而樹莓派形似小無相功,同具無限可能,瞭解一些基礎即可輕鬆上手,去探尋其餘更多未知。所以,系列以此爲題,帶來一系列樹莓派相關的教程,同時也是對我的長期折騰樹莓派以來的一個歸檔整理。
注:本做品採用知識共享署名-非商業性使用-禁止演繹 3.0 未本地化版本許可協議進行許可。