痴心VS绝对 发表于 2018-11-27 07:44:51

在apache2上使用fastcgi部署django应用

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



页: [1]
查看完整版本: 在apache2上使用fastcgi部署django应用