Django生產環境佈署設定

  • 5017
  • 0
  • 2013-06-20

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指令,能簡便的線上取得套件安裝。

clip_image002

安裝python distribute套件。

直接到官網下在最新版。

https://pypi.python.org/pypi/distribute

clip_image004

解壓之後,以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的套件,請用這版指令。

clip_image005

如果是用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

clip_image007

顯示django版本。

clip_image008

 

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為主。後續可能會有模組引入失敗問題,導致網頁錯誤,不建議。

clip_image010

 

5. create empty django project

建立一個django的空白範本專案,測試用。

專案建立在 /srv/www/ 路徑底下。名稱mysite

sudo django-admin.py startproject mysite

使用django內建的web服務啟動看看。

sudo python3.3 manage.py runserver

clip_image011

這就是正常的。

clip_image013

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>

clip_image015

 

8. start service

都設定完畢啟動apache服務

sudo a2ensite mysite

sudo service apache2 reload

 

9. test OK!

clip_image017

如有問題,應詳加觀察紀錄檔,以取得問題點。

/var/log/apache2/error.log

錯誤訊息。(mod_wsgi 2.X和3.X都裝就會像這樣)

clip_image019

正確執行的訊息

clip_image021

 

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/