部署Django + Apache伺服器

部署Django + Apache伺服器

來自專欄 玩轉樹莓派

上篇我們介紹了三種遠程控制樹莓派的方法,今天將把我部署在阿里雲的Django項目遷移到樹莓派上。


1. SSH登入到樹莓派。

ssh pi@192.168.1.108

2. 新建一個名為app的目錄,將項目源碼checkout到app目錄中。

mkdir appcd appgit clone https://github.com/username/project_name

3. virtualenv。

  • 因為我的樹莓派的Python版本和這個Django項目的Python版本不一致,所以需要創建一個獨立的Python運行環境,virtualenv就是用來創建隔離的Python環境的。

sudo pip3 install virtualenvcd project_name

  • 創建名為venv的運行環境,--no-site-packages表示原來的系統python環境不會複製過來,創建的環境是全新的。

virtualenv --no-site-packages venv

  • 進入virtualenv,每次進入都需要使用這個命令,退出環境使用deactivate

source venv/bin/activate

  • ~/.bashrc文件最後加上以下代碼以確保pip3安裝的時候將packages安裝到virtualenv中而不是系統中,然後退出SSH再重新登入樹莓派並進入virtualenv

vi ~/.bashrc# add this line to ~/.bashrc.export PIP_REQUIRE_VIRTUALENV=truecd app/project_namesource venv/bin/activate

4. Django項目依賴。

  • 安裝Django項目的所有依賴(可選,如果是新項目就不需要安裝)。

sudo pip3 install xxxxx...sudo apt-get install xxxx...

  • 查看pip3安裝了哪些依賴。

pip3 freeze # show installed packages in requirements formatpip3 list # show all installed packagespip3 freeze --all == pip listpip3 freeze > requirements.txt # output all requirements to file

5. 安裝資料庫。

  • 資料庫我們使用的是Django官方推薦的postgresql

sudo apt-get install postgresql-9.6 postgresql-server-dev-9.6# vi /etc/postgresql/9.6/main/pg_hba.conf# (Change all authentication mechanisms from ident to md5)sudo /etc/init.d/postgresql reload

  • 創建賬號和資料庫

# switch to postgres account(venv) pi@raspberrypi:~/app/backend $ sudo su - postgres# create postgres userpostgres@raspberrypi:~$ createuser pi# create databasepostgres@raspberrypi:~$ createdb backend# sql environmentpostgres@raspberrypi:~$ psql# add password for userpostgres=# ALTER USER pi WITH PASSWORD 123456; ALTER ROLE# make user superuserpostgres=# ALTER ROLE pi WITH SUPERUSER; ALTER ROLE# add create roll permissionpostgres=# ALTER ROLE pi WITH CREATEROLE;ALTER ROLE# logoutpostgres-# qpostgres@raspberrypi:~$ exitlogout

  • 從原來伺服器導出數據,database為你的資料庫名稱。(可選,如果是新項目就不需要)

pg_dump <database> > dump.sql

  • 導入到當前資料庫(可選,如果是新項目就不需要)

(venv) pi@raspberrypi:~/app/backend/sqls $ psql -U pi backend < dump.sql

  • settings.py設置資料庫信息

DATABASES = { default: { ENGINE: django.db.backends.postgresql_psycopg2, NAME: backend, PASSWORD: 123456, HOST: localhost, PORT: , }}

6. 現在運行Django,並在樹莓派運行localhost:8000/admin就會出現如下畫面了。

(venv) pi@raspberrypi:~/app/backend $ python manage.py runserver

7. Apache2。

  • 安裝Apache2

sudo apt-get install apache2 libapache2-mod-wsgi3

  • 添加並編輯配置文件

cd /etc/apache2/sites-availablesudo cp 000-default.conf backend.confsudo vi backend.conf

  • 配置文件內容,使用絕對路徑

<VirtualHost *:8000> WSGIScriptAlias / ~/app/backend/backend/wsgi.py DocumentRoot "/home/pi/app/backend" Alias /static/ /home/pi/app/backend/static/ Alias /media/ /home/pi/app/backend/media/ # mkdir /home/pi/app/backend/logs if not exists. ErrorLog "/home/pi/app/backend/logs/error_log" CustomLog "/home/pi/app/backend/logs/access_log" <Directory "/home/pi/app/backend/backend"> Require all granted </Directory> <Directory "/home/pi/app/backend/static"> Require all granted </Directory> <Directory "/home/pi/app/backend/media"> Require all granted </Directory></VirtualHost>

  • 因為需要將Apache和Django進行綁定,所以需要將埠更改為它們共有的

sudo vi /etc/apache2/ports.conf# add this two line to /etc/apache2/ports.confNamevirtualHost *:8000Listen 8000

  • /etc/apache2/apache2.conf添加ServerName

sudo vi /etc/apache2/apache2.conf# add this line to /etc/apache2/apache2.confServerName 192.168.1.201# ServerName localhost# ServerName 127.0.0.1

  • 啟用配置文件並重新載入Apache2

# enable backend.confsudo a2ensite backend.conf# reload apache2sudo service apache2 reload

  • 使默認配置失效,否則區域網內無法使用

sudo a2dissite 000-default.conf

  • 重啟Apache2

sudo /etc/init.d/apache2 restart

  • 這樣你在樹莓派里運行192.168.1.201:8000/admin就會出現如下畫面了。如果你只是在區域網內使用這個伺服器的話到這步就可以結束了,如果需要做成被外網訪問就需要添加動態域名了。

  • 如果出現如下錯誤,表示Apache2的默認用戶名是www-data,我們需要將默認用戶名改為pi並重啟Apache2

sudo vim /etc/apache2/envvars# 將APACHE_RUN_USER和APACHE_RUN_GROUP都改為pi# export APACHE_RUN_USER=www-data# export APACHE_RUN_GROUP=www-dataexport APACHE_RUN_USER=piexport APACHE_RUN_GROUP=pisudo /etc/init.d/apache2 restart

8. 動態域名。

  • 進入no-ip網站創建賬號然後通過郵箱激活登入
  • 登入以後進入https://my.noip.com,在Hostname這行輸入你想添加的hostname,在Domain這行選擇一個domain,如果已經註冊了就換一個,點擊Add Hostname添加hostname

  • 創建完成後你將看到一條記錄,點擊Active進入域名詳細列表。

  • 點擊畫圈黃色字體進入配置。

  • 點擊Configure Now

  • 選擇你的域名(如果只有一個會默認選中)並點擊Next Step

  • 路由器我這邊是TP-Link,設備選中Rasspberry pi

  • 選中Yes並點擊Next Step

  • 點擊Download DUC

  • 這邊我們選中Linux並點擊Download Now

  • 下載完客戶端後解壓並編譯安裝

tar vzxf noip-duc-linux.tar.gzcd noip-2.1.9-1makesudo make install

  • 安裝過程中輸入信息

# 輸入no-ip賬號Please enter the login/email string for no-ip.commyemail@gmail.com#輸入no-ip密碼Please enter the password for user....*******# no-ip客戶端檢查你路由器外部網址變化的間隔默認是30分鐘,我們改為10分鐘,因為國內ISP會每幾天強制斷線、更換IP,這時noip會短暫失效。Please enter an update interval: [30](Increments in minutes that you want no-ip client to check if your router』s external dynamic IP address has changed and updates it accordingly.)10 # 直接按回車Do you wish to run something at successful update? [N] (y/N)

  • 啟動noip客戶端,如果需要開機就啟動,將下面這行添加到/etc/rc.localexit 0這行前面

sudo /usr/local/bin/noip2

  • 其它no-ip命令

sudo /usr/local/bin/noip2 -C # 重新配置一次sudo /usr/local/bin/noip2 -S # 顯示當前運行狀態

  • 安裝完以後點擊Next Step

  • 在路由器設置埠轉發,可以參考this guide這篇文章或者我之前寫的文章3.0 安裝Duck DNS,實現遠程訪問Home Assistant的第8條,我們在Apache2配置的是8000埠,所以我們轉發外部8000埠到內部8000埠。設置完路由器以後我們點擊Next Step

  • 輸入你轉發的埠號並點擊Check Port進行驗證

  • 如果顯示Port xxx is not open說明你路由器埠轉發還不正確需要重新配置。

  • 如果顯示Port xxx is open表示埠轉發成功點擊Next Step頁面會顯示配置成功

  • 暫時還不知道什麼原因,外網可以訪問no-ip:8000這個網址了,但是本地網路內的設備還是只能使用192.168.1.201:800來訪問這個伺服器,之後知道原因以後將會更新

這樣我們就將原來在阿里雲的伺服器遷移到自己的樹莓派上了。


推薦閱讀:

TAG:Django框架 | Apache | 樹莓派RaspberryPi |