pzg's blog

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环境下验证

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注