Django使用Apache2.2通过Mod_wsgi搭建站点服务器


已经搭了无数遍,但是每次都忘了,要找回资料去做,太烦。

windows下:

软件版本:

这两种系统是不同的:32bit 和 64bit,所以千万一定务必必须要知道你是在哪个位数系统下搭站点的。

下面是我在两个不同的环境下的尝试

32bit:

0. windows7 32bit/64bit、windows8.1 64bit    --这三个系统我都试过使用32位的方法搭,没有问题

1. python2.7.10 32 bit

    https://www.python.org/ftp/python/2.7.10/python-2.7.10.msi

2. apache2.2 32bit

    http://mirror.bit.edu.cn/apache//httpd/httpd-2.2.31-win32-src.zip

3. mod_wsgi for python27 32bit

    http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi  下载(mod_wsgi-4.4.21+ap24vc9-cp27-none-win32.whl),相信我,和apache版本、vc runtime版本无关。

4. Django1.7.1    这个不重要啦,自己去下载和配置吧


64bit:

0. windows2008 R2 64bit    --2008只有64位的

1. python2.7.8 64bit

    https://www.python.org/ftp/python/2.7.8/python-2.7.8.amd64.msi    这个扯淡的windows2008除了2.7.8这个版本,其它版本都报错,客官不信可以试试。

2. apache2.2 64bit

    http://download.csdn.net/detail/xuboke/4578999    话说我在官网没有找到apache的64位版本,具体原因可能是我《文献检索》这门课没有学好。

3. mod_wsgi for python27 64bit

    http://download.csdn.net/detail/qustwr/8095291    不知道这个小伙伴是怎么找到支持py27的64位mod_wsgi的。

4. Django1.7.1    这个不重要啦,自己去下载和配置吧


如果嫌麻烦,apache和mod_wsgi我都已经打包好了,在以下两个地址下载,免积分:

CSDN资源:apache2.2 with mod_wsgi for win32_X86    --32位专用

CSDN资源:apache2.2 with mod_wsgi for amd64_X64  --64位专用

而且这两个资源都是我本机测试站点的配置,如果项目名和路径都和我一致的话(这不是扯淡么),就可以直接用。

-----------------------------2016-01-22更新-开始----------------------------------------

昨天装了win10,试着玩玩,无意中发现这个python的版本还是有限制的。

在win10 64bit 下安装了python2.7.11 X64,启动apache没有报错。

但是浏览http://localhost:8000的时候卡了很久,去apache的日志看了一下,error.log日志不断在刷新……

大致内容就是没有找到module里面的site方法,果断卸了2.7.11装2.7.8(手头有,懒得下别的版本了)。

启动成功。

apache日志如下:

[Fri Jan 22 15:44:34 2016] [warn] mod_wsgi: Compiled for Python/2.7.6.
[Fri Jan 22 15:44:34 2016] [warn] mod_wsgi: Runtime using Python/2.7.11.

[Fri Jan 22 15:44:34 2016] [notice] Apache/2.2.19 (Win64) mod_wsgi/3.5 Python/2.7.11 configured -- resuming normal operations
[Fri Jan 22 15:44:34 2016] [notice] Server built: May 28 2011 15:18:56
[Fri Jan 22 15:44:34 2016] [notice] Parent: Created child process 2788
[Fri Jan 22 15:44:34 2016] [warn] mod_wsgi: Compiled for Python/2.7.6.
[Fri Jan 22 15:44:34 2016] [warn] mod_wsgi: Runtime using Python/2.7.11.
[Fri Jan 22 15:44:34 2016] [notice] Child 2788: Child process is running
ImportError: No module named site
[Fri Jan 22 15:44:34 2016] [notice] Parent: Received shutdown signal -- Shutting down the server.
[Fri Jan 22 15:44:34 2016] [notice] Parent: Child process exited successfully.
[Fri Jan 22 15:53:14 2016] [warn] mod_wsgi: Compiled for Python/2.7.6.
[Fri Jan 22 15:53:14 2016] [warn] mod_wsgi: Runtime using Python/2.7.8.

[Fri Jan 22 15:53:14 2016] [notice] Apache/2.2.19 (Win64) mod_wsgi/3.5 Python/2.7.8 configured -- resuming normal operations
[Fri Jan 22 15:53:14 2016] [notice] Server built: May 28 2011 15:18:56
[Fri Jan 22 15:53:14 2016] [notice] Parent: Created child process 2012
[Fri Jan 22 15:53:14 2016] [warn] mod_wsgi: Compiled for Python/2.7.6.
[Fri Jan 22 15:53:14 2016] [warn] mod_wsgi: Runtime using Python/2.7.8.
[Fri Jan 22 15:53:14 2016] [notice] Child 2012: Child process is running
[Fri Jan 22 15:53:14 2016] [notice] Child 2012: Acquired the start mutex.
[Fri Jan 22 15:53:14 2016] [notice] Child 2012: Starting 64 worker threads.
[Fri Jan 22 15:53:14 2016] [notice] Child 2012: Starting thread to listen on port 8000.

-----------------------------2016-01-22更新-结束----------------------------------------


操作步骤:

说真的,配置比较简单,难在软件,你知道么。

首先把mod_wsgi解压后放在apache的modules目录下,一般名字就叫mod_wsgi.so。

剩下的基本就是配置apache,和下面linxu的第1、3点基本是一样的,我这里就重复说一下吧。

首先,讲讲我项目的基本存放路径:

D:/TestDjango/                                 --这个是manage.py存放的路径

D:/TestDjango/TestApp/static       --这个是js等文件存放的根路径

apache:

D:/apache2.2        --32bit

D:/httpd-2.2-x64    --64bit

整个目录结构:

D:.
├─TestDjango
│  ├─TestDjango
│  ├─TestApp
│  │  ├─controls
│  │  ├─migrations
│  │  ├─static
│  │  │  ├─dist
│  │  │  │  ├─css
│  │  │  │  ├─img
│  │  │  │  └─js
│  │  │  ├─plugins
│  │  │  └─template
│  │  └─templates
│  └─upload
├─apache2.2
│  ├─bin
│  ├─conf
│  │  └─extra
│  ├─htdocs
│  ├─logs
│  └─modules
└─httpd-2.2-x64
   ├─bin
   ├─conf
   │  └─extra
   ├─error
   │  └─include
   ├─htdocs
   ├─logs
   └─modules

和我们配置相关的目录我都打了红色。

配置文件是通用的,这里以32位为例。

D:/apache2.2/conf/httpd.conf:

-----------------------------------------------------------------------

……

ServerRoot "D:/apache2.2"

……
Listen 8000

LoadModule wsgi_module modules/mod_wsgi_py27_win32.so      #在LoadModule那一块的最后加上这一句,当然,注意mod_wsgi的存放位置和名字,请按实际的来。

……

DocumentRoot "D:/apache2.2/htdocs"

……

<Directory "D:/apache2.2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

……

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "D:/apache2.2/cgi-bin/"
</IfModule>

……

<Directory "D:/apache2.2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

……

Include conf/extra/Django.conf         #在文件的最后加上这一句

-----------------------------------------------------------------------

好了,然后就是在conf/extra/下面新建一个Django.conf 文档:

D:/apache2.2/conf/extra/Django.conf:

-----------------------------------------------------
NameVirtualHost *:8000
<VirtualHost *:8000>
    ServerAdmin [email protected]
    DocumentRoot "D:/TestDjango/"
    ServerName www.TestDjango.com
    ErrorLog "logs/TestDjango_error.log"
    CustomLog "logs/TestDjango_access.log" common
    WSGIScriptAlias / D:/TestDjango/TestDjango/wsgi.py
</VirtualHost>


WSGIPythonPath D:/TestDjango
<Directory "D:/TestDjango">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
Alias /static D:/TestDjango/TestApp/static
<Location "/static/">
    Order allow,deny        
    Allow from all
</Location>

-----------------------------------------------------

就是照着改,基本都能看懂,我就不多做解释了。


改完后,打开cmd窗口(还是以32位的为例,64位完全一样):

C:\Users\Administrator>d:

D:\>cd D:\apache2.2\bin

D:\apache2.2\bin>httpd -k install -n "TestDjango"     #安装服务服务名是TestDjango,自己YY一个也行

D:\apache2.2\bin>httpd -k start -n "TestDjango"       #启动服务

如果至此没有报错,浏览器打开localhos:8000就可以看到本文最后面的截图了。



=====================================可爱到惨无人道的分隔符======================================================


好了,重点讲一下Linux下的配置:

软件版本:

docker_centos6.x_64bit_minimal

httpd.x86_64_2.2.15-47.el6.centos.1

mod_wsgi-4.4.21

python2.7.11

django1.7.1


操作步骤:
1. 安装apache,并配置

yum install apache (正常来说,默认已经装好了apache2.2版本的)

cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.20160103

修改内容如下:



……

ServerRoot "/etc/httpd"    #确认目录就好,一般默认安装之后就不用改了。

……

Listen 8000

……

ServerName www.HelloWorld.com:8000

……

DocumentRoot "/var/www/html"    #默认情况下不用改

……

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"    #默认情况下不用改

……

<Directory "/var/www/cgi-bin">    #默认情况下不用改

    AllowOverride None

    Options None

    Order allow,deny

    Allow from all

</Directory>


上面写了一大堆废话,其实就是改两个地方,当然,如果你的配置曾经变动过,那么就需要相应地修改回来了。

1. Listen *:8000    #这个是监听的端口

2. ServerName www.HelloWorld.com:8000  #域名+端口号,其实没有绑定域名的情况下,可以不配置的哟(会报warning)


配置完之后就可以测试一下apache是否能正常用了:

service httpd start

在浏览器输入:http://localhost:8000/

可以看到Apache的默认主页:

Django使用Apache2.2通过Mod_wsgi搭建站点服务器_第1张图片



2. 安装Mod_wsgi 及 相关配置:

重头戏来了,这个步骤搞了我两晚。

先告诉大家,这一步需要先安装apache的开发包httpd-devel,而且要重新编译你的python(用自带的2.6.6版本的话,直接yum install mod_wsgi一下就好了,不用这么麻烦。)

首先第一个难点在于下载,Mod_wsgi的下载实在太晦涩了,找了n久,最后突然想起来不如上github上搜索一下,果然有源码:

https://github.com/GrahamDumpleton/mod_wsgi/tree/master

然后安装的时候会接连报两个错:

apxs: command not found        #需要安装httpd的开发包,上面已经安装

apxs:Error: Command failed with rc=65536    #需要重装python2.7,加入参数--enable-shared(下面红色字体)


全部命令如下:

yum install httpd-devel                      #安装apache的开发包httpd-devel

wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tar.xz

tar -xvf Python-2.7.11.tar.xz

cd Python-2.7.11

./configure --enable-shared

make

make install

make clean

make distclean

#这部分选做########################################

#如果你的系统也是从2.6.6升级到2.7的话,就照做吧:

mv /usr/bin/python /usr/bin/python2.6.6                              #备份2.6.6

ln -s /usr/local/bin/python2.7 /usr/bin/python                     #生成软连接

python -V                                                                                   #确认版本,如果报错就执行一下下面红色的两行

cp /usr/bin/yum /usr/bin/yum.20160104                             #备份程序

sed -i 's/\#\!\/usr\/bin\/python/\#\!\/usr\/bin\/python2.6.6/' /usr/bin/yum        #修改程序头文件,python2.7升级完毕

#如果执行python的时候报错python: error while loading shared  libraries: libpython2.7.so.1.0:  cannot open shared object file: No such file or

#那么下面这两行就执行一下

echo '/usr/local/lib' > /etc/ld.so.conf.d/python2.7.conf 

ldconfig

#选做结束##########################################

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/master.zip

mv master.zip mod_wsgi-4.4.21.zip

unzip mod_wsgi-4.4.21.zip

cd mod_wsgi-master

./configure

make

make install

make clean

make distclean

cp /usr/local/lib/python2.7/site-packages/mod_wsgi-4.4.21-py2.7-linux-x86_64.egg/mod_wsgi/server/mod_wsgi-py27.so /etc/httpd/modules/

#上面这个路径贼长了,自行确认一下吧,版本可能会有差异。

至此,Mod_wsgi安装完毕



3. 配置 apache 和 django 项目

我的目录:

apache:/etc/httpd

django:/Data/HelloWorld    #注意,这里是存放manage.py这个文件的目录


首先,加载Mod_wsgi:LoadModule  wsgi_module modules/mod_wsgi-py27.so


接下来有两种配置方法:

1)  把下面的内容直接贴到httpd.conf最后。

2) 在conf下面新建一个文件,例如HelloWorld.conf,然后再httpd.conf最后一行加上:include conf/HelloWorld.conf


NameVirtualHost *:8000

<VirtualHost *:8000>

    ServerAdmin [email protected]

    DocumentRoot "/Data/HelloWorld"

    ServerName www.HelloWorld.com

    ErrorLog "logs/HelloWorld_django_error.log"

    CustomLog "logs/HelloWorld_django_access.log" common

    WSGIScriptAlias / /Data/HelloWorld/HelloWorld/wsgi.py

</VirtualHost>


WSGIPythonPath /Data/HelloWorld

<Directory "/Data/HelloWorld">

    Options FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>


<Directory "/Data/HelloWorld/HelloWorld">

    <Files wsgi.py>

        Order deny,allow

        Allow from all

    </Files>

</Directory>


其中第2步真的是关键,没有弄好,后面的配置都是白搭。

之前弄不好,是因为我直接用yum install mod_wsgi来安装Mod_wsgi,安装是很顺利,但是引发了无限的问题!

具体原因嘛,主要是因为系统自带python2.6.6,而我升级了python2.7,安装Mod_wsgi是用yum的,而yum只认python2.6.6,而且2.6.6默认是不share的,所以必须重新编译才行。


然后别忘了重启一下apache服务:

service httpd restart

看到下面这个页面我真是好感动:







你可能感兴趣的:(apache,django,mod_wsgi)