转帖请注明出处!!!
说明:
最近因为一些原因需要配置FastCGI环境,网上资料一堆,但是没有哪个能完全搞定我的需求,几经折腾,终于配置好,下面作个总结,免得日后忘记。
环境:
CentOS5.3(32bit)
Apache 2.2.3
php5.1.6
selinux状态:Enforcing
配置步骤:
1. 使用yum安装好Apache、PHP等,并做好基本配置;
2. 安装编译mod_fastcgi模块需要的包:
#yum install httpd-devel apr apr-devel libtool
3. 从FastCGI官方网站下载mod_fastcgi模块源码包:
#wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
4. 解压上述压缩包,并执行编译、安装:
#tar zxvf mod_fastcgi-2.4.6.tar.gz
#cd mod_fastcgi-2.4.6
(下面依据解压出的目录中的README文件的说明进行编译安装)
#cp Makefile.AP2 Makefile
#vim Makefile
通过vim修改Makefile中的宏top_dir为httpd安装路径/usr/lib/httpd,保存,退出,接着执行下述命令
#make
#make install
5. 配置Apache支持mod_fastcgi模块:
#cd /var/www/
#mkdir fcgi-bin
#chcon -R -t httpd_sys_script_exec_t /var/www/fcgi-bin
#cd /etc/httpd/conf.d/
#vim fastcgi.conf
通过vim新建一个配置文件,编辑并保存如下内容
########################## # FastCGI configuration. # # fastcgi.conf # ########################## LoadModule fastcgi_module modules/mod_fastcgi.so ScriptAlias /fcgi-bin/ "/var/www/fcgi-bin" <Directory "/var/www/fcgi-bin"> AllowOverride None Options +ExecCGI -Includes AddHandler fastcgi-script .fcg .fcgi Order allow,deny Allow from all </Directory> FastCgiIpcDir "/tmp/fcgi-ipc"
6. 重启httpd服务:
#/etc/init.d/httpd restart
7. 查看是否成功:
#vim /var/log/httpd/error_log
如果看到类似mod_fastcgi配置成功之类的话,就OK了
此处可能看到错误(“问题及解决”部分再阐述):
[error]FastCGI: access for server (uid -1, gid -1) failed: read not allowed
[error]FastCGI: can't create dynamic directory "/tmp/fcgi-ipc/dynamic": access for server (uid -1, gid -1) failed: read not allowed
是说使用uid为-1的用户去读取/tmp/fcgi-ipc/dynamic失败,因为该目录权限为
drwx------ root root fcgi-ipc
但是httpd依然能正常启动
8. 从FastCGI官方网站下载FastCGI开发库:
#wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
9. 解压、编译、安装开发库:
#tar zxvf fcgi-2.4.0.tar.gz
#cd fcgi-2.4.0
(下面依据解压出的目录中的README文件的说明进行编译安装)
#./configure
#make
#make install
安装完成后,需要编辑/etc/ld.so.conf,添加/usr/local/lib,
执行:ldconfig (动态链接库的管理命令)
10. 运行例子程序来测试一下:
#cd fcgi-2.4.0
#gcc -o echo.fcgi echo.c -I/usr/local/lib -lfcgi
#cp ./echo.fcgi /var/www/fcgi-bin/
打开浏览器,在地址栏输入 http://localhost/fcgi-bin/echo.fcgi看看能否正常显示echo.fcgi程序执行的结果
问题及解决:
1. 启动httpd可能遇到的失败情况:
access for server (uid -1, gid -1) failed: read not allowed
原因很明显,因为自动建立的/tmp/fcgi-ipc/dynamic权限为
drwx------ root root fcgi-ipc
但是从错误提示来看,Apache在启动过程中的某阶段会尝试使用uid=-1的用户去访问这个目录,所以会失败,
这个目录主要用于放置FastCGI模块和Apache服务器通信用的socket,为什么不直接使用root或者apache用户去访问这个目录呢?
也许是配置的问题,现在还不十分清楚。
解决方案:
只需要临时更新该目录的权限即可
#chmod -R o+rwx /tmp/fcgi-ipc
为了方便后续以apache账户访问该目录正常,现一并把该目录拥有者改为apache
#chown -R apache:apache /tmp/fcgi-ipc
改为后,重启httpd
#/etc/init.d/httpd restart
打开浏览器,在地址栏输入 http://localhost/fcgi-bin/echo.fcgi看看能否正常显示echo.fcgi程序执行的结果
可以看到socket文件创建成功了,但是还是无法显示正常结果呢(后面说明)
安全起见,现在,可以把临时改变的目录权限改回来
#chmod -R o-rwx /tmp/fcgi-ipc
2. 为什么还不能显示呢?通过观察/var/log/httpd/error_log,我们可能发现类似如下错误:
(13)Permission denied: FastCGI: can't create (dynamic) server "/var/www/fcgi-bin/echo.fcgi": bind() failed [/tmp/fcgi-ipc/dynamic/......]
(13)Permission denied: FastCGI: failed to connect to server "/var/www/fcgi-bin/echo.fcgi": connect() failed......
权限既然已经没问题了,那就要考虑是不是seLinux引起的,通过观察/var/log/message,我们可以看到确实是seLinux的拦截导致的失败,但是
参考/var/log/message里面的建议不一定能搞定。
解决方案:
求助audit2why和audit2allow,命令如下
#audit2why < /var/log/audit/audit.log
我们会看到很多错误,根据提示使用avc作为audit2allow输入,来添加允许访问的规则,操作如下
#grep '88cf197ab......' /var/log/audit/audit.log | audit2allow -M myhttpdrule
其中那段'88cf197ab......'是指socket文件名称,下面按提示执行
#semodule -i myhttpdrule.pp
至此,终于能访问了。。。