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模块源码包:

    #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

 

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

你可能感兴趣的:(apache,centos,fastcgi,selinux,mod_fastcgi)