Django生產環境佈署設定
ubuntu 13.04
1. ubuntu update & python3.3 distribute
ubuntu13.04內建已安裝python2.7.4及3.3.1,因此不須特意安裝python。著重在python相關套件及django安裝設定。
首先將全系統更新一遍,取得最新狀態。
sudo apt-get update |
安裝distribute,以便後續能使用easy_install指令,能簡便的線上取得套件安裝。
安裝python distribute套件。
直接到官網下在最新版。
https://pypi.python.org/pypi/distribute
解壓之後,以python指令安裝。
tar -xvf distribute-0.6.44.tar.gz cd distribute-0.6.44/ sudo python3.3 setup.py install |
如果是用python3.3指令安裝,便會出現easy_install-3.3的版本。後續如要加裝其他python3.3的套件,請用這版指令。
如果是用python2.7指令安裝,便會出現easy_install-2.7的版本。後續如要加裝其他python2.7的套件,請用這版指令。
安裝pip試試看。
sudo easy_install-3.3 pip |
沒有錯誤訊息,應該就OK了。
2. Install Django
由於我們希望日後部署的程式都以python3.3為主。因此後面都用easy_install-3.3版的指令進行。(重要)
sudo easy_install-3.3 django |
顯示django版本。
3. Install apache2
django內建有微型的web server,測試開發好用,但佈署在實際生產環境時,建議應以成熟的web server為主。
這裡使用apache2,使用apt-get安裝即可。
sudo apt-get install apache2 |
4. Install mod_wsgi
要讓apache能與python溝通,最重要的就是mod_wsgi這支模組。雖然還有另一隻模組mod_python可供選擇。
不過這裡我們只以mod_wsgi為例。
拜apt-get之賜,安裝甚為簡單。但須注意版本對應問題。如果預計生產環境是以python3.3版為主,就一路都使用安裝3.3版的相關套件指令。
如果預計生產環境是以python2.7版為主,就一路都使用安裝2.7版的相關套件指令。
當然很多人都知道有virtualenv這玩意。在開發時期多版本相當好用,但個人習慣在實際生產環境中,一台web機,會選定以python3.X或2.X為主力,避免混用。
mod_wsgi有兩種版本,for 2.X的和3.X的。
若是要讓apache與python 2.X溝通
sudo apt-get install libapache2-mod-wsgi |
若是要讓apache與python 3.X溝通
sudo apt-get install libapache2-mod-wsgi-py3 |
如果裝了3.X版的,又同時裝了2.X,會變成2.X為主。後續可能會有模組引入失敗問題,導致網頁錯誤,不建議。
5. create empty django project
建立一個django的空白範本專案,測試用。
專案建立在 /srv/www/ 路徑底下。名稱mysite
sudo django-admin.py startproject mysite |
使用django內建的web服務啟動看看。
sudo python3.3 manage.py runserver |
這就是正常的。
ctrl+c結束。
6. edit wsgi.py
編輯專案裡的wsgi.py
/srv/www/mysite/mysite/wsgi.py
/srv/www/mysite就是專案放置路徑。
import os import sys path = '/srv/www/mysite' if path not in sys.path: sys.path.append(path) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() |
7. config apache
編輯virtual host
sudo vim /etc/apache2/sites-available/mysite |
<VirtualHost *:80> ServerAdmin admin@vsrv3 ServerName vsrv3 DocumentRoot /srv/www/mysite # mod_wsgi settings WSGIDaemonProcess mysite python-path=/srv/www/mysite WSGIProcessGroup mysite WSGIScriptAlias / /srv/www/mysite/mysite/wsgi.py # Static file alias so static files can be referenced by /static/ Alias /static/ /srv/www/mysite/static/ # Static files permissions # Used for serving static files. <Directory /srv/www/mysite/static> Order deny,allow Allow from all </Directory> # Project wsgi permissions # Used for serving django pages. <Directory /srv/www/mysite/mysite> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory> </VirtualHost> |
8. start service
都設定完畢啟動apache服務
sudo a2ensite mysite sudo service apache2 reload |
9. test OK!
如有問題,應詳加觀察紀錄檔,以取得問題點。
/var/log/apache2/error.log
錯誤訊息。(mod_wsgi 2.X和3.X都裝就會像這樣)
正確執行的訊息
10.如果佈署程式中含有sqlite資料庫,而出現無法開啟唯讀資料庫訊息時,必須變更資料夾及資料庫擁有者。
以本例來說就是要執行下列指令。
sudo chown www-data /srv/www/dj3 sudo chown www-data /srv/www/dj3/database.sql |
或乾脆點
sudo chown -R www-data /srv/www/dj3 |
參考資料
1. http://jonblack.org/2012/07/07/django-deployment-apache-and-mod_wsgi/