最近在用Django,研究了一下在apache 下配置Django,踩了好多坑,來記錄一下
由於之前的apache在跑php 程序,用的是默認端口80,想配置php 和django 同時能運行,那麼Django 需要配置另外一個端口:8000,也就是在apache 的配置文件中增加一個<VirtualHost> 設置對應的django 的根目錄就可以,整體的思路就是這樣的,下滿開始配置:
(1)現有系統和軟件的版本:
A 操作系統 :win7 64位
B python :Python 3.6.5 (64位)
C apache 版本:Apache/2.4.33 (Win64)
值得注意的是:python 和apache 的版本的位數應該保持一致,由於之前是用phpstudy 的環境搭建的,apache 的版本是32位的,但是python 是64位的導致在apache 加載python時候失敗,之後重新安裝了apache 64位 問題解決,如果版本32/64位 不正確可能會出現下面的錯誤:
Syntax error on line 535 of D:/Apache24/conf/httpd.conf:
Cannot load d:/programdata/anaconda3/python36.dll into server:
%1 \xb2\xbb\xca\xc7\xd3\xd0\xd0\xa7\xb5\xc4 Win32 \xd3\xa6\xd3\xc3\xb3\xcc\xd0\xf2\xa1\xa3
下面簡單介紹下查看版本號的方法:
1)Pyhton
window 進入cmd 命令行後,輸入python 回車:
上圖中紅色方框中的信息就是python版本的位數
2)apache
在cmd 命令行中 進入到apache 的安裝目錄,我的apache 安裝到了D:\Apache24 下,進入到該目錄的bin 文件夾下,會看到httpd.exe文件,然後 ,輸入 httpd -v 回車
(2) 安裝python 的mod_wsgi 模塊
點擊 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi 下載apache和python對應的版本,我的apache 是2.24 ,python 是3.6.5 64位,我下載的是 mod_wsgi‑4.5.24+ap24vc14‑cp36‑cp36m‑win32.whl ,下載到python安裝目錄下的Scripts 下,然後在cmd 命令行進入到mod_wsgi‑4.5.24+ap24vc14‑cp36‑cp36m‑win32.whl 這個文件所在的目錄下,輸入:
php install mod_wsgi‑4.5.24+ap24vc14‑cp36‑cp36m‑win32.whl
安裝成功後 輸入 mod_wsgi-express module-config
將運行的結果:複製到 apache 的配置文件 d:/Apache24/conf/httpd.conf
LoadFile "d:/programdata/anaconda3/python36.dll"
LoadModule wsgi_module "d:/programdata/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "d:/programdata/anaconda3"
至此 mod-wsgi 安裝成功。
(3)啓動apache
在命令行中,進入到apache 的安裝目錄:D:/apache24/bin , 輸入命令:
httpd -k start
啓動apache之後,瀏覽器中打開:http://localhost/ 呈現出apache 的啓動頁面:
這說明apache 安裝並啓動成功了,接下來我們來配置一下python的相關信息
(4)在 d:/Apache/conf/httpd.conf 中增加如下配置信息:
Listen 8000 #django 程序的接口
#python
LoadFile "d:/programdata/anaconda3/python36.dll"
LoadModule wsgi_module "d:/programdata/anaconda3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "d:/programdata/anaconda3"
#設置wsgi路徑
WSGIScriptAlias / E:/pro/django/exam/exam/wsgi.py
WSGIPythonPath E:/pro/django/exam/ #設置請求django 請求的根目錄的路徑,這個要設置,不然會報500錯
注意:上面的配置信息中,WSGIPythonPath 一定要配置好,不然會報500錯誤,在錯誤日誌中能看到報錯信息爲:“ModuleNotFoundError: No module named 'exam' ”
實際上是在瀏覽器訪問地址時候,apache 會指定wsgi 的路徑去尋找對應的wsgi.py, WSGIPythonPath 是指明根目錄,在wsgi.py 中會有 “os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")” 如果不指定WSGIPythonPath 會報錯: ModuleNotFoundError: No module named 'exam'
virsualhost 配置信息,可以放到httpd.conf 裏,也可以單獨放一個.conf 中,方便維護,我保存在 vhosts.conf中,然後在httpd.conf 裏引入 vhosts.conf: "Include conf/vhosts.conf"
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName localhost
ErrorLog D:\Apache24\logs\error.log
CustomLog D:\Apache24\logs\access.log common
# 根目錄
DocumentRoot "D:/Apache24/htdocs"
<Directory "D:/Apache24/htdocs">
AllowOverride None
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8000>
ServerAdmin [email protected]
ServerName localhost
ErrorLog D:\Apache24\logs\error_django.log
CustomLog D:\Apache24\logs\access_django.log common
# 根目錄
DocumentRoot "E:/pro/django/"
<Directory "E:/pro/django/exam/exam">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
#設置根目錄
<Directory "E:/pro/django">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
(5) python的配置文件
1) settings.py
#設置允許訪問的主題頭信息
ALLOWED_HOSTS = ['127.0.0.1','localhost']
2)wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings") #設置成項目的配置文件的路徑
application = get_wsgi_application()
3)setting.wsgi
import os
import sys
import django.core.handlers.wsgi
sys.path.append(r'E:/pro/django/') #django 項目路徑
os.environ['DJANGO_SETTINGS_MODULE'] = 'exam.settings' #配置文件settings.py 所在路徑
application = django.core.handlers.wsgi.WSGIHandler()
設置完成後重啓apache,然後訪問 http://localhost:8000/ 就能看見django 的網站了
附錄:我的項目:exam 是我用 django-admin創建的項目,目錄在E:/pro/django/
django-admin startproject exam
下面附上我的目錄截圖,方便大家參考: