Назад | Перейти на главную страницу

Apache 2.4 с PHP-FPM 5.6 на Centos 6

Я пытаюсь заставить 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 но это уже другая проблема.