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

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

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

sudo apachectl -V

и были встревожены, обнаружив, чтоСервер 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-event как опцию тега. Это то, что рекомендовали ребята из #apache IRC.

решение1

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

Во-первых, на момент написания статьи пакеты Ubuntu apache2 требуют prefork, если вы хотите установить 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 требуют prefork 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) должен соответствовать пути, указанномуслушатьдиректива в файле/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в выводе.

решение2

Для удобства дистрибутивы предлагают метод «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 заботится только о своей конфигурации, поэтому будет достаточно выгрузить модуль.

Связанный контент