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

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

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.

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

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

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

В качестве альтернативы вы можете вместо этого отключить модуль php7.0 Apache, но это не приведет к удалению пакета 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) должен соответствовать пути, указанному Слушать директива в файле /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 в стиле «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.

Изменить 2:

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