В моей конфигурации Apache есть следующее, чтобы заставить PHP-FPM работать:
FastCgiExternalServer /srv/www/fast-cgi-fake-handler -host 127.0.0.1:9000
AddHandler php-fastcgi .php
AddType text/html .php
Action php-fastcgi /var/www/cgi-bin
Alias /var/www/cgi-bin /srv/www/fast-cgi-fake-handler
DirectoryIndex index.php
Это отлично работает, за исключением того, что SCRIPT_NAME всегда /var/www/cgi-bin
а некоторые сценарии используют SCRIPT_NAME для определения местоположения текущего сценария (vBulletin).
У Google есть множество решений для Nginx, но ни слова для Apache.
Если вы используете RewriteRule вместо метода «Action», все будет хорошо.
Ниже приведен пример, который я использовал в Apache для подключения к внешнему процессу демона fastcgi FCGI :: Daemon. Этот демон можно рассматривать как perl-версию php-fpm.
<VirtualHost 127.0.0.1:80>
ServerAdmin info@example.com
DocumentRoot "/var/www/example"
ServerName www.example.com
<IfModule mod_fastcgi.c>
FastCGIExternalServer /var/www/fcgi-daemon/perl.fcgi -socket /var/run/fcgi-daemon.sock
ScriptAlias /perl.fcgi /var/www/fcgi-daemon/perl.fcgi
</IfModule>
</VirtualHost>
<Directory /var/www/example/cgi-bin>
Options ExecCGI
RewriteRule ^(.*)$ /perl.fcgi [L]
</Directory>
Примечание: "/ var / www / fcgi-daemon /" должен существовать! как пустой каталог. Фактически метод, который вы использовали для php, не работает из коробки для демона perl. SCRIPT_FILENAME всегда был /var/www/fcgi-daemon/perl.fcgi, который никогда не существовал, что приводило к ошибке. Использование RewriteRule сохраняет все необходимые переменные среды на месте и передает их демону perl fastcgi.
Я обнаружил, что при установке FastCgiExternalServer
в существующий каталог (вероятно, работает и для файла), например /srv/www
тогда все переменные PHP были установлены правильно. Однако весь контент, не относящийся к PHP, будет служить либо text/html
или text/plain
что не очень хорошо. Также DirectoryIndex
перестало иметь эффект, напоминающий мне этот вопрос на StackOverflow но я ничего не мог поделать с его решением жонглирования абсолютными и относительными путями.
Единственный релевантный результат Google для PHP-FPM, Apache и SCRIPT_NAME: комментарий кого-то по имени Димас кто так говорит этот метод исправил это для него, но мне не повезло.
Я прибег к настройке auto_prepend_file
в моем php.ini в файл, содержащий следующее:
<?php
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];
unset($_SERVER['PATH_TRANSLATED']);
$_SERVER['SCRIPT_NAME'] = $_SERVER['PATH_INFO'];
unset($_SERVER['PATH_INFO']);
Не лучшее решение, но, по крайней мере, мне не нужно вручную редактировать vBulletin, Wordpress и т. Д.
Вы можете исправить это, убедившись, что cgi.fix-pathinfo в вашем php.ini установлено значение 1. Это заставляет PHP заполнять массив $ _SERVER, как и следовало ожидать при выполнении PHP как CGI / FastCGI на Apache.
https://serverfault.com/a/423965/118969 от ColtonCat выше, это лучший ответ. Я пробовал использовать nginx (ssl-reverse-proxy) -> apache -> php53-fpm.
при использовании nginx (ssl-reverse-proxy) -> apache + mod_php, ты можешь использовать cgi.fix_pathinfo = 0