前几天第一次尝试使用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模块时碰到这问题。