Установка и настройка PHP 7.4 на CentOS 7 в связке с Nginx

Продолжаем настраивать наш сервер с CentOS 7. И на этот раз установим PHP 7.4 (PHP-FPM) и настроим его работу в связке с Nginx.

Детали под катом.

Исходные данные: CentOS 7, Nginx 1.21.x
Задача: Установить и настроить PHP-FPM 7.4 для домена mysite.org

Предполагается, то Nginx у Вас уже установлен и настроен в базовом варианте. Если это не так, то можете воспользоваться моей статьей.

1. Установим сторонний репозитарий EPEL и Remi, где есть все нужные и свежие версии PHP

yum install -y yum-utils
yum localinstall https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum localinstall https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum makecache fast

2. Проверим какие пакеты PHP 7.4 нам доступны

yum search php7

Список будет достаточно внушительным, мы выберем базовый необходимый набор и установим.

3. Установка PHP 7.4

yum install -y php-cli php-fpm php-common php-curl php-gd php-imap php-intl php-mbstring php-xml php-zip php-bz2 php-bcmath php-json php-opcache php-devel php-mysqlnd

Найдем где располагается файл конфигурации по умолчанию, стоит заметить, что это файл относиться к cli (консольной) версии PHP, для PHP-FPM файл будет другой.

php --ini | grep "Loaded Configuration File"

Результат:

Loaded Configuration File:         /etc/php.ini

То есть для cli (консольной) версии PHP файл конфигурации /etc/php.ini

Основной файл конфигурации PHP-FPM будет /etc/php-fpm.conf
Основной каталог в котором будут храниться конфигурация пулов PHP-FPM будет /etc/php-fpm.d, файлы конфигурации пулов должны иметь расширение *.conf

Запустим PHP-FPM:

systemctl enable --now  php-fpm

Проверим статут PHP-FPM:

# systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-07-10 15:05:58 EDT; 2s ago
 Main PID: 24053 (php-fpm)
   Status: "Ready to handle connections"
   CGroup: /system.slice/php-fpm.service
           ├─24053 php-fpm: master process (/etc/php-fpm.conf)
           ├─24054 php-fpm: pool www
           ├─24055 php-fpm: pool www
           ├─24056 php-fpm: pool www
           ├─24057 php-fpm: pool www
           └─24058 php-fpm: pool www

Jul 10 15:05:57 myserver systemd[1]: Starting The PHP FastCGI Process Manager...
Jul 10 15:05:58 myserver systemd[1]: Started The PHP FastCGI Process Manager.

4. Настройка Nginx и PHP-FPM

Чтобы посмотреть список запущенных пулов можно воспользоваться командой

systemctl status php-fpm

или

ps -ef |grep "[p]hp-fpm: pool"

При первоначальной установке у нас создается 1 пул — www, как я говорил выше, конфигурация пулов находится в каталоге /etc/php-fpm.d
Для пула www создался файл конфигурации /etc/php-fpm.d/www.conf

Выведем его конфигурацию без комментариев:

cat /etc/php-fpm.d/www.conf | egrep -Ev "^\s*(;|#|$)"

Результат:

[www]
user = apache
group = apache
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Как можно заметить по настройкам, пользователь и группа от имени которой работает пул www — это apache

И для нас это неправильно, ведь у нас Nginx и работает он под пользователем nginx. Исправим пользователя в файле /etc/php-fpm.d/www.conf

sed -i "s/user = apache/user = nginx/g" /etc/php-fpm.d/www.conf
sed -i "s/group = apache/group = nginx/g" /etc/php-fpm.d/www.conf

Перезапустим PHP-FPM:

systemctl restart php-fpm

Проверим список запущенyых пулов:

ps -ef |grep "[p]hp-fpm: pool"

Результат

nginx    24376 24375  0 15:14 ?        00:00:00 php-fpm: pool www
nginx    24377 24375  0 15:14 ?        00:00:00 php-fpm: pool www
nginx    24378 24375  0 15:14 ?        00:00:00 php-fpm: pool www
nginx    24379 24375  0 15:14 ?        00:00:00 php-fpm: pool www
nginx    24380 24375  0 15:14 ?        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 адрес будет 195.56.56.10 (в реальности у Вас конечно будет настоящий IP адрес).

Создадим файл виртуального сервера для Nginx, он почти один в один повторяет рекомендованный вариант в документации Nginx. Единственное, что мы в нем добавили свое, это IP адрес (директива listen), имя домена (директива server_name), директория сайта (директива root) и путь до сокета PHP-FPM (директива fastcgi_pass, она соответствует адресу и порту в директиве listen из файла /etc/php-fpm.d/www.conf):

(cat<<-EOF
server {
    listen      195.56.56.10: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  127.0.0.1:9000;
        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 47 Jul 10 15:24 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-fpm.d/www.conf). В принципе пул PHP-FPM не обязательно должен запускаться из под того же пользователя их под которого работает Nginx, для него может быть создан отдельный пользователь и группа и это самый правильный вариант, но процесс Nginx должны иметь доступ на чтение-запись к unix-сокету (если используется соединение через сокеты) нужного пула PHP-FPM — это важное условие. Но мы пока ограничимся работай пула PHP-FPM от того же пользователя от которого работает 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 завершена, до скорых встреч.

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


Оставить комментарий

avatar
1000

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  Подписаться  
Уведомление о