Many developers encounter this confusing error when their Apache server can't communicate with PHP-FPM. The key symptom is that Apache looks for /usr/lib/cgi-bin/php5-fcgi
but finds nothing there. Here's what's actually happening:
# Error example from logs:
[error] FastCGI: failed to connect to server "/usr/lib/cgi-bin/php5-fcgi"
[error] FastCGI: incomplete headers received
The confusion stems from how FastCGI was historically configured. The php5-fcgi
file was never meant to physically exist - it's a virtual endpoint. The critical part is the socket connection defined in your php-fpm.conf
:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi
-socket /var/run/php5-fpm.sock
-pass-header Authorization
For current systems (PHP 7.4+), a more reliable approach uses ProxyPassMatch
:
SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost"
First check if PHP-FPM is running and listening:
sudo systemctl status php7.4-fpm
sudo ls -l /var/run/php/php7.4-fpm.sock
Then test socket permissions (www-data typically needs access):
sudo chown www-data:www-data /var/run/php/php7.4-fpm.sock
sudo chmod 660 /var/run/php/php7.4-fpm.sock
Here's a complete virtual host configuration that works with PHP 8.2:
ServerName example.com
DocumentRoot /var/www/html
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
- Verify PHP-FPM pool configuration matches socket path
- Check Apache modules are enabled:
proxy_fcgi
,proxy
,rewrite
- Confirm SELinux/apparmor isn't blocking socket access
- Test with a simple
phpinfo()
script
When Apache complains about missing /usr/lib/cgi-bin/php5-fcgi
while using PHP-FPM, it's actually a red herring. The real culprit lies in the FastCGI socket communication between Apache and PHP-FPM. Here's why the error occurs:
# The error suggests missing files, but the actual issue is socket communication
[error] FastCGI: failed to connect to server "/usr/lib/cgi-bin/php5-fcgi"
[error] FastCGI: incomplete headers received
Let's analyze the current setup in /etc/apache2/conf.d/php-fpm.conf
:
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>
For Ubuntu systems with PHP-FPM, we should use mod_proxy_fcgi
instead of the deprecated mod_fastcgi
:
# First, enable required modules
sudo a2enmod proxy_fcgi
sudo a2enmod actions
# Then update your configuration
<FilesMatch "\.php$">
SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
After making changes, verify these critical points:
# Check if PHP-FPM is running
sudo systemctl status php7.4-fpm
# Verify socket file exists
ls -la /var/run/php/php7.4-fpm.sock
# Confirm Apache can access the socket
sudo -u www-data ls -la /var/run/php/php7.4-fpm.sock
If problems persist, check these common pitfalls:
# 1. Socket permissions
sudo chmod 666 /var/run/php/php7.4-fpm.sock
# 2. Configuration mismatch between PHP-FPM and Apache
# In /etc/php/7.4/fpm/pool.d/www.conf:
listen = /var/run/php/php7.4-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
If you must use mod_fastcgi, ensure proper socket configuration:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 300 -pass-header Authorization
# Create the directory structure (even though it's not actually used)
sudo mkdir -p /usr/lib/cgi-bin/
sudo touch /usr/lib/cgi-bin/php5-fcgi
sudo chown www-data:www-data /usr/lib/cgi-bin/php5-fcgi