переключить apache с prefork на event в Ubuntu 16, заставить php 7 работать

Apache работал медленно в производственной среде. После поиска ответов в течение некоторого времени я наконец перешел на канал IRC #apache, и профессионалы попросили меня проверить режим apache с помощью этой команды:

sudo apachectl -V

и были встревожены, обнаружив, что Серверный MPM является предварительным форком . Они категорически заявили НЕ ИСПОЛЬЗУЙТЕ PREFORK НА ПРОИЗВОДСТВЕННОМ СЕРВЕРЕ. Как оказалось, пакеты Ubuntu (предположительно унаследованные от Debian?) Настаивают на запуске apache в режиме предварительной вилки, несмотря на то, что рекомендуемый метод для запуска PHP с Apache явно рекомендует proxy_fcgi и php-fpm, затем fcgid и, в конце концов, говорит, что вы не должны использовать prefork:

Почему вы больше не должны использовать mod_php с prefork mpm

  • mod_php загружается в каждый процесс httpd все время. Даже когда httpd обслуживает статический / не php-контент, эта память используется.
  • mod_php не является потокобезопасным и заставляет вас придерживаться prefork mpm (многопроцессный, без потоков), это самая медленная из возможных конфигураций

Эта страница также содержит некоторые подробности о PHP-FPM , но это кажется немного сложным и неясным и, похоже, требует большого количества ручной настройки. Я разочарован и удивлен, что в Ubuntu 16 нет опции пакета для режима fastCGI или чего-то в этом роде.

Я попытался переключить apache в режим событий с помощью a2enmod, и когда я попытался запустить резервное копирование apache, я получил ошибку :

Apache работает с многопоточным MPM, но ваш PHP-модуль не скомпилирован для обеспечения многопоточности. Вам нужно перекомпилировать PHP

В любом случае, мне было интересно, есть ли у кого-нибудь минимальные пошаговые инструкции, чтобы запустить режим fastCGI в Ubuntu 16 с PHP 7.0 , полагаясь на установщики пакетов в той же мере, что и возможно. В настоящее время я смотрю на многие плохо объясненные, расплывчатые инструкции, и я обеспокоен тем, что моя производственная среда будет испорчена неверными решениями.

Кроме того, кто-то должен добавить mpm-event как параметр тега. Это то, что рекомендовали ребята из IRC #apache.

10
задан 22 March 2018 в 19:36
2 ответа

ezra-s предлагает хороший подход, но он не включает некоторые детали, которые могут сбить с толку людей, полагающихся на менеджеров пакетов. ПРИМЕЧАНИЕ : Я не уверен, что эти шаги точны. Если у кого-то возникнут проблемы или возникнут проблемы, дайте мне знать, и я обновлю этот пост.

Во-первых, на момент написания этой статьи пакеты Ubuntu apache2 настаивают на предварительном форке, если вы хотите установить PHP. Однако не отчаивайтесь, потому что вы по-прежнему можете использовать установщики пакетов для установки и обновления PHP и apache2 и по-прежнему работать с Apache в режиме event , используя PHP-FPM как рекомендовано Apache wiki и более подробно описано в Высокопроизводительный PHP на apache httpd 2.4.x с использованием mod_proxy_fcgi и php-fpm . Основная идея состоит в том, что apache2 и PHP-FPM обмениваются данными через сокет, а не PHP, работающий как модуль Apache.

1) Удалите или отключите модуль Apache PHP

Поскольку пакеты Ubuntu настаивают на предварительной форке Apache при установке PHP, мы нужно их разделить.Я сделал это, используя apt для удаления libapache2-mod-php7.0, потому что мне больше не нужен пакет:

sudo apt-get remove libapache2-mod-php7.0

В качестве альтернативы вы можете отключить модуль Apache php7.0, но это не удалит пакет apt из вашей системы

sudo a2dismod php7.0

2) Переключите Apache в режим событий и включите fcgid

. Я считаю, что эти команды должны помочь:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Установите PHP-FPM

У меня уже есть PHP 7 установлен с его различными модулями, поэтому я просто устанавливаю PHP-FPM с помощью этой команды:

sudo apt-get install php7.0-fpm

4) Отредактируйте конфигурацию VirtualHost для обработки файлов PHP с помощью PHP-FPM:

В моем случае я отредактировал хост SSL по умолчанию, /etc/apache2/sites-available/default-ssl.conf и добавил эту строку прямо вверху:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

ВАЖНО Это указывает Apache обрабатывать запросы файлов PHP с помощью PHP-FPRM и путь в этой директиве ( /run/php/php7.0-fpm.sock ) должен соответствовать пути, указанному директивой listen в файле [11 52467] /etc/php/7.0/fpm/pool.d/www.conf

5) Перезапустите Apache

sudo service apache2 restart

Чтобы проверить, включен ли режим событий, используйте эту команду:

sudo apachectl -V

В выводе вы должны увидеть это:

Server MPM:     event

Попробуйте создать страницу phpinfo и открыть ее в своем браузере. Вы должны увидеть Server API: FPM / FastCGI в выходных данных.

12
ответ дан 2 December 2019 в 22:04

Для удобства дистрибутивы предлагают метод "mod_php"

Хотя наиболее производительным способом является apache w / event + mod_proxy_fcgi -> php-fpm.

Возможно, им стоит обновиться в соответствии со временем, но им это трудно, когда так много фреймворков поставляются с конфигурациями .htaccess mod_php в стиле «plug & play». В конце концов, только администратор отвечает за правильное администрирование и настройку своего сайта.

Если вы работаете в производственной среде, я бы посоветовал вам использовать тестовый сервер для отработки обновления и изменений.

О вики Я предпочитаю или предлагаю вам метод "обработчика". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

То есть настройте php-fpm так, чтобы сокет был готов и с достаточными разрешениями для пользователя Apache отправлять запросы к нему и настройте Apache для его использования.

Быстрый пример:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Edit:

Таким образом, не имеет значения, какую версию PHP вы используете, потому что Apache не заботится, он просто обратит прокси соответствующие запросы в php-fpm.

Также не забудьте выгрузить mod_php, чтобы иметь возможность использовать mpm_event.

Редактировать 2:

Согласно запросу, вам не нужно удалять пакеты mod_php из debian / ubuntu , Apache заботится только о своей конфигурации, поэтому подойдет выгрузка модуля.

5
ответ дан 2 December 2019 в 22:04

Теги

Похожие вопросы