phpapachefastcgimod-fastcgi

Difference between FastCgiExternalServer and FastCgiServer in Apache FastCGI PHP?


Just let me state that I am new to FastCGI. I have MAMP's Apache on my OS X machine. Default PHP handler was Apache Handler 2.0 (libphp5.so). I wanted to change to FastCGI and followed the answer here: How to configure Apache to run PHP as FastCGI on Ubuntu 12.04 via terminal?

I added the following at the end of my 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>

However, as you can see, FastCgiExternalServer is commented out. Instead, I had to use FastCgiServer cause otherwise Apache was giving me the following errors when trying to request a page:

[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"

But /Applications/MAMP/fcgi-bin/php5.fcgi exists and its content is:

#!/bin/bash
PHP_CGI=/Applications/MAMP/bin/php/php5.6.2/bin/php-cgi
exec $PHP_CGI

What's the difference between FastCgiServer and FastCgiExternalServer and why FastCgiExternalServer didn't work in my case but FastCgiServer worked?


Solution

  • FastCgiServer is a server that mod_fastcgi will do process management for -- spinning instances up and down and giving them a unix domain socket to listen on. No outside action is required to start the fastcgi server.

    FastCgiExternalServer is a server that mod_fastcgi will NOT do any process management for -- it will just reach out to the unix or TCP socket you tell it to use and forward requests/responses to it. You, or some daemon outside of httpd, must be starting something to listen on the listed socket. The most basic way is the 'fcgistarter' utility, other options are things like php-fpm.