Я пытаюсь заставить PHP работать над FPM на Centos.
Что касается FPM, /etc/php-fpm.d/www.conf
в значительной степени значения по умолчанию. Я оставил его с использованием TCP-порта следующим образом (я могу захотеть перейти на файловый порт позже для повышения производительности, но давайте пройдемся перед запуском):
listen = 127.0.0.1:9000
В php-fpm
сервис запускается без проблем.
Так что я думаю, что мои проблемы связаны с Apache. Я добавил файл конфигурации conf.d/php-fpm.conf
содержащий следующее:
# Defining a worker will improve performance
# And in this case, re-use the worker (dependent on support from the fcgi application)
# If you have enough idle workers, this would only improve the performance marginally
<Proxy "fcgi://localhost:9000/" enablereuse=on max=10>
</Proxy>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
# Pick one of the following approaches
# Use the standard TCP socket
SetHandler "proxy:fcgi://localhost/:9000"
# If your version of httpd is 2.4.9 or newer (or has the back-ported feature), you can use the unix domain socket
#SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</If>
</FilesMatch>
Я создал тестовый сайт следующим образом:
<VirtualHost 192.168.1.35:80>
ServerAdmin webmaster@example.com
ServerName centos.local
ServerAlias www.centos.local
#ProxyPassMatch "^/(.*\.php)$" "unix:/var/run/myappname.sock|fcgi://localhost/webroot"
DirectoryIndex index.html
ErrorLog /var/log/httpd24/centos.error.log
CustomLog /var/log/httpd24/centos.access.log combined
<Directory /var/www/vhosts/centos.local/httpdocs>
DocumentRoot /var/www/vhosts/centos.local/httpdocs
# Allow .htaccess
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
(Я не уверен, нужен ли ProxyPassMatch, похоже, я получаю тот же результат, есть он у меня или нет).
Служба httpd запускается, и страницы html обслуживаются нормально, но если я попытаюсь загрузить файл PHP, я получаю сообщение «Служба недоступна» в браузере, а в журнал ошибок записывается следующее:
[Sun Jul 22 21:13:21.813760 2018] [proxy:error] [pid 14621] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/myappname.sock (localhost) failed
[Sun Jul 22 21:13:21.814003 2018] [proxy_fcgi:error] [pid 14621] [client 192.168.1.41:54578] AH01079: failed to make connection to backend: httpd-UDS
Надеюсь, кто-нибудь скажет мне, где я ошибаюсь!
Редактировать:
Как и предполагалось, я удалил ProxyPassMatch. Теперь я получаю следующую ошибку:
[Sun Jul 22 23:25:08.066467 2018] [proxy:error] [pid 16319] (13)Permission denied: AH00957: FCGI: attempt to connect to 127.0.0.1:8000 (*) failed
[Sun Jul 22 23:25:08.066548 2018] [proxy_fcgi:error] [pid 16319] [client 192.168.1.41:56396] AH01079: failed to make connection to backend: localhost
Кажется, не удается найти FPM на порту 8000, но я ничего не вижу ни в одном из моих файлов конфигурации. Что мне не хватает?
Спасибо,
Джеймс
Поскольку вы используете прокси-сервер TCP-сокета на <Proxy "fcgi://localhost:9000/" enablereuse=on max=10>
</Proxy>
Проблема вызвана SetHandler "proxy:fcgi://localhost/:9000"
По какой-то причине Apache интерпретирует косую черту как разделитель каталогов и по умолчанию использует порт 8000
для прокси.
Чтобы решить проблему, просто удалите /
перед :9000
SetHandler "proxy:fcgi://localhost:9000"
Убедитесь, что ваша конфигурация php-fpm соответствует:
[www]
listen = localhost:9000
listen.allowed_clients=localhost
Я настоятельно рекомендую вам вместо этого указать IP-адрес. localhost - это своего рода универсальный вариант.
поскольку
localhost
может применяться к нескольким IP-адресам на веб-сервере, я рекомендую явно указать IP-адрес, чтобы избежать назначения прокси-сервера нескольким частным IP-адресам или разрешению DNS.
Пример:#/etc/hosts 127.0.0.1 localhost 192.168.1.2 localhost fqdn.example.com
Ниже приводится предлагаемая конфигурация виртуального хоста Apache и php-fpm, когда не используется сокет домена Unix (UDS).
9001
используется, чтобы не конфликтовать со значением по умолчанию [www]
php-fpm pool и позволяют создать отдельную конфигурацию пула.
Убедитесь, что ваша конфигурация MPM не конфликтует с вашими текущими конфигурациями.
#/etc/httpd/conf.d/01-mpm.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule cgid_module modules/mod_cgid.so
<IfModule mpm_event_module>
ServerLimit 100
StartServers 4
ThreadLimit 64
MaxRequestWorkers 100
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxConnectionsPerChild 1000
ListenBacklog 511
</IfModule>
#/etc/httpd/conf.d/999-centos.local.conf
<VirtualHost 192.168.1.35:80>
ServerAdmin webmaster@example.com
ServerName centos.local
ServerAlias www.centos.local
DocumentRoot /var/www/vhosts/centos.local/httpdocs
ErrorLog /var/log/httpd24/centos.error.log
CustomLog /var/log/httpd24/centos.access.log combined
<Directory /var/www/vhosts/centos.local/httpdocs>
# Allow .htaccess
AllowOverride All
Require all granted
DirectoryIndex index.php index.html
<IfModule mod_setenvif.c>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
</Directory>
<IfModule proxy_fcgi_module>
<Proxy "fcgi://127.0.0.1:9001/" enablereuse=on max=10>
ProxySet timeout=1800
</Proxy>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9001"
</If>
</FilesMatch>
</IfModule>
</VirtualHost>
;/etc/php-fpm.d/centos.local.conf
[centos.local]
user=apache
group=apache
listen=127.0.0.1:9001
listen.allowed_clients=127.0.0.1
pm=dynamic
pm.max_children=10
pm.start_servers=2
pm.min_spare_servers=2
pm.max_spare_servers=5
security.limit_extensions=.php
При желании вы можете заменить конфигурацию сокета TCP на использование UDS.
<VirtualHost>
#...
<IfModule proxy_fcgi_module>
<Proxy "fcgi://127.0.0.1/" enablereuse=on max=10>
ProxySet timeout=1800
</Proxy>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler proxy:unix:/var/run/unique-domain.sock|fcgi://127.0.0.1/
</If>
</FilesMatch>
</IfModule>
</VirtualHost>
[centos.local]
;...
;listen=127.0.0.1:9001
;listen.allowed_clients=127.0.0.1
listen=/var/run/unique-domain.sock
listen.mode=0660
listen.owner=nobody
listen.group=nobody
;...
Примечание. Поддержка UDS mod_proxy_fcgi появилась в Apache 2.4.9. [sic]
Вы не должны использовать
enablereuse=on
при использовании UDS и Apache 2.4 <2.4.11 В Apache до 2.4.11 были проблемы, несовместимые с UDS и повторным использованием соединения. [sic]Если при использовании UDS возникают странные ответы или ошибки 503 service unavailable, удалите
enablereuse=on max=10
из<Proxy "fcgi://127.0.0.1:9001/">
В руководство ты следил за шоу три различные методы для проксирования PHP в php-fpm. Все они исключают друг друга, и вы должны выбрать именно один из них.
Я рекомендую вам придерживаться Прокси через обработчик подход, как в первом блоке кода, и удалите Подход TCP-сокета (IP и порт) из вашего второго блока кода. То есть удалите следующее:
ProxyPassMatch "^/(.*\.php)$" "unix:/var/run/myappname.sock|fcgi://localhost/webroot"
Он не ссылается на сокет TCP, который все равно прослушивает php-fpm.
Кстати, вы также должны исправить DirectoryIndex
но это уже другая проблема.