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