本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7594130
建立时间:2006年5月29日




[网站架构]Debian下为Apache2配置FastCGI(mod-fcgid),PHP5,Perl,Python,ROR
软件技术

lhwork 发表于 2007/1/15 16:29:44

本文主要介绍在Debian/Etch版本下将Apache对PHP/Perl/Python/Ruby On Rails的支持,由单独的apache模块统一改为FastCGI支持,对全新安装Apache也可作参考注意:如果升级到Apache2.2,注意apache2.2与2.0的一些区别,尤其是授权认证部分,分成了几个module,所以可能需要自己enable,如果您直接装apache2.2,无须担心.mod_imap 被更名为 mod_imagemapmod_auth 被拆分为 mod_auth_basic、mod_authn_file、mod_authz_user、mod_authz_groupfilemod_access 被更名为 mod_authz_hostmod_auth_ldap 被更名为 mod_authnz_ldap FastCGI的好处1)可以支持在一个系统上支持同一种脚本不同版本的解释器,如PHP4, PHP52)只要安装一个apache 的module后,就可同时支持PHP, Python, Perl等,没有必要为它们安装各自的module3)获得更好的权限控制,比PHP运行在安全模式更安全,国外大的虚拟主机供应商如DreamHost,BlueHost, Godaddy等都是采用mod-fcgid或者mod_fastcgi来实现对PHP的支持0.这里用的mod-fcgid,符合GPL条款的,而不是那个mod_fastcgi(它在debian的non-free) 并且mod-fcgid与apache2配合得更好1.如果你用fastCGI 来统一支持这些脚本的话,先将libapache2-mod-php5,libapache2-mod-perl2,libapache2-mod-python2.4等模块去掉,当然你也可以按照你的需要保留部分模块apt-get remove libapache2-mod-php5 libapache2-mod-perl2 libapache2-mod-python2.4 2.安装mod-fcgidapt-get install libapach2-mod-fcgid3.检查PHP是否支持FastCGI一般而言,如果你以前安装了mod_php,那么php5-cgi应该已经装上了ls /usr/bin/php5-cgi 或者/usr/bin/phpt-cgi -v相信会有(cgi-fcgi) 的字样如果没有装上,则先装上php5-cgiapt-get install php5-cgi 4.检查fcgid的配置/etc/apache2/mods-enabled/fcgid.conf (这是个到mods-availabe目录的符号连接)应该有一个标准配置<IfModule mod_fcgid.c>  AddHandler fcgid-script .fcgi  SocketPath /var/lib/apache2/fcgid/sock  IPCConnectTimeout 20</IfModule> 宜将/etc/apache2/mods-enabled/fcgid.conf改为 <IfModule mod_fcgid.c>  AddHandler fcgid-script .php .py .pl .fcgi  SocketPath /var/lib/apache2/fcgid/sock  IPCConnectTimeout 20</IfModule> 以增加对php py pl等扩展名的支持当然还可以添加其他配置指令(当然这些不是必要的,默认的配置基本上就可以了)来修改默认的一些配置,如IdleTimeout 600ProcessLifeTime 3600MaxProcessCount 8DefaultMinClassProcessCount 3DefaultMaxClassProcessCount 3IPCConnectTimeout 8IPCCommTimeout 48 具体的配置指令在后面列出5.检查模块的载入/etc/apache2/mods-enabled/fcgid.load应该有LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so6.修改Apache的主机配置,增加对PHP的支持/etc/apache2/sites-enabled/000-default中添加一句FCGIWrapper /usr/bin/php5-cgi .php以增加对php的支持变成类似于<Directory /var/www/>        FCGIWrapper /usr/bin/php5-cgi .php        Options ExecCGI SymLinksIfOwnerMatch</Directory> 当然,如果你没有 移除 mod_php的话,就是说你还想用默认的(标准的)的PHP支持,FCGIWrapper就没有必要加上了。但如果你使用FCGI的话,注意Option ExeCGI必须添加上,否则给出403错误,报告没有权限访问 .php等文件你还可同时增加 对PHP4 PHP5的支持(你必须Php4,php5都装上)FCGIWrapper /usr/bin/php4-cgi .php4 .phpFCGIWrapper /usr/bin/php5-cgi .php57.增加对Python的支持 在000-default里或者其他虚拟主机配置文件的段里加上ScriptAlias /python /var/www/python/index.py这样,访问  你的主机 http://localhost/python就会 将请求转给 /var/www/python/index.py注意,你的 index.py必要引用 python的fastcgi接口,建议你使用这个(Trac系统也是使用这个fastcgi接口)fcgi.py这里给出我的index.py作为参考#!/usr/bin/pythontry:    from fcgi import WSGIServer    def myapp(environ, start_response):        start_response('200 OK', [('Content-Type', 'text/plain')])        return ['Hello World!\n']    WSGIServer(myapp).run()except Exception, e:    print 'Content-Type: text/plain\r\n\r\n',    print 'Oops...'    print    print 'Trac detected an internal error:'    print    print e    print    (注意,必须将fcgi.py放到index.py同一目录,否则import找不到模块)如果上面的index.py能正常 打印 Hello World!就说明基本上配置好了注意,1)fcgi.py必须放到 index.py可以找到的地方,比如index.py同一目录下 或者 site-package 目录2)index.py必须有可执行的属性,否则 会 抛出 内部服务器错误(Internal Server Error)如果你需要配置某个目录下.py都可执行,可用这段配置文件        ScriptAlias /python/ /home/gavin/py/        <Directory "/home/gavin/py">                DirectoryIndex index.html index.py index.pl index.php                AllowOverride None                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch                Order allow,deny                Allow from all        </Directory>这样,/python/下的任何一个.py文件都会执行,比如,将下面这段代码保存为hello.py#!/usr/bin/pythonfrom fcgi import WSGIServerdef myapp(environ, start_response):    start_response('200 OK', [('Content-Type', 'text/plain')])    return ['upsdn.net:Hello World!\n']WSGIServer(myapp).run()放到 /home/gavin/py/目录访问/python/hello.py就可看到hello world8.配置Ruby On Rails主要就是利用rewrite将请求分发给rails脚本RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ dispatch.fcgi [QSA,L] 其他与标准FastCGI配置类似 下面这个是Typo的一个示范配置<VirtualHost *:80>ServerName foo.example.com<Location /journal> RewriteEngine On # Let apache handle purely static files like images by itself. RewriteCond %{REQUEST_FILENAME} !-f # Send Everything else to Typo RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] </Location><Directory /sites/foo.example.com/public_html/journal> # ExecCGI is required for mod_fcgid to work. Options Indexes FollowSymLinks ExecCGI # Disable .htaccess files. AllowOverride None Order allow,deny Allow from all # This tells mod_fcgid to run the dispatch.fcgi script as a FastCGI # AddHandler fcgid-script .fcgi</Directory>当然你也可以安装通用的fastcgi ruby库ap-get install libfcgi-ruby或者你需要设置DefaultInitEnv RAILS_ENV production更详细的东西请参考ROR相关文章9.配置perl  首先安装perl的FastCGI模块,Debian当然用apt-get来安装了apt-get install libfcgi-perl(将安装FCGI.pm,    CGI::Fast 依赖于这个模块)你也可利用CPAN来安装# perl -MCPAN -e shell 直接回车,都用默认配置就行了 cpan install FCGIcpan install CGI::Fastcpan quit 安装后验证一下这个hello.pl脚本(用FCGI模块, 只需要FCGI.pm即可)#!/usr/bin/perluse FCGI;my $request = FCGI::Request();while($request->Accept() >= 0){ print "Content-type: text/html\n\n"; print "<H1><b>Hello World!</b></H1>";}exit 0;或者试一下这个counter.cgi,   用CGI:Fast模块(需要FCGI.pm和CGI.pm) #!/usr/bin/perl -wuse strict;use CGI::Fast qw(:standard);my $counter = 0;my $title = "Fast CGI counter";while (new CGI::Fast) { print header; print start_html $title; print h1 $title; print "Invocation number: ", b($counter++), ", PID: ", b($$), ".", hr; print end_html;} 10.好了,现在你的系统应该配置好了mod_fcgid了,并且支持Perl,PHP,Python,Ruby on Rails提示:发现500 内部服务器错误时,先检查脚本权限,然后在CLI环境运行是否正常,最后再在CGI环境下验证


阅读全文(3007) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.297 second(s), page refreshed 144757982 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号