
Я настроил php7.0-fpm для работы с Apache на Ubuntu 16.04, но не уверен, что он правильно настроен и работает.
Насколько я понимаю, после установки и настройки вывод файла php info должен отображать «Server API --> FPM/FastCGI», но он по-прежнему отображает «Server API --> Apache 2.0 Handler».
Вот как я установил и настроил php7.0-fpm:
sudo apt-get install libapache2-mod-fastcgi php7.0-fpm
sudo a2enmod actions fastcgi alias
sudo a2enconf php7.0-fpm
sudo service php7.0-fpm restart
sudo systemctl status php7.0-fpm
sudo systemctl restart apache2.service
Ниже приведен вывод sudo systemctl status php7.0-fpm:
php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-11-25 11:57:33 UTC; 23h ago
Process: 1149 ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 1336 (php-fpm7.0)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3
Memory: 37.8M
CPU: 3.089s
CGroup: /system.slice/php7.0-fpm.service
├─1336 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
├─1340 php-fpm: pool www
└─1341 php-fpm: pool www
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.
Что я делаю не так? Буду признателен за помощь и совет?
Ниже приведено содержимое моего /etc/apache2/conf-enabled/php7.0-fpm.conf
файла:
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi .php
Action php7-fcgi /php7-fcgi
Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>
решение1
Вам необходимо включить proxy_fcgi
модуль и отключить его mod_php7
, чтобы стандартный php7.0-fpm
файл конфигурации вступил в силу.
Если вы посмотрите /etc/apache2/conf-enabled/php7.0-fpm.conf
, то увидите это вверху:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
решение2
Мне удалось заставить это работать без особых проблем, следуя инструкциям наБлог разработчиков Koen Reiniers. Я следовал инструкциям почти точно, и за одним исключением, отмеченным в комментариях к посту в блоге, все сработало идеально. Вам понадобитсяmod_fastcgi, а также несколько других модулей. Этот рецепт позволит вам настроить несколько vhosts, каждый из которых использует независимую конфигурацию php7 fpm. Обратите внимание, что еслиphpinfo()показывает API сервера "FPM/FastCGI", то вы промахнулись. Это лакмусовая бумажка, что у вас работает стек. В качестве проверки я также выполнил "<?php touch('/tmp/fpmtest');", чтобы убедиться, что процессы, запущенные для моего vhost, выполнялись как указанный пользователь/группа (они выполнялись).
Этот рецепт скопирован с небольшими изменениями из блога Коэна, и ему следует отдать должное за его четкие и эффективные инструкции.
За возможным исключением строф, связанных с безопасностью, вы делаетенетхотите включить Apache conf дляphp7.0-fpmесли вы используете этот рецепт. Единственный код, который необходимо выполнить глобально, это:
<Directory "/usr/lib/cgi-bin">
Require all granted
</Directory>
Если ваша конфигурация Apache2 позволяетmod_cgi.cто это, вероятно, уже было учтено в файле конфигурации по умолчанию для модуля. В противном случае, если этот модуль (илиmod_cgid.c) еще не включен, его можно добавить в любой файл conf, который выполняется при запуске Apache2, хотя, в зависимости от среды вашего сервера, может быть более безопасно добавить его только в каждый <VirtualHost>, для которого включен PHP-FPM. Код, связанный с безопасностью, изphp7.0-fpm.confтакже можно скопировать в то же место или включить глобально.
Это руководство предполагает, что у вас запущен PHP 7.0.*, а также Apache (с виртуальными хостами) на сервере Ubuntu. Также, пожалуйста, не пытайтесь сделать это в производственной среде без надлежащих резервных копий.
Сначала убедитесь,php7.0-fpmустановлен в вашей системе:
$ sudo apt-get install php7.0-fpm
После установки запустите службу, если она не была запущена автоматически, и убедитесь, что она работает:
$ sudo service php7.0-fpm start && ps aux | grep php-fpm
Чтобы использовать PHP-FPM для каждого из ваших виртуальных хостов, вам придется разделить его на несколько пулов ресурсов, по одному для каждого отдельного пользователя <VirtualHost>, что означает, что если у вас есть несколько хостов, назначенных одному пользователю, вам придется создать только один пул ресурсов для этого пользователя.
Расположение по умолчанию для конфигурации пула для PHP-FPM:
/etc/php/7.0/fpm/pool.d/
Чтобы создать новую конфигурацию для одного из ваших пользователей, просто создайте новый файл .conf. Я использовал имя пользователя в качестве имени файла конфигурации:
$ sudo vim /etc/php/7.0/fpm/pool.d/username.conf
И используйте это в качестве своей конфигурации (замените «username» на фактическое имя вашего пользователя):
[username]
user = username
group = username
listen = /run/php/php7.0-fpm.username.sock
listen.owner = username
listen.group = username
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Первые семь строк самые важные. Убедитесь, что они совпадают с пользователем Apache virtualhost. Последние пять строк — настройки по умолчанию для менеджера процессов. Оставьте их как есть для простоты, но вы можете изменить их по своему вкусу. Подробнее об этих настройках можно прочитать в файле конфигурации по умолчанию, расположенном по адресу:
/etc/php/7.0/fpm/pool.d/www.conf
Осталось только сказать Apache использовать PHP-FPM вместо mod_php. Сначала убедитесь, что у вас включены mod_actions и mod_fastcgi:
$ sudo a2enmod actions fastcgi
$ sudo service apache2 restart
Добавьте обработчик PHP-FPM fastcgi в Apache. Вам придется сделать это для каждого пользователя, которому вы хотите разрешить использовать PHP-FPM. Отредактируйте файл per-vhost для имени пользователя, обычно по адресу:
/etc/apache2/sites-available/username.conf
Добавьте следующее вверху:
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-username .php
Action php7-fcgi-username /php7-fcgi-username
Alias /php7-fcgi-username /usr/lib/cgi-bin/php7-fcgi-username
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username -socket /run/php/php7.0-fpm.username.sock -pass-header Authorization
</IfModule>
Опять же, замените «username» фактическим именем пользователя виртуального хоста.
Вы должны указать вашему виртуальному хосту, чтобы он действительно использовал его для файлов .php, поэтому в том же файле, но в директиве <VirtualHost>, добавьте следующие строки:
<IfModule mod_fastcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler php7-fcgi-username
</FilesMatch>
</IfModule>
Замените «username» на имя реального пользователя vhost и сохраните файл. Этоочень важночто директива SetHandler должна быть обернута подмножеством условных контейнерных тегов файловой системы Apache, <Location>, <LocationMatch>, <Files> или <FilesMatch>. Если этого не сделать, SetHandler будет проигнорирован. Тег <Directory>, по-видимому, не подходит.
Если вы хотите воспользоваться возможностями PHP-FPM «status» и «ping» и включить их в файле пула для каждого виртуального хоста в/etc/php/7.0/fpm/pool.dкаталог (см./etc/php/7.0/fpm/pool.d/www.confдля получения подробной информации) вам необходимо будет внести два дополнительных изменения в настройки Apache2.ДействиеДиректива в верхней части файла .conf per-vhost должна заканчиваться на «virtual», например:
Action php7-fcgi-username /php7-fcgi-username virtual
Кроме того, ваш SetHandler wrapper должен указывать регулярное выражение, которое включает эти виртуальные файлы. Я использую следующее:
<LocationMatch ".+\.ph(p[3457]?|t|tml)|/(ping|status)$">
SetHandler ....
</LocationMatch>
Теперь осталось только перезагрузить файлы конфигурации Apache:
$ sudo service apache2 reload
Чтобы проверить, вступили ли изменения в силу, создайте файл phpinfo.php в общедоступном каталоге вашего сайта и откройте его в браузере:
<?php phpinfo();
API сервера, отображаемый в верхней части страницы, должен содержать «FPM/FastCGI».
Чтобы завершить процесс, вам следует повторить шаги для каждого из ваших виртуальных хостов. Когда вы будете полностью увереныmod_phpбольше не используется, вы можете отключить его следующим образом:
$ sudo a2dismod php7.0
Пока вы этого не сделаете, Apache будет по-прежнему включать PHP-процесс для каждого запроса, а это значит, что использование памяти останется прежним и, возможно, даже возрастет.