linux apache fastcgi,SeLinux+CentOS+Apache+mod_fastcgi配置FastCGI环境

转帖请注明出处!!!

说明:

最近因为一些原因需要配置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模块源码包:

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"

AllowOverride None

Options +ExecCGI -Includes

AddHandler fastcgi-script .fcg .fcgi

Order allow,deny

Allow from all

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开发库:

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

至此,终于能访问了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值