Django有內建一個server,方便我們進行開發與測試,但官方"非常不建議"使用內建server做非開發用途的服務。因此,網站開發完成,我們會將其部屬到apache這類server上。以下就筆記一下如何在apache上部屬django


前情題要

請先在虛擬環境下安裝好 Django

還沒有安裝的話,可以參考這篇:在虛擬環境下安裝Django

以下測試環境為

Ubuntu 14.04 LTS, Python2, Django 1.9


建立一個Django project

建立一個專案,名稱為project

$ django-admin.py startproject project

把server打開,port設定為8000

$ ./manage.py runserver 0.0.0.0:8000

打開瀏覽器,透過以下網址連上網站。WEB_IP為server的IP

http://WEB_IP:8000


建立static與template目錄

建立兩個目錄static與template,把靜態資料(如css,js)以及模板分開。整個django專案的目錄結構如下

project
├ static
├ templates
├ project
├ manage.py
└ db.sqlite3

接著要修改setting,加入這兩個目錄

project/settings.py

...

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/'), ],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
}, ]

...

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, & quot; static & quot;),
)

安裝apache2與mod_wsgi

$ sudo apt-get install apache2 `libapache2-mod-wsgi`

建立一個 apache配置檔

Apache的預設目錄位於

/var/www/html

而Django專案的目錄在

/home/user/project/project

可以直接把專案搬到Apache的預設目錄,但好的方法應是設定配置檔。透過以下的設置,告訴apache要怎麼連結對應的網址與位置。 ubuntu的apache2設定檔在 /etc/apache2/,到此目錄下新增一個設定檔,名為site.conf

$ sudo vim /etc/apache2/sites-available/site.conf

#ServerName www.example.com DocumentRoot /var/www/html Alias /phpmyadmin /usr/share/phpmyadmin Require all granted Alias /static /home/user/project/static Require all granted Require all granted WSGIDaemonProcess project python-path=/home/user/project:/home/user/venv/lib/python2.7/site-packages WSGIProcessGroup project WSGIScriptAlias / /home/user/project/project/wsgi.py ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
  • Alias /phpmyadmin 如果有安裝phpmyadmin,就要在這邊做導向,否則交給django後,就無法連結了
  • Alias /static static目錄位置
  • Directory /home/user/project/project 專案位置
  • WSGIDaemonProcess python套件皆存在虛擬環境目錄內,因此要設定位置

設定檔案權限

將擁有者改為 apache的 www-data,讓資料庫與檔案能正常存取

$ chmod 664 ~/project/db.sqlite3
$ sudo chown :www-data ~/project/db.sqlite3
$ sudo chown :www-data ~/project
$ sudo a2ensite sitename

如果設定後出現問題,可以看看apache的error log

# cat /var/log/apache2/error.log

啟用新配置檔

$ sudo a2ensite site

移除舊的配置檔

$ sudo a2dissite XXX

重新啟動apache

$ sudo service apache2 restart

完整的部屬還需要做很多設定,例如關閉debug mode、設置404 page等等,以後再補充


參考資料