Apache работал медленно. После поиска ответов в течение некоторого времени я, наконец, перешел на канал IRC #apache, и профессионалы попросили меня проверить режим apache с помощью этой команды:
sudo apachectl -V
и были встревожены, обнаружив, что Сервер MPM является Prefork. Они решительно сказали НЕ ИСПОЛЬЗУЙТЕ 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-event в качестве опции тега. Это то, что рекомендовали ребята из IRC #apache.
Эзра-С предлагает хороший подход, но не включает некоторые детали, которые могут сбить с толку людей, полагающихся на менеджеров пакетов. НОТА: Я не уверен, точны ли эти шаги. Если у кого-то возникнут проблемы или возникнут проблемы, дайте мне знать, и я обновлю этот пост.
Во-первых, на момент написания этой статьи пакеты Ubuntu apache2 настаивают на предварительной форке, если вы хотите установить PHP. Однако не отчаивайтесь, потому что вы все еще можете использовать установщики пакетов для установки и обновления PHP. и apache2 и при этом ваша конфигурация будет работать с Apache в мероприятие режим с использованием 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
В качестве альтернативы вы можете вместо этого отключить модуль php7.0 Apache, но это не приведет к удалению пакета 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) должен соответствовать пути, указанному Слушать директива в файле /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 заботится только о своей конфигурации, поэтому выгрузка модуля подойдет.