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, "static"),
)


安裝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
<VirtualHost *:80>
        #ServerName www.example.com

        DocumentRoot /var/www/html

        Alias /phpmyadmin /usr/share/phpmyadmin
        <Directory /phpmyadmin>
            Require all granted
        </Directory>

        Alias /static /home/user/project/static
        <Directory /home/user/project/static>
            Require all granted
        </Directory>

        <Directory /home/user/project/project>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        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

</VirtualHost>
  • 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等等,以後再補充


參考資料

How To Serve Django Applications with Apache and mod_wsgi on Ubuntu 14.04

Django 部署(Apache)