Pages

Saturday, 24 November 2012

apache2下,部署django应用


环境:win server 2003

版本:apache2.2, django1.3, python2.7, mod_wsgi.so

首先 安装apache2.2, python2.7, django1.3

然后下载 mod_wsgi.so (网上很多文章都是mod_python,但只支持到python2.5,现在停止更新了,所以我直接就用mod_wsgi)

把mod_wsgi.so拷贝到 apache目录下的 modules 下。(
运行apt-get install libapache2-mod-wsgi -y就直接搞定了mod_wsgi.so)
打开 httpd.conf文件:
更改Apache的httpd.conf(C:\Program Files\Apache Software Foundation\Apache2.2\conf目录下)配置文件:

  (1)在配置文件中LoadModule的那一段,添加一行如下:

    LoadModule wsgi_module modules/mod_wsgi.so

  (2)然后再添加一行如下:

    WSGIScriptAlias / "D:/WorkSpace/DjangoProject/FirstProject/django.wsgi"

#在apache服务器拥有多个虚拟机的情况下,可以将这句放到虚拟机<VirtualHost ></VirtualHost>里

  注意上面的目录D:/WorkSpace/DjangoProject/FirstProject,这个就是您的工程的目录,需要根据的实际情况做修改,WSGIScriptAlias 有两个参数:(1)斜杠 / 表示访问路径为 “ / ” ,如:http://127.0.0.1:8080/,即根路径。

后面的django.wsgi这个文件是需要新建的,一般和项目放在一起,后面我再来说这个如何新建这个文件。

  (3)找到Directory的配置区域,添加如下的一段配置

    <Directory "D:/WorkSpace/DjangoProject/FirstProject">
      Order Deny,Allow
      Allow from all
    </Directory>

  注意,上面的目录,这个同上面的一样,是您的工程的目录,根据您的实际情况做修改。

新建一个wsgi文件:

    在工程的目录下新建一个django.wsgi,用记事本打开,输入以下的内容并保存: 

      import os
      import sys

      import django.core.handlers.wsgi

      sys.path.append(r'D:/WorkSpace/DjangoProject')
      os.environ['DJANGO_SETTINGS_MODULE'] = 'FirstProject.settings'
      application = django.core.handlers.wsgi.WSGIHandler()

    解释一下第4、5两行:

    第四行中的 D:/WorkSpace/DjangoProject 是您的工程目录D:/WorkSpace/DjangoProject/FirstProject 的上一层目录。根据您工程的目录情况做修改。

    第五行 os.environ['DJANGO_SETTINGS_MODULE'] = 'FirstProject.settings' ,这个FirstProject.settings就是指您的工程目录下的setting文件,根据您的工程目录名称的不同需要做修改。

    最后,这个django.wsgi文件名可以随便取,例如test.wsgi、app.wsgi等等,但是一定要与(2) 中的那行配置保持一致。如果您这里新建的文件名不是django.wsgi而是test.wsgi,那么(2) 中的那行配置就应该修改为:WSGIScriptAlias / "D:/WorkSpace/DjangoProject/FirstProject/django.wsgi"。

修改项目的setting.py文件:

  找到您工程目录下的setting.py,对于我这里就是D:\WorkSpace\DjangoProject\FirstProject\setting.py。

  修改为如下:
MEDIA_ROOT = 'D:/WorkSpace/DjangoProject/FirstProject'
STATIC_ROOT = 'D:/WorkSpace/DjangoProject/FirstProject'
TEMPLATE_DIRS =
(
"D:/WorkSpace/DjangoProject/FirstProject/templates",

)

还有一处需要注意,就是ROOT_URLCONF这个设置,urls前面得名称需要跟你发布的目录名称一致。比如我这个就是FirstProject.ROOT_URLCONF = 'FirstProject.urls'

注意:

可能出现的问题:ViewDoesNotExist

这个原因在django.wsgi文件内有说明,
sys.path.append(r'D:/WorkSpace/DjangoProject'),缺少一个路径,就是项目本身的路径。应该加上
sys.path.append(r'D:/WorkSpace/DjangoProject/FirstProject')

ok了!
更改Apache的httpd.conf(C:\Program Files\Apache Software Foundation\Apache2.2\conf目录下)配置文件:MEDIA_ROOT = 'D:/WorkSpace/DjangoProject/FirstProject'STATIC_ROOT = 'D:/WorkSpace/DjangoProject/FirstProject'TEMPLATE_DIRS =
(
"D:/WorkSpace/DjangoProject/FirstProject/templates",sys.path.append(r'D:/WorkSpace/DjangoProject'),缺少一个路径,就是项目本身的路径。应该加上sys.path.append(r'D:/WorkSpace/DjangoProject/FirstProject')

ok了!

 参考:http://www.cnblogs.com/zhengyun_ustc/archive/2009/08/11/wsgi.html
http://zhengyun-ustc.blog.sohu.com/129330000.html
http://hi.baidu.com/xiazhujie/item/7f4c959b241af2d57a7f015f
http://briteming.blogspot.co.uk/2012/02/centos5-vpspythonmodwsgidjango.html
官方文档: https://code.djangoproject.com/wiki/django_apache_and_mod_wsgi
--------------------------------------------------------------
在apache2上,使用fastcgi部署django应用

前几天第一次尝试使用fastcgi模块,在apache服务器上部署django应用。由于需要在网上一台只开放了sftp功能的linux服务器上安装,没有ssh,而且对方还不熟悉fastcgi和python,做起来有点麻烦。
google 了解了大概的操作步骤,并在自己的虚拟机上试着装(ubuntu系统),使用apt安装apache2、fastcgi模块,都很方便。修改apache 配置,不同的linux系统apache配置文件存放的位置还不一样,不过配置内容还是一样的。在系统配置文件里面,我觉得只需要 将<VirtualHost>里面对应目录的“AllowOverride”改成All就好,这样,其它的配置可以通过目录里面 “.htaccess”文件来设置。
最终配置好的根目录“.htaccess”文件内容:
AddHandler fastcgi-. .fcgi
SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs
Options +ExecCGI
RewriteEngine .
RewriteBase /
#hello
RewriteRule ^(hello/.*)$ - [QSA,L]
#fckeditor
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(static/fckeditor/editor/filemanager/connectors/.*)$ fcgifck.fcgi/$1 [QSA,L]
#static file setting
RewriteRule ^(static/.*)$ - [L]
#adm_media file setting
RewriteRule ^(adm_media/.*)$ - [L]
#root
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ fcgirun.fcgi/$1 [QSA,L]
内容解释(不熟悉apache配置,下面的内容都是了解到的或者猜的):
  1. AddHandler行,标示本目录中后缀为.fcgi的文件是fastcgi脚本
  2. setEnv行,设置python的egg临时目录
  3. Options +ExecCGI,允许本目录执行CGI
  4. RewriteEngine .,打开Rewrite
  5. RewriteRule ^(hello/.*)$ - [QSA,L],/hello/浪点服务器上下过来的测试程序,hello目录里面也有“.htaccess”文件,用来设置hello程序的。这个RewriteRule前不需要RewriteCond。
  6. fckeditor,我这个应用里面用到fckeditor编辑器,还好fckeditor自己带有python的wsgi服务端程序,可以拿来直接使用,那两行设置就是针对这个的。
  7. 静态文件目录和django管理模块相关的静态文件目录设置
  8. fcgirun.fcgi,具体fastcgi脚本。
fcgirun.fcgi,是python脚本,apache中的fastcgi模块会在请求时自动启动该脚本。django里面用到flup包来结合fastcgi。具体信息google。
由于在apache服务器上权限有限,部署也花了很多时间,现在总结一些经验:
  1. 更 新问题:我试过更新了应用和修改更新了fcgirun.fcgi,但大半天了网站内容还没变。解决办法:更新时,将fcgirun.fcgi改名, 如:fcgirun1.fcgi,还需要修改.htaccess文件里的对应文件名。这样更新后,网站内容一定会马上更新。
  2. 部 署时,碰到问题的解决办法:如果在django初始化时出了错误,那么网页上只会提示500内部错误,很难判断具体错误信息是什么?这个就是为什么花了我 很多时间的原因。解决办法:使用python logging模块,将错误信息log到可访问的目录里面(sftp登陆的用户建立的目录,默认情况下apache cgi脚本是不允许写的,需要改权限设置)。将怀疑会在导入时出错的模块,尝试在fcgirun.fcgi中导入。
  3. python egg问题:使用easy_install安装包很方便,不过有时会将包以压缩方式安装,这时,导入该包,如果有.pyd模块在压缩文件里面,就需要解压 到目录里,默认的目录fastcgi模块是不允许访问的,这时,就需要设置:os.environ['PYTHON_EGG_CACHE'] = '/tmp/trac-eggs',将这代码写在fcgirun.fcgi里面就好,“.htaccess”文件中的“SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs ”好像不起作用。我就在导入MySQLdb模块时碰到这问题。