当前位置: 首页 > 工具软件 > mod_fcgid > 使用案例 >

配置mod_fcgid加php cig方法及问题

王俊楚
2023-12-01

采用ubuntu16.04+apache2.4+mod_fastcgi模块+php-cgi 运行php, 按如下配置,结果html可正常访问,php文件则直接显示原代码,或显示空白

问题现象如下:

1. `info.php`文件在`/var/www/tp5/public/`目录下,访问`info.php`时,显示空白
2. `phpmyadmin`是个软链接,在`/var/www/tp5/public/`目录下,访问时,直接显示主页的原代码
3. `test.html`是个静态文件,访问时,可正常访问
  • apache2开启了mod_fcgidactions模块,关闭了php_mod模块
  • fcgid默认没改动过模块的全局配置如下 /etc/apache2/mod-enalbed/fcgid.conf
<IfModule mod_fcgid.c>
  FcgidConnectTimeout 20

  <IfModule mod_mime.c>
    AddHandler fcgid-script .fcgi
  </IfModule>
</IfModule>
  • 站点虚拟主机的配置如下 /etc/apache2/site-enabled/default.conf
### 注意,以下去掉注释为正确配置
<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/tp5/public
	DirectoryIndex index.php index.html
 	KeepAlive off
        #FcgidWrapper /usr/lib/cgi-bin/php7.0  //这是指定php-cgi解析器的,没这个将服务器将返回500
	<Directory "/var/www/tp5/public/">
		Options +FollowSymLinks
		#Options +ExecCGI               //没这个选项,将返回403,被禁止
		#AddHandler fcgid-script .php  //没这个句,或着fcgid-script写错,页面无法显示任何东西
		AllowOverride All
		Require all Granted
	</Directory>
	ErrorLog ${APACHE_LOG_DIR}/error_ctc.log
	CustomLog ${APACHE_LOG_DIR}/access_ctc.log combined
</VirtualHost>

以下内容为坑

1.刚开始把AddHandler fcgid-script .php 写成以 AddHandler fcgi-script .php 导致只能访问html,php无法访问,页面显示为空

2.当加上了 FcgidWrapper /usr/lib/cgi-bin/php7.0 时,html可正常访问,php文件访问:返回500

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at webmaster@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

这个500问题如何解决呢,看下面

FcgidWrapper /usr/lib/cgi-bin/php7.0 这个坑很大

  1. 这个里是指定fcgid的解析器,网上找了很久,都没找到这个解析器在本地的哪里。以为直接用/usr/bin/php即可,用$ apache2ctl -t测试配置文档是没问题的,然而返回的是500,报错更上成的是一样的,就好像没设置一样。

  2. 最后找了很,在这里mod_fcgid官网fcgid的一个配置 发现FcgidWrapper是怎么用的。于是猜想,是不是需要安装一个叫php-cgi 的东西呢? 于是式了一下 apt-get install php-cgi 真的有。安装后/usr/bin/php-cgi/usr/lib/cgi-bin/php7.0都有可以用。松了一大口气

  3. 当时问题又来,查看了下phpinfo();发现php.ini没加载,如下;

Configuration File (php.ini) Path 	/etc/php/7.0/cgi
Loaded Configuration File 	        (none) 

心里,只要把php.ini放在 /etc/php/7.0/cgi下就可以。打开该目录,里面是空的,奇怪。于是把php.ini 放到这里,结果又是显示上面的500错误。

猜想,是不是安装php-cgi时那些报错引起的?果然去另一台机安装时,发现里面真的有东西。(后来修复了php-cgi安装报错的问题,有了php.ini 发现还是一样报错,找到原因了,关闭beast.so扩展后,可正常访问,这个坑大了)

4.phpmyadmin是站点内的软链接,访问时,主页的php原代码直接显示又是什么问题呢?根据上面的经验猜想,原来phpmyadmin在mod_php模式下可正常访问。现在不可以访问说明路径是没问题,但是无法解析。于是猜想phpmyadmin的配置文件设置问题。

  1. 找到phpmyadmin的配置文件/etc/apahce2/conf-avaiable/phpmyadmin 要是没有则把/etc/phpmyadmin/apache2.conf 拷贝过去
  2. 打开配置文件,加了AddHandler fcgid-script .php 重启apache2后,访问页面发现变成403了
  3. 继续添加Options +ExecCGI 重启后,终于可正确解析php(但是我的报错了,说缺少模块,但是显然是执行了php,原因是我的php.ini配置问题,后来重新正确安装了php-cgi,把php.ini配置正常,就可正确显示了)

5.以为到此结束了,随知道只有主页下的普通 info.php文件可以正常,/app/module/meth 通过路由规则的方式,访问url则无法访问,这个与mod_fcgid加php-fpm的方案好像是一样的问题。

这个应该是路由重写的问题,使用index.php/app/module/meth 则可正常路由。因此需要解决路由的问题。暂进没解,原来在php_mod模式下可正常重写路由,而在php_fcgid中路由重写出问题了。

小结:实现ubuntu+apache2+fastcgi的组件

sudo apt-get install libapache2-mod-fcgid
sudo apt-get install php-cgi

sudo a2dismod php7.0
sudo a2enmod fcgid actions

关键配置

# 以下两条指令可放在公共conf下,如fcgid.conf中
FcgidWrapper /usr/lib/cgi-bin/php7.0  //这是指定php-cgi解析器的,没这个将服务器将返回500
AddHandler fcgid-script .php  //没这个句,或着fcgid-script写错,页面无法显示任何东西 或显示原代码

# 以下指令必须放在指定目录下
#Options +ExecCGI               //没这个选项,将返回403,被禁止,这表必须放在虚拟目录下

成功配置完成后的phpinfo()信息 中的 Server API 显示 CGI/FastCGI

  • php-cgi模式下的 php 的beast.so模块 不可用,在php.ini中设置该扩展后,服务器报错500。
  • mod_fcgid模式下没有FastCgiExternalServer指令,模式意味着php-cgi只能是在本地运行哦
  • mod_fcgid模式下 没有找到与php-fpm相结合使用的资料(或许有,当找到 直接使用 FcgidWrapper 指向本地的php-fpm是报错的),但是mod_fastcgi貌似可以同时适配php-cgi(只调通过mod_fcgid+php-cgi)及php-fpm(已调通过)
 类似资料: