Переключите apache с prefork на событие в Ubuntu 16, получите php 7 работающим
Апач работал медленно в производстве. После поиска ответов в течение некоторого времени я, наконец, перешел на IRC-канал #apache, и профессионалы попросили меня проверить режим apache с помощью этой команды:
sudo apachectl -V
и были встревожены, обнаружив, что Server MPM является prefork. Они решительно заявили, что НЕ ИСПОЛЬЗУЙТЕ ПРЕДВАРИТЕЛЬНОСТЬ НА СЕРВЕРЕ ПРОИЗВОДСТВА. Как выясняется, пакеты Ubuntu (предположительно унаследованные от Debian?) Настаивают на запуске apache в режиме prefork, несмотря на то, что рекомендуемый метод для запуска 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-событие в качестве опции тега. Вот что порекомендовали ребята из #apache IRC.
2 ответа
ezra-s предлагает хороший подход, но он не включает в себя некоторые детали, которые могут сбить с толку тех, кто полагается на менеджеров пакетов. ПРИМЕЧАНИЕ: я не уверен, что эти шаги точны. Если у кого-то возникнут проблемы или возникнут проблемы, дайте мне знать, и я обновлю этот пост.
Во-первых, на момент написания этой статьи пакеты Ubuntu apache2 настаивали на prefork, если вы хотите установить PHP. Однако не отчаивайтесь, потому что вы все еще можете использовать установщики пакетов для установки и обновления PHP и apache2 и по-прежнему настраивать свою работу с Apache в режиме событий, используя PHP-FPM, как рекомендовано вики Apache и более подробно описано в производительность PHP на apache httpd 2.4.x с использованием mod_proxy_fcgi и php-fpm. Основная идея заключается в том, что apache2 и PHP-FPM взаимодействуют через сокет, а не с PHP, работающим как модуль Apache.
1) Удалить или отключить модуль Apache PHP
Поскольку пакеты Ubuntu при установке PHP настаивают на префорке Apache, мы должны разделить их. Я сделал это с помощью 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 в файле / 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
на выходе.
Для удобства дистрибутивы предлагают метод "mod_php".
В то время как наиболее эффективный способ - это apache w/event + mod_proxy_fcgi -> php-fpm.
Возможно, им следует обновиться в соответствии со временем, но это трудно для них, когда так много фреймворков поставляются с конфигурациями.htaccess mod_php в стиле "подключи и работай". В конце концов, только администратор отвечает за правильное администрирование и настройку своего сайта.
Если вы находитесь в производстве, я бы предложил вам использовать тестовый сервер, чтобы практиковать обновление и изменения.
О вики я предпочитаю или рекомендую вам метод "обработчик". https://wiki.apache.org/httpd/PHP-FPM.
То есть сконфигурируйте 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.
Изменить 2:
Согласно запросу, вам не нужно удалять пакеты mod_php из debian/ubuntu, Apache заботится только о его конфигурации, так что выгрузка модуля подойдет.