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.
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.
Поскольку пакеты Ubuntu настаивают на предварительной форке Apache при установке PHP, мы нужно их разделить.Я сделал это, используя apt для удаления libapache2-mod-php7.0, потому что мне больше не нужен пакет:
sudo apt-get remove libapache2-mod-php7.0
В качестве альтернативы вы можете отключить модуль Apache php7.0, но это не удалит пакет apt из вашей системы
sudo a2dismod php7.0
. Я считаю, что эти команды должны помочь:
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi
У меня уже есть PHP 7 установлен с его различными модулями, поэтому я просто устанавливаю PHP-FPM с помощью этой команды:
sudo apt-get install php7.0-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
sudo service apache2 restart
Чтобы проверить, включен ли режим событий, используйте эту команду:
sudo apachectl -V
В выводе вы должны увидеть это:
Server MPM: event
Попробуйте создать страницу phpinfo и открыть ее в своем браузере. Вы должны увидеть Server API: FPM / FastCGI
в выходных данных.
Для удобства дистрибутивы предлагают метод "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>
Таким образом, не имеет значения, какую версию PHP вы используете, потому что Apache не заботится, он просто обратит прокси соответствующие запросы в php-fpm.
Также не забудьте выгрузить mod_php, чтобы иметь возможность использовать mpm_event.
Согласно запросу, вам не нужно удалять пакеты mod_php из debian / ubuntu , Apache заботится только о своей конфигурации, поэтому подойдет выгрузка модуля.