Как известно в Debian 10 по умолчанию идет лишь PHP версии 7.3, а что делать если нам нужен более новый, скажем PHP версии 7.4 или 8.0 ?
Ниже мы рассмотрим как быстро установить и настроить связку Nginx + PHP-FPM 7.4
Исходные данные: Debian 10 (buster), Nginx 1.21.x
Задача: Установить и настроить PHP-FPM 7.4 для домена mysite.org
Предполагается, то Nginx у Вас уже установлен и настроен в базовом варианте. Если это не так, то можете воспользоваться моей статьей.
1. Установим сторонний репозитарий, где есть все нужные и свежие версии PHP:
apt-get install -y ca-certificates apt-transport-https wget |
wget --quiet -O - https://packages.sury.org/php/apt.gpg | apt-key add - |
echo "deb https://packages.sury.org/php/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/php.list |
2. Проверим какие пакеты PHP 7.4 нам доступны:
Список будет достаточно внушительным, мы выберем базовый необходимый набор и установим.
3. Установка PHP:
apt-get install -y php7.4 php7.4-cli php7.4-fpm php7.4-opcache php7.4-curl php7.4-mbstring php7.4-zip php7.4-xml |
Найдем где располагается файл конфигурации по умолчанию, стоит заметить, что это файл относиться к cli (консольной) версии PHP, для PHP-FPM файл будет другой.
php --ini | grep "Loaded Configuration File" |
Результат:
Loaded Configuration File: /etc/php/7.4/cli/php.ini |
То есть для cli (консольной) версии PHP файл конфигурации /etc/php/7.4/cli/php.ini
Забегая вперед скажу, что для FPM файл конфигурации PHP будет /etc/php/7.4/fpm/php.ini
Основной файл конфигурации PHP-FPM будет /etc/php/7.4/fpm/php-fpm.conf
Основной каталог в котором будут храниться конфигурация пулов PHP-FPM будет /etc/php/7.4/fpm/pool.d, файлы конфигурации пулов должны иметь расширение *.conf
Проверим статут PHP-FPM:
● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager |
Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled) |
Active: active (running) since Wed 2021-05-26 21:11:32 CEST; 3min 13s ago |
Process: 8469 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, stat |
Main PID: 8466 (php-fpm7.4) |
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" |
CGroup: /system.slice/php7.4-fpm.service |
├─8466 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf) |
May 26 20:59:50 myserver systemd[1]: Starting The PHP 7.4 FastCGI Process Manager... |
May 26 20:59:50 myserver systemd[1]: Started The PHP 7.4 FastCGI Process Manager. |
Настроим автоматический запуск PHP-FPM при старте сервера:
systemctl enable php7.4-fpm |
4. Настройка Nginx и PHP-FPM:
Чтобы посмотреть список запущенных пулов можно воспользоваться командой
systemctl status php7.4-fpm |
или
ps -ef | grep "[p]hp-fpm: pool" |
При первоначальной установке у нас создается 1 пул — www, как я говорил выше, конфигурация пулов находится в каталоге /etc/php/7.4/fpm/pool.d
Для пула www создался файл конфигурации /etc/php/7.4/fpm/pool.d/www.conf
Выведем его конфигурацию без комментариев:
cat /etc/php/7.4/fpm/pool.d/www.conf | egrep -Ev "^\s*(;|#|$)" |
Результат:
listen = /run/php/php7.4-fpm.sock |
Детальное описание каждой директивы можно почитать в официальной документации тут.
Теперь нам нужно подключить использование PHP-FPM для обработки запросов к PHP-файлов в Nginx.
При установке Nginx в нашей прошло статье мы уже зашли по http на страницу по умолчанию, мы увидели там надпись «Welcome to nginx!», так же Вы должны были освоить как Nginx обрабатывает входящие соединения.
Теперь давайте сконфигурируем простой сайт на PHP, например у нас есть зарегистрированный домен mysite.org, Вы сконфигурировали в DNS для него запись типа A указывающую на IP адрес Вашего сервера на котором и установлен Nginx, пусть IP адрес будет 195.56.56.10 (в реальности у Вас конечно будет настоящий IP адрес).
Создадим файл виртуального сервера для Nginx, он почти один в один повторяет рекомендованный вариант в документации Nginx. Единственное, что мы в нем добавили свое, это IP адрес (директива listen), имя домена (директива server_name), директория сайта (директива root) и путь до сокета PHP-FPM (директива fastcgi_pass, она соответствует сокету в директиве listen из файла /etc/php/7.4/fpm/pool.d/www.conf):
server_name mysite.org www.mysite.org; |
root /var/www/mysite.org; |
index index.html index.php; |
location ~* \.(gif|jpg|png)$ { |
fastcgi_pass unix:/run/php/php7.4-fpm.sock; |
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; |
)>/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 |
Проверим:
lrwxrwxrwx 1 root root 38 May 26 21:03 100-mysite.conf -> /etc/nginx/sites-available/mysite.conf |
Теперь создадим директорию для нашего сайта, то что мы указали в директиве root в файле /etc/nginx/sites-available/mysite.conf:
mkdir -p /var/www/mysite.org |
Создадим простой php-файл:
)>/var/www/mysite.org/index.php |
Установим владельца и права на директорию и все файлы в ней. Обратите внимание, что мы устанавливаем владельцем каталога и файлов пользователя www-data и группу www-data, это не просто так. Дело в том, что Nginx у нас запущен с правами пользователя www-data, процесс Nginx должен иметь доступ на чтение в директорию виртуального сервера. Далее, наш единственный PHP-FPM пул www так же запущен от имени пользователя www-data (директива user и group в файле /etc/php/7.4/fpm/pool.d/www.conf), права на сокет /run/php/php7.4-fpm.sock имеют группа www-data и пользователь-владелец www-data (директивы listen.owner и listen.group в файле /etc/php/7.4/fpm/pool.d/www.conf). В принципе пул PHP-FPM не обязательно должен запускаться из под того же пользователя их под которого работает Nginx, для него может быть создан отдельный пользователь и группа и это самый правильный вариант, но процесс Nginx должны иметь доступ на чтение-запись к unix-сокету нужного пула PHP-FPM — это важное условие. Но мы пока ограничимся работай пула PHP-FPM от того же пользователя от которого работает Nginx.
Задаем права и владельца:
chown -R www-data:www-data /var/www |
После этого проверяем конфигурацию Nginx:
Если ошибок нет, то перезагружаем конфигурацию Nginx:
Предполагается, что на нашем сервере межсетевой экран отключен или нет никаких ограничений на подключение извне. Не забудьте в этом убедиться, т.к. в противном случае подключения на 80-й порт могут блокироваться им и мы не сможем открыть наш сайт.
Проверим межсетевой экран (iptables):
Результат:
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 лет.
Спасибо за мануал, все заработало с 1го раза :)
спасибо за статьи, все доходчиво и понятно, но… при обращении к сайту тупо скачивается index.php
делаю по вашим мануалам, проверяю, все так,
3 дня мучаюсь, какие только варианты не перепробовал — бесполезно
может посоветуете чтото или что-где проверить еще?
Debian 10
php-fpm7.3
…уточнение, сейчас отображается страница приветствия NGINX,
чтото неверно интерпретируется обработчиком :(
Добрый день, если скачивается php-файл — это значит что nginx не передает обработку на php-fpm, проверяйте настройки location
А если видите страницу приветствия nginx, то скорее всего запрос ушел не на тот виртуальный сервер, проверяйте listen и server_name и читайте https://nginx.org/ru/docs/http/request_processing.html
в общем, много чего перепробовал, пока не изменил строчку вида в корневом location с
try_files $uri $uri/ index.php;
на
try_files $uri index.php;
хотя в дефолте строка выглядела вот так try_files $uri $uri/ =404;
больше в этом location ничего нет,
весь конфиг вот такой, может кому-то поможет
server {
listen 80;
server_name
"домен"
;
root /var/www/домен;
location / {
try_files $uri index.php;
}
location ~ \.php$ {
try_files $uri /index.php =404;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Все банально и просто, у вас не был задан параметр
index index.php index.html index.htm;
Наиболее простая и правильная конфигурация nginx c php-fpm будет такая:
https://gist.github.com/CHERTS/52ece2043b8285ab14d1dd3754d9aace
ok, попробую
Добрый день, спасибо за статью, у вас есть мануал для перехода с php7,3 на php7,4 apache?