利用 Mod_wsgi 在 Apache 上部屬 Django

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

請支持《傑瑞窩在這》原創文章。原文標題:利用 Mod_wsgi 在 Apache 上部屬 Django,原文網址:https://jerrynest.io/mod-wsgi-apache-django/
$ ./manage.py runserver 0.0.0.0:8000

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

http://WEB_IP:8000

建立 static 與 template 目錄

建立兩個目錄 static 與 template,把靜態資料 (如 CSS, JavaScript) 以及模板分開。整個 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 的 Apache 2 設定檔在 /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

Apache 設定

啟用新配置檔

$ sudo a2ensite site

移除舊的配置檔

$ sudo a2dissite XXX

重新啟動 Apache

$ sudo service apache2 restart

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


參考資料

樂於分享、盡情玩耍的全端工程師。長期關注資訊安全、雲端運算與網路行銷等議題,曾獲得玉山黑客松金牌,擔任過軟體測試實習生、技術文案寫手。

2 個回應

  1. Jonathan Cheng Reply

    想請教一下關於
    WSGIDaemonProcess project python-path=/home/user/project:/home/user/venv/lib/python2.7/site-packages
    這行您的django project 和虛擬環境venv都是在/home/user/底下同個目錄嘛?
    因為我自己進入venv的方式是
    cd /home/user/venv
    source bin/activate
    cd project
    如果project和venv都在同一個目錄不知如何進入虛擬環境?

    • 您好
      我的django project和venv在同個目錄唷,也就是user之下
      可以不進去venv資料夾執行,如下
      source venv/bin/activate

發表迴響