Apache FastCgi, PHP-FPM, Suexec Permission Denied Error

Я сделал настройку Apache2.4 + FastCgi, PHP-FPM, SuExec, которая корректно работает без Suexec. Но когда я включаю Suexec, он дает мне ошибку «Файл не существует» (ошибка 404 Not Found в браузере при доступе к php-скрипту).

Примечание: PHP-скрипт работает через PHP-FPM, когда я ВЫКЛЮЧАЮ "FastCgiWrapper", но когда я включаю, возникает ошибка 404.

Журнал ошибок Apache (последняя строка):

[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[core:info] [pid 3906:tid 140546979436288] [client 192.168.91.132:58225] AH00128: File does not exist: /etc/apache2/fcgi-app/info.php

Конфигурация:

/etc/apache2/моды-доступные/fastcgi.conf

FastCgiWrapper On

/etc/apache2/suexec/www-данные

/var/www/html
/cgi-bin

/etc/apache2/сайты-доступны/example.net.conf

<VirtualHost *:80>
        ServerName example.net
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/example.net/public_html
        LogLevel debug
        ErrorLog ${APACHE_LOG_DIR}/error.log

    SuexecUserGroup example examplegrp
    AddHandler php-fcgi-hand .php
    Action php-fcgi-hand /php-fcgi-uri
    Alias /php-fcgi-uri fcgi-app
    FastCgiExternalServer fcgi-app -socket /var/run/php5-fpm-example.sock -pass-header Authorization -idle-timeout 30000 -flush

    <Location /php-fcgi-uri>
            Require all granted
    </Location>

</VirtualHost>

/etc/php5/fpm/pool.d/example.conf

[example]
user  = example
group = examplegrp
listen = /var/run/php5-fpm-example.sock
listen.owner = example
listen.group = examplegrp
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

/var/www/html/example.net/cgi-bin/php.cgi

#!/bin/sh 
PHP_FCGI_CHILDREN=5
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_MAX_REQUESTS
exec /var/www/html/example.net/cgi-bin

Структура папок и разрешения

/var/www/html/example.net/cgi-bin/php.cgi
/var/www/html/example.net/public_html/info.php

drwxrwxrwx 13 www-data www-data var
    |____drwxr-xr-x 5 www-data www-data www
        |____drwxr-xr-x 6 www-data www-data html
            |____ drwxr-xr-x 4 example  examplegrp example.net
                |______ drwxr-xr-x 2 example examplegrp cgi-bin
                    |_____-r-xr-xr-x 1 example examplegrp php.cgi

                |______ drwxr-xr-x 2 example examplegrp public_html
                    |_____-rwxr-xr-x 1 example examplegrp info.php

person sravis    schedule 19.09.2014    source источник
comment
Если я не слепой, я не вижу здесь ничего, что указывало бы на то, что вы используете PHP-FPM. Похоже, вы используете PHP-CGI. FPM использует пулы, подключенные через сокет или TCP. Ни один из ваших примеров не показывает это использование.   -  person Diemuzi    schedule 19.09.2014
comment
@Diemuzi Я настроил vhost для использования PHP-FPM, и он работает нормально, но когда я включаю FastCgiWrapper, он выдает ошибку 404 Not Found. Пожалуйста, проверьте мой обновленный вопрос.   -  person sravis    schedule 20.09.2014


Ответы (2)


Я написал эту рабочую конфигурацию давно, и она работает на Apache 2.4.x, поэтому я рекомендую вам попробовать https://gist.github.com/diemuzi/3849349. Он слишком велик, чтобы публиковать ответ здесь. Вы найдете все необходимые конфигурации. Вы можете даже увидеть что-то, что я сделал по-другому по сравнению с тем, что вы разместили здесь.

Однако я также рекомендую вам перестать думать об использовании FastCgiExternalServer, как вы пытаетесь, и как вы найдете в моем примере. Но вместо этого изучите использование mod_proxy_fcgi. Теперь это гораздо более простой способ подключения к FPM, и с недавнего времени он поддерживает сокеты.

Вот пример способа mod_proxy_fcgi:

# PHP-FPM via Socket
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/usr/local/php/etc/php-fpm/[USERNAME].sock|fcgi://localhost/vhosts/[DOMAIN]/public/
    </IfModule>
</IfModule>

Конечно, вы захотите изменить путь unix: и путь к вашему документу root. Обратите внимание на часть localhost, это не ошибка. На самом деле не имеет значения, что вы указали для локального хоста, но я подумал, что это выглядит лучше. Да, мой домен доступен по IP-адресу и домену, даже если он говорит localhost, так что не позволяйте этому обмануть вас.

Если вы хотите использовать TCP-способ использования mod_proxy_fcgi, вы можете сделать это и так:

# PHP-FPM via TCP
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        <Location ~ ^/(.*\.php(/.*)?)$>
            ProxyPass fcgi://127.0.0.1:[PORT]/vhosts/[DOMAIN]/public/
        </Location>
    </IfModule>
</IfModule>

Конечно, убедитесь, что 127.0.0.1:[PORT] соответствует тому, что у вас есть внутри вашего пула FPM, поэтому измените его соответствующим образом. Опять же, убедитесь, что вы также изменили путь к корню документа.

Все три ответа, которые я дал вам, являются рабочими примерами. Я даже проверил незадолго до того, как опубликовал этот ответ.

person Diemuzi    schedule 20.09.2014

Вы запрашиваете запуск Apache от имени пользователя example, но устанавливаете файл конфигурации для пользователя www-data. В документации сказано, что файл конфигурации /etc/apache2/suexec/www-data читается, когда пользователем Apache является www-data. Я никогда не экспериментировал с этим, но, возможно, вам нужно установить файл конфигурации /etc/apache2/suexec/example. Одна вещь, которую я нахожу немного запутанной, это эти два этапа: пользователь Apache, а затем целевой пользователь, которому разрешено запускать целевой cgi. Suexec выполняет проверки на этих двух этапах. Версия custom suexec позволяет другому пользователю Apache работать с другим файлом конфигурации, но это отличается от выбора целевого пользователя с помощью директивы SuexecUserGroup Apache. Нам не нужно менять пользователя Apache, если мы хотим изменить только целевого пользователя, который будет запускать CGI. Для этого достаточно версии pristine. Во всяком случае, это мое понимание. Я надеюсь, что это поможет кому-то.

person Community    schedule 29.02.2016