Apache FastCGI PHP中FastCgiExternalServer和FastCgiServer之间的区别是什么?

10
请允许我声明,我对FastCGI不熟悉。我的OS X机器上有MAMP的Apache。默认的PHP处理程序是Apache Handler 2.0(libphp5.so)。我想改成FastCGI,并按照这里的答案进行操作:如何通过终端配置Apache在Ubuntu 12.04上运行PHP作为FastCGI? 我在httpd.conf的末尾添加了以下内容:
<IfModule mod_fastcgi.c>
   AddHandler php5.fcgi .php
   Action php5.fcgi /php5.fcgi
   Alias /php5.fcgi /Applications/MAMP/fcgi-bin/php5.fcgi
   FastCgiServer /Applications/MAMP/fcgi-bin/php5.fcgi -socket /Applications/MAMP/tmp/php-fcgi/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
   #FastCgiExternalServer /Applications/MAMP/fcgi-bin/php5.fcgi -socket /Applications/MAMP/tmp/php-fcgi/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
   <Directory /Applications/MAMP/fcgi-bin>
       Order allow,deny
         Allow from all
   </Directory> 
</IfModule>

然而,正如您所见,FastCgiExternalServer已被注释掉。相反,我不得不使用FastCgiServer ,否则Apache在尝试请求页面时会给出以下错误信息:

[Fri May 06 23:25:22 2016] [error] [client ::1] (2) No such file or directory: FastCGI: failed to connect to server "/Applications/MAMP/fcgi-bin/php5.fcgi": connect() failed

[Fri May 06 23:25:22 2016] [error] [client ::1] FastCGI: incomplete headers (0 bytes) received from server "/Applications/MAMP/fcgi-bin/php5.fcgi"


但是/Applications/MAMP/fcgi-bin/php5.fcgi存在,并且其内容是:
#!/bin/bash
PHP_CGI=/Applications/MAMP/bin/php/php5.6.2/bin/php-cgi
exec $PHP_CGI

FastCgiServerFastCgiExternalServer有什么区别?为什么FastCgiExternalServer在我的情况下无法工作,但是FastCgiServer可以工作?


1
如果你在2016年使用PHP fastcgi,请考虑使用mod_proxy_fcgi和php-fpm代替mod_fastcgi。 - covener
2个回答

15

FastCgiServer是一个服务器,mod_fastcgi将为其进行进程管理--启动和关闭实例,并为它们提供一个Unix域套接字来侦听。不需要任何外部操作即可启动FastCGI服务器。

FastCgiExternalServer是一个服务器,mod_fastcgi不会对其进行任何进程管理--它只会连接到您告诉它使用的Unix或TCP套接字,并将请求/响应转发给它。您或httpd外部的某个守护程序必须启动监听列出的套接字。最基本的方法是'fcgistarter'实用程序,其他选项包括php-fpm等。


1

为了获得更好的性能,建议使用nginx而不是apache(请查看谷歌:nginx apache性能)。 - Kamil Kiełczewski
@KamilKiełczewski 假设 Nginx 的性能优势并不是普遍准确的。对于静态内容,是的,但对于动态内容,则大致相等。从谷歌搜索中可以看到一个例子页面:http://www.hostingadvice.com/how-to/nginx-vs-apache/ - jeffmcneill
@jeffmcneill 但是未来的Web方向是静态客户端(例如基于Angular2构建),用于生成动态页面内容(客户端是纯JS+HTML+CSS文件,所有动态内容在加载这些静态文件并运行JS后在浏览器端开始),并且该客户端仅通过RESTful请求(JSON,AJAX)与后端通信-因此静态性能非常重要:)因此,在MVC模型中,M位于后端,而VC位于前端:) - Kamil Kiełczewski
@KamilKiełczewski 是的,静态内容很重要,我并没有说不重要,在这方面Nginx有优势,但是动态部分Nginx并不提供更好的性能。各个部分的顺序并不重要。如果一个应用需要客户端承担所有动态内容,那么就需要将所有东西都发送给客户端,而这可能会对一些/大多数配置产生负面影响,并不适用于除最简单应用之外的其他应用。 - jeffmcneill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接