Ubuntu — Apache FastCgi, PHP-FPM, Suexec Ошибка отказа в разрешении

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

Замечания: PHP Script работает через PHP-FPM когда я поворачиваюсь OFF «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/mods-available/fastcgi.conf

FastCgiWrapper On

/ И т.д. / apache2 / Suexec / WWW-данные

/var/www/html
/cgi-bin

/etc/apache2/sites-available/example.net.conf

<VirtualHost *:80>
ServerName example.net
ServerAdmin example@example.net
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

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 часть, это не ошибка. Это действительно не имеет значения, что вы положили для 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, поэтому измените его соответствующим образом. Опять же, убедитесь, что вы также изменили путь к корню документа.

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

1

Другие решения

Вы просите 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 версии достаточно. Во всяком случае, это мое понимание. Надеюсь, это кому-нибудь поможет.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector