Продолжаем настраивать наш сервер с Ubuntu 22.04. И на этот раз установим PHP 8.2 (PHP-FPM) и настроим его работу в связке с Nginx.
Детали под катом.
Исходные данные: Ubuntu 22.04, Nginx 1.25.x
Задача: Установить и настроить PHP-FPM 8.2 для домена mysite.org
Предполагается, то Nginx у Вас уже установлен и настроен в базовом варианте. Если это не так, то можете воспользоваться моей статьей.
1. Установим сторонний репозитарий ondrej/php, где есть все нужные и свежие версии PHP
apt-get install -y software-properties-common add-apt-repository ppa:ondrej/php apt-get update
2. Проверим какие пакеты PHP 8.2 нам доступны
apt-cache search php8.2
Список будет достаточно внушительным, мы выберем базовый необходимый набор и установим.
Кроме PHP версии 8.2 в репозитории ondrej есть и другие версии, например более старые PHP 7.0 и вы его можете так же установить, причем в системе будет работать несколько версий PHP и это очень удобно.
3. Установка PHP 8.2
apt-get install -y php8.2 php8.2-fpm php8.2-mbstring php8.2-xml php8.2-gd php8.2-curl
Проверим версию PHP:
# php -v PHP 8.2.8 (cli) (built: Jul 8 2023 07:10:21) (NTS) Copyright (c) The PHP Group Zend Engine v4.2.8, Copyright (c) Zend Technologies with Zend OPcache v8.2.8, Copyright (c), by Zend Technologies
Найдем где располагается файл конфигурации по умолчанию, стоит заметить, что это файл относиться к cli (консольной) версии PHP, для PHP-FPM файл будет другой.
php --ini | grep "Loaded Configuration File"
Результат:
Loaded Configuration File: /etc/php/8.2/cli/php.ini
То есть для cli (консольной) версии PHP файл конфигурации /etc/php/8.2/cli/php.ini
Основной файл конфигурации PHP-FPM будет /etc/php/8.2/fpm/php-fpm.conf
Основной каталог в котором будут храниться конфигурация пулов PHP-FPM будет /etc/php/8.2/fpm/pool.d, файлы конфигурации пулов должны иметь расширение *.conf
Запустим PHP-FPM:
systemctl enable --now php8.2-fpm.service
Проверим статут PHP-FPM:
# systemctl status php8.2-fpm.service ● php8.2-fpm.service - The PHP 8.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php8.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-07-29 13:58:03 UTC; 2min 1s ago Docs: man:php-fpm8.2(8) Main PID: 33261 (php-fpm8.2) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1062) Memory: 10.1M CPU: 83ms CGroup: /system.slice/php8.2-fpm.service ├─33261 "php-fpm: master process (/etc/php/8.2/fpm/php-fpm.conf)" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ├─33263 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" > └─33264 "php-fpm: pool www" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" > Jul 29 13:58:03 myserver systemd[1]: Starting The PHP 8.2 FastCGI Process Manager... Jul 29 13:58:03 myserver systemd[1]: Started The PHP 8.2 FastCGI Process Manager.
4. Настройка Nginx и PHP-FPM
Чтобы посмотреть список запущенных пулов можно воспользоваться командой
systemctl status php8.2-fpm.service
или
ps -ef |grep "[p]hp-fpm: pool"
При первоначальной установке у нас создается 1 пул — www, как я говорил выше, конфигурация пулов находится в каталоге /etc/php/8.2/fpm/pool.d
Для пула www создался файл конфигурации /etc/php/8.2/fpm/pool.d/www.conf
Выведем его конфигурацию без комментариев:
cat /etc/php/8.2/fpm/pool.d/www.conf | egrep -Ev "^\s*(;|#|$)"
Результат:
[www] user = www-data group = www-data listen = /run/php/php8.2-fpm.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
Как можно заметить по настройкам, пользователь и группа от имени которой работает пул www — это www-data
И для нас это неправильно, ведь у нас Nginx и работает он под пользователем nginx. Исправим пользователя в файле /etc/php/8.2/fpm/pool.d/www.conf
sed -i "s/www-data/nginx/g" /etc/php/8.2/fpm/pool.d/www.conf
Перезапустим PHP-FPM:
systemctl restart php8.2-fpm.service
Проверим список запущенyых пулов:
ps -ef |grep "[p]hp-fpm: pool"
Результат
nginx 33449 33447 0 14:03 ? 00:00:00 php-fpm: pool www nginx 33450 33447 0 14:03 ? 00:00:00 php-fpm: pool www
В первом столбце мы видим, что пулы работают под пользователем nginx — это нам и нужно.
Детальное описание каждой директивы можно почитать в официальной документации тут.
Теперь нам нужно подключить использование PHP-FPM для обработки запросов к PHP-файлов в Nginx.
При установке Nginx в нашей прошло статье мы уже зашли по http на страницу по умолчанию, мы увидели там надпись «Welcome to nginx!», так же Вы должны были освоить как Nginx обрабатывает входящие соединения.
Теперь давайте сконфигурируем простой сайт на PHP, например у нас есть зарегистрированный домен mysite.org, Вы сконфигурировали в DNS для него запись типа A указывающую на IP адрес Вашего сервера на котором и установлен Nginx, пусть IP адрес будет 23.111.108.101 (в реальности у Вас конечно будет настоящий IP адрес).
Создадим файл виртуального сервера для Nginx, он почти один в один повторяет рекомендованный вариант в документации Nginx. Единственное, что мы в нем добавили свое, это IP адрес (директива listen), имя домена (директива server_name), директория сайта (директива root) и путь до сокета PHP-FPM (директива fastcgi_pass, она соответствует директиве listen из файла /etc/php/8.2/fpm/pool.d/www.conf):
(cat<<-EOF server { listen 23.111.108.101:80; server_name mysite.org www.mysite.org; root /var/www/mysite.org; location / { index index.html index.php; } location ~* \.(gif|jpg|png)$ { expires 30d; } location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } EOF )>/etc/nginx/sites-available/mysite.conf
Далее создадим симлинк на файл /etc/nginx/sites-available/mysite.conf в директории /etc/nginx/sites-enabled
Для чего симлинк? Все просто — это удобный способ быстро включать и выключать виртуальные серверы, ведь в файле /etc/nginx/nginx.conf мы прописали такую директиву:
include /etc/nginx/sites-enabled/*;
В соответствии с ней Nginx будет считывать любые конфигурационные файлы в каталоге /etc/nginx/sites-enabled, а там у нас просто симлинки на нужные файлы из /etc/nginx/sites-available
Создаем:
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/100-mysite.conf
Проверим:
# ls -l /etc/nginx/sites-enabled total 0 lrwxrwxrwx 1 root root 38 Jul 29 14:07 100-mysite.conf -> /etc/nginx/sites-available/mysite.conf
Теперь создадим директорию для нашего сайта, то что мы указали в директиве root в файле /etc/nginx/sites-available/mysite.conf:
mkdir -p /var/www/mysite.org
Создадим простой php-файл:
(cat<<-EOF <?php phpinfo(); ?> EOF )>/var/www/mysite.org/index.php
Установим владельца и права на директорию и все файлы в ней. Обратите внимание, что мы устанавливаем владельцем каталога и файлов пользователя nginx и группу nginx, это не просто так. Дело в том, что Nginx у нас запущен с правами пользователя nginx, процесс Nginx должен иметь доступ на чтение в директорию виртуального сервера. Далее, наш единственный PHP-FPM пул www так же запущен от имени пользователя nginx (директива user и group в файле /etc/php/8.2/fpm/pool.d/www.conf). В принципе пул PHP-FPM не обязательно должен запускаться из под того же пользователя их под которого работает Nginx, для него может быть создан отдельный пользователь и группа и это самый правильный вариант, но процесс Nginx должны иметь доступ на чтение-запись к unix-сокету (если используется соединение через сокеты) нужного пула PHP-FPM — это важное условие. Но мы пока ограничимся работай пула PHP-FPM от того же пользователя от которого работает Nginx, если обратите внимание, то в файле /etc/php/8.2/fpm/pool.d/www.conf есть директивы listen.owner и listen.group — это как раз директивы задающие кто будет владельцем сокета и там у нас указан пользователь nginx.
Задаем права и владельца:
chown -R nginx:nginx /var/www chmod -R 775 /var/www
После этого проверяем конфигурацию Nginx:
nginx -t
Если ошибок нет, то перезагружаем конфигурацию Nginx:
nginx -s reload
Предполагается, что на нашем сервере межсетевой экран отключен или нет никаких ограничений на подключение извне. Не забудьте в этом убедиться, т.к. в противном случае подключения на 80-й порт могут блокироваться им и мы не сможем открыть наш сайт.
Проверим межсетевой экран (iptables):
iptables -nvL
Результат:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Во всех цепочках стоит ACCEPT, запретов нет.
Все готово к проверке сайта через web-браузер. Открываем наш сайт mysite.org в браузере, перед Вами должна появиться стандартная страница информации о PHP.
Если у Вас эта страница не появилась, то в зависимости от кода ошибки нужно либо проверять настройки сервера, либо смотреть лог ошибок Nginx.
Если Вы использовали мой файл конфигурации nginx.conf, то лог ошибок Nginx находится в файле /var/log/nginx/error.log
Если у Вас свой файл nginx.conf, то проверьте путь к логу командой:
cat /etc/nginx/nginx.conf | grep error_log
Если директива error_log не указана в nginx.conf, то ее можно указать непосредственно в файле виртуального сервера для нашего сайта, в файле /etc/nginx/sites-available/mysite.conf, например так:
error_log /var/log/nginx/mysite_error.log;
После этого не забудьте проверить и перезагрузить конфигурацию Nginx:
nginx -t && nginx -s reload
На этом базовая настройка Nginx + PHP-FPM завершена, до скорых встреч.
Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, POstgreSQL) на протяжении последних 24 лет.
Добрый день. Спасибо за статью. Подскажите, пожалуйста, что в данной конструкции делают квадратные скобки [p]:
ps -ef |grep «[p]hp-fpm: pool»
Квадратные скобки с 1 символом (в данном случае — p) означают, что в данной позиции может находиться только этот один символ, таким образом при выводе списка процессов через ps мы исключим вывод самого себя Пример без скобок в котором первой строкой выводится запуск grep # ps -ef |grep "php-fpm: pool" root 7731 7715 0 19:17 pts/0 00:00:00 grep php-fpm: pool web3 9537 22083 0 00:48 ? 00:00:12 php-fpm: pool web3 web5 11039 22083 0 Oct10 ? 00:00:32 php-fpm: pool web5 А это уже со скобками # ps -ef |grep "[p]hp-fpm: pool" web3 9537 22083 0 00:48 ? 00:00:12 php-fpm: pool… Подробнее »
Брат давай еще базу данных создадим? С phpmyadmin ))
Спасибо за статью!
Поправьте пожалуйста ссылки :
— как Nginx обрабатывает входящие соединения.
— рекомендованный вариант в документации Nginx
сейчас там заглушки «#».
Пожалуйста! # в ссылках это не заглушка, если кликните по ссылке как обычно, то все нормально откроется в новом окне
docker? не, не слышал
Ставьте через докер, но данная статья про метод установки через пакетный менеджер