原文链接:http://www.nicemxp.com/articles/7
本地Apache+mod_wsgi部署Django
搭建博客网站,开始用Django内置的manage.py runserver 0.0.0.0:8080来本地搭建,本地数据库,逻辑和模板都写好并跑通后上网查找接下来需要将自己的程序托管
到Apache,Apache的组件中mod_wsgi对python的支持最好,所以本着跟随主流,决定用Apache+mod_wsgi部署自己的网站。其中遇到了很多坑,折磨的很痛苦。
一、安装Apache
有2.2x和2.4x两种版本,自己下的2.4x,但是官网上没有windows的release版,因此只能从目前网络中获取release版,或者自己编译一个release版,但是就像
官网说的一样,将Apache编译到windows真的是一件棘手的事情。编译教程:http://man.chinaunix.net/newsoft/ApacheManual/platform/win_compiling.html。
release版本下载:,VC10(vs2012编译),VC14(vs2015编译),VC9(vs2008编译):http://www.apachehaus.com/cgi-bin/download.plx,
VC14:https://www.apachelounge.com/download/。上网查找都说这个需要跟操作系统有关,win64位下载x64的,win32的下载x86的。并且与python版本有关,
一般python2.7下载VC9,python3.x下载VC10, 因此我下载了httpd-2.4.25-x64-r1.zip(VC9)(因此埋下了巨坑!)
下载好后解压到了与项目目录的同级目录,我的项目目录是D:/WebSite/blog, 所以解压后Apache在D:\WebSite\Apache24,之后修改conf/httpd.conf文件,
如下:
...
Define SRVROOT "D:/WebSite/Apache24" #其实这里改好后凡是引用该变量的地方不需要再更换了,但是自己还是按照网上说的都给换了。
ServerRoot "D:/WebSite/Apache24"
...
Listen 127.0.0.1:8089 #修改端口号,但是你监听的端口号很有可能被其他进程占用了,所以在监听时你应该确保该端口号没有被占用!
...
ServerName localhost:8089 #这里2.4是打开的,2.2注释掉了,需要你打开否则Apache start时会失败。
...
DocumentRoot "D:/WebSite/Apache24/htdocs"
<Directory "D:/WebSite/Apache24/htdocs">
...
ScriptAlias /cgi-bin/ "D:/WebSite/Apache24/cgi-bin/"
...
<Directory "D:/WebSite/Apache24/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
...
...
Define SRVROOT "D:/WebSite/Apache24" #其实这里改好后凡是引用该变量的地方不需要再更换了,但是自己还是按照网上说的都给换了。
ServerRoot "D:/WebSite/Apache24"
...
Listen 127.0.0.1:8089 #修改端口号,但是你监听的端口号很有可能被其他进程占用了,所以在监听时你应该确保该端口号没有被占用!
...
ServerName localhost:8089 #这里2.4是打开的,2.2注释掉了,需要你打开否则Apache start时会失败。
...
DocumentRoot "D:/WebSite/Apache24/htdocs"
<Directory "D:/WebSite/Apache24/htdocs">
...
ScriptAlias /cgi-bin/ "D:/WebSite/Apache24/cgi-bin/"
...
<Directory "D:/WebSite/Apache24/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
...
以上这些就是启动Apache的基本修改,主要是端口号和路径,下面准备启动Apache
cmd下进入到D:/WebSite/Apache24/bin
输入:httpd.exe -k install#安装Apache服务,如果报错根据错误提示找原因(我没报错。。)
安装后输入:httpd.exe -k start#这个地方比较容易失败,主要的原因就是上面的配置有问题。
启动成功后在自己的浏览器中输入http://127.0.0.1:8089(我监听的是8089),如果提示it works或者Apache haus的页面表示成功了。
至此Apache的安装就OK了。
二、安装mod_wsgi
安装这个东西折磨了自己两天,茶不思饭不想。。
网上各种教程各种博客文章都说该模块下载地址是http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi,这里面有适合的mod_wsgi.so,下载后扔到Apache的
modules下就好了,然后我进去找到适合我的版本,我本地配置是Apache2.4(vc9,x64), Python2.7,windows64位系统,所以我下载了
mod_wsgi-4.5.15+ap24vc9-cp27-cp27m-win_amd64.whl,如果你的Python安装了wheel可以用wheel解压 wheel umpack xxx.whl,其实直接把whl换成zip用winrar也可以。。
解压后我几乎翻遍了整个文件夹,mod_wsgi.so呢?好吧,可能以前的老版本该网址是收存mod_wsgi.so的,总之在这里没找到。。
之后就一路苦逼的找mod_wsgi.so,找到了几个下载地址。https://github.com/GrahamDumpleton/mod_wsgi/releases/download/4.4.12/mod_wsgi-windows-4.4.12.tar.gz
貌似只有4.4.12有现成的二进制拓展库,其他的需要自己编。CSDN.NET:http://www.csdn.net/tag/mod_wsgi/download 有下载地址,其中http://download.csdn.net/detail/smartcore/9153731
是可以用的,其他的没有测试。
有了mod_wsgi.so就按照教程继续配置httpd.conf文件,
如下:
...
LoadModule wsgi_module modules/mod_wsgi.so
#项目的wsgi.py配置文件路径
WSGIScriptAlias / D:/WebSite/blog/blog/wsgi.py
#项目路径
WSGIPythonPath D:/WebSite/blog
<Directory D:/WebSite/blog/blog>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
...
...
LoadModule wsgi_module modules/mod_wsgi.so
#项目的wsgi.py配置文件路径
WSGIScriptAlias / D:/WebSite/blog/blog/wsgi.py
#项目路径
WSGIPythonPath D:/WebSite/blog
<Directory D:/WebSite/blog/blog>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
...
以上是加入好mod_wsgi.so后的修改,之后噩梦就开始了。。
cmd进入到D:/WebSite/Apache24/bin下输入httpd.exe -k start
提示cannot load modules/mod_wsgi.so into server,\xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\a8\xb5\xc4\xa3\xbf\xe9\xa1\xa3。
然后就蒙了,以为我找的mod_wsgi.so是不对的?然后自己换了各种地址下的mod_wsgi.so,最后都报这个错误。后续就是苦逼的各种看文档各种尝试各种找资料,自己
编译mod_wsgi.so,尝试换成Apache2.2,最后都没用。报的错误原因还是16进制数字,用python直接print这一串16进制数字,输出:无法找到指定模块,有了错误原因就
继续上网搜,在一个网站上有这么一个回答:
1.那你没有隐藏的扩展,并已两次增加了扩展。
2.那mod_wsgi.so文件可读到任何Apache服务用户??。
3.那你的Apache是??32位。
4.那你的Python是32位。
5.已安装你的Py??thon为所有用户,而不仅仅是用户安装它作为。
自己逐一对照了之后想到这里说的是你的Python是32位,而不是操作系统是32位,可是网上的教程要么只说64位下x64要么说windows64位下x64,没有说python是32位还是
64位,我自己也没注意自己的python是64位还是32位,进入cmd下Python回车看到:python 2.7.10(default, may 23 2015,09:40:32)[MSC v.1500 32 bit(intel)] on win32,
一看自己的Python装的是32位的,我的操作系统是64位的,好吧,重新下载了一个Apache2.4(VC9,x86),按照上面重新配置,最后httpd.exe -k start,启动成功!
所以坑就在了这里,没人强调你的python是32还是64,一般都强调了你的Python,你的Apache,你的mod_wsgi.so最好编译环境要统一,否则很可能起不来。
三、最后
启动了之后再浏览器上键入http:127.0.0.1:8089可以看到了自己的网页,但是没有css元素,因为之前静态文件是Django来处理的,现在托管了Apache,静态文件需要
Apache来处理,在httpd.conf下配置:
...
Alias /static/ D:/WebSite/blog/static/
<Directory D:/WebSite/blog/static/>
Require all granted
</Directory>
...
...
Alias /static/ D:/WebSite/blog/static/
<Directory D:/WebSite/blog/static/>
Require all granted
</Directory>
...
Django有收集静态文件的方式,我将所有setting.py安装的app所需的静态文件都收集到了D:/WebSite/blog/static/下,如何收集看官方文档。
之后就可以看到带有css,图片,js的网站了。