переключите apache с prefork на событие в Ubuntu 16, получите php 7 работающим

11

Apache работал медленно в производстве. После поиска ответов в течение некоторого времени я, наконец, перешел на 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-событие в качестве опции тега. Вот что порекомендовали ребята из IRAP #apache.

С. Имп
источник
Последняя ошибка связана с тем, что вы переключились на событие, но все еще используете mod_php. Отключите mod_php и переключитесь на php-fpm, и он исчезнет. И могу ли я порекомендовать nginx?
Майкл Хэмптон
@MichaelHampton заголовок должен упомянуть PHP. Нетрудно переключить apache на событие. Трудно переключить apache на событие и заставить работать php 7.
S. Imp
1
@MichaelHampton: вы наверняка понимаете, что я не совсем понимаю, как «отключить mod_php и переключиться на php-fpm». Разве это не тот вопрос, который я задаю в своем посте? Кроме того, вопрос не о nginx, который представляет еще одну область обучения. Переключение на nginx нецелесообразно для этого проекта, потому что я работаю с командой.
S. Imp
Я не упоминал, как отключить модули Apache, потому что вы продемонстрировали, что уже знаете, как это сделать. Что касается включения php-fpm, см. Ответы на этот вопрос, онлайн-уроки и т. Д.
Майкл Хэмптон,

Ответы:

15

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

Во-первых, на момент написания этой статьи пакеты apache2 в Ubuntu настаивали на 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в выводе.

С. Имп
источник
5
Я предлагаю не использовать ProxyPassMatch, потому что это не позволит использовать .htaccess в каталоге. Используйте это вместо: <FilesMatch \ .php $> SetHandler "прокси: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </ FilesMatch>
waza123
Это тоже работает gist.github.com/GAS85/990b46a3a9c2a16c0ece4e48ebce7300
user5858
Что произойдет, если я не коснусь этого файла, в отличие от того, что вам было сказано: /etc/apache2/sites-available/default-ssl.conf,? Мой https и http оба работают нормально
user5858
Я следовал за ответом, за исключением ProxyPassMatch, добавил строку Filesmatch из комментария @ waza123 в начало 000-default.conf и перезапустил apache2, и все работает отлично. Благодаря вам обоим мой маленький VPS экономит ТОННУ памяти и ЦП за mpm_prefork 🥳
dw1
Мне не нужно было делать ProxyPass или редактировать файл с Ubuntu Server 19.10. После шага 3 (установка PHP-FPM) я только что это сделал, a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apacheи когда я создал файл phpinfo.php с <?php phpinfo();внутренним компонентом , в строке API сервера указано FPM / FastCGI. Кстати, я установил php7.3, потому что на момент написания этого поста, по крайней мере, нужно быть на этой версии, если не выше, и репозитории Ubuntu apt для Ubuntu Server 19.10 в настоящее время доходят до php7.3.
ServerChecker
6

Для удобства дистрибутивы предлагают метод "mod_php".

В то время как наиболее эффективный способ - это apache w / event + mod_proxy_fcgi -> php-fpm.

Возможно, им следует обновиться в соответствии со временем, но это трудно для них, когда так много фреймворков поставляются с конфигурациями .htaccess mod_php в стиле «подключи и работай». В конце концов, только администратор отвечает за правильное администрирование и настройку своего сайта.

Если вы находитесь в производстве, я бы предложил вам использовать тестовый сервер, чтобы практиковать обновление и изменения.

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

Ezra-ы
источник
Спасибо за ваш ответ. Я делал много проб и ошибок, и этот подход сейчас работает. Реальный процесс немного сложнее, потому что вы должны получить apache от prefork к событию, удалить libapache2-mod-php7.0 и т. Д. Я надеюсь сформулировать более полный ответ здесь чуть позже.
S. Imp
не нужно «удалять» с точки зрения apache httpd, просто выгрузите модуль. То же самое с event / prefork, mpm тоже модули 2.4, поэтому выгрузите prefork и загрузите событие.
ezra-s
Хорошо, так что, возможно, вам не нужно удалять пакет, но вы должны отключить модуль php для apache как минимум - и я обеспокоен тем, что обновление apt-get нарушит установку. Эти детали отсутствуют в вашем ответе. Я был бы рад, если бы вы добавили их, потому что я не особенно уверен в своей способности четко объяснить, что именно я сделал.
S. Imp
Возможно, я предположил, что Apache также не заботится о пакетах Debian, только о его функциональной конфигурации.
ezra-s
Apache будет заботиться , если склонный пакет обновления изменяет свою конфигурацию, которая является проблемой я столкнулся в одной точке. В духе моего первоначального поста я хотел бы предоставить подробные инструкции для тех, кто полагается на установщики пакетов (и обновления), как и я.
S. Imp