天天看点

Apache2配置FastCGI(mod-fcgid)

Debian下为Apache2配置FastCGI(mod-fcgid),PHP5,Perl,Python,ROR

本文主要介绍在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_imagemap

mod_auth 被拆分为 mod_auth_basic、mod_authn_file、mod_authz_user、mod_authz_groupfile

mod_access 被更名为 mod_authz_host

mod_auth_ldap 被更名为 mod_authnz_ldap

FastCGI的好处

1)可以支持在一个系统上支持同一种脚本不同版本的解释器,如PHP4, PHP5

2)只要安装一个apache 的module后,就可同时支持PHP, Python, Perl等,没有必要为它们安装各自的module

3)获得更好的权限控制,比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-fcgid

apt-get install libapach2-mod-fcgid

3.检查PHP是否支持FastCGI

一般而言,如果你以前安装了mod_php,那么php5-cgi应该已经装上了

ls /usr/bin/php5-cgi

或者

/usr/bin/phpt-cgi -v

相信会有

(cgi-fcgi)

的字样

如果没有装上,则先装上php5-cgi

apt-get install php5-cgi4.检查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 600

ProcessLifeTime 3600

MaxProcessCount 8

DefaultMinClassProcessCount 3

DefaultMaxClassProcessCount 3

IPCConnectTimeout 8

IPCCommTimeout 48

 具体的配置指令在后面列出

5.检查模块的载入

/etc/apache2/mods-enabled/fcgid.load

应该有

LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so

6.修改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 .php

FCGIWrapper /usr/bin/php5-cgi .php5

7.增加对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/python

from fcgi import WSGIServer

def 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 world

8.配置Ruby On Rails

主要就是利用rewrite将请求分发给rails脚本

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ 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环境下验证

继续阅读