部署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.local的exit 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 |