最近在用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 webmaster@dummy-host2.example.com
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 webmaster@dummy-host2.example.com
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
下面附上我的目录截图,方便大家参考: