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环境下验证
发表回复