Версии PHP от Remi являются самыми популярными и стабильными при использовании на Web серверах. Расскажу основные моменты работы с репозиторием. Рассмотрим как сменить версию PHP. Один из самых популярных репозиториев для CentOS.

Введение

Есть замечательный человек Remi Collet, который создал репозиторий пользующийся огромной популярностью у пользователей операционной системы CentOS. Познакомится с новостями репозитория можно на блоге Remi Collet.

Les RPM de Remi repository поддерживает последние версии MySQL и PHP (бэкпорты федоровских rpm). Пакеты этого репозитория необходимо использовать с осторожностью, так как они заменяют базовые пакеты.

В другой статье вы можете узнать как использовать репозиторий WebtaticEL для CentOS 7. В нем так же используются последние версии PHP, но к сожалению там нет многих удобств которые есть у Remi. Например, используя репозиторий Remi можно всегда иметь последнюю версию phpMyAdmin.

Установка PHP от Remi для CentOS 7

Перед началом использования репозитория Remi необходимо подключить репозиторий Epel созданный группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

Установка Epel в CetnOS 7 производится командой:

yum -y install epel-release

Для установки репозитория Remi в CentOS 7 достаточно выполнить команду:

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Посмотреть активные репозитории можно следующей командой:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.corbina.net
 * epel: mirror.logol.ru
 * extras: mirror.reconn.ru
 * remi-safe: mirror.reconn.ru
 * updates: mirror.corbina.net   
remi-safe    Safe Remi's RPM repository for Enterprise Linux 7 - x86_64     3 144

По умолчанию установлен репозиторий remi-safe который имеет только дополнительные пакеты для базового хранилища и коллекций программного обеспечения.

Например, при попытке установить phpMyAdmin будет установлена старая версии. Для установки последних версий надо активировать репозиторий remi.

Посмотрим репозитории что у нас есть в системе выполнив команду:

ls /etc/yum.repos.d/ -l
итого 92
-rw-r--r-- 1 root root 1664 ноя 23 16:16 CentOS-Base.repo
-rw-r--r-- 1 root root 1309 ноя 23 16:16 CentOS-CR.repo
-rw-r--r-- 1 root root 649 ноя 23 16:16 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root 314 ноя 23 16:16 CentOS-fasttrack.repo
-rw-r--r-- 1 root root 630 ноя 23 16:16 CentOS-Media.repo
-rw-r--r-- 1 root root 1331 ноя 23 16:16 CentOS-Sources.repo
-rw-r--r-- 1 root root 5701 ноя 23 16:16 CentOS-Vault.repo
-rw-r--r-- 1 root root 951 окт 2 2017 epel.repo
-rw-r--r-- 1 root root 1050 окт 2 2017 epel-testing.repo
-rw-r--r-- 1 root root 261 фев 8 15:23 mariadb.repo
-rw-r--r-- 1 root root 113 июл 15 2014 nginx.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi91.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi92.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi93.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi94.repo
-rw-r--r-- 1 root root 456 дек 21 20:50 remi-php54.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php70.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php71.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php72.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php73.repo
-rw-r--r-- 1 root root 2605 дек 21 20:50 remi.repo
-rw-r--r-- 1 root root 750 дек 21 20:50 remi-safe.repo

Надеюсь, вы заметили что есть репозитории glpi.

GLPI — это программный инструмент ITSM, который помогает вам легко планировать и управлять изменениями в ИТ структуре предприятия, эффективно решать возникающие проблемы используя систему заявок, так же позволяет вам получить контроль над ИТ-бюджетом и расходами вашей компании. В будущем я расскажу как работать с этим замечательным проектом. Кроме того, то что Remi Collet поддерживает репозиторий меня очень радует.

Перед работой с репозиториями Remi необходимо установите пакет yum-utils, что бы не получать ошибку «bash: yum-config-manager: command not found».  Установим yum-utils выполнив необходимую команду:

yum install yum-utils

Сейчас у нас активирован remi-safe. Для активации remi надо вначале отключить remi-safe а потом активировать remi выполнив команды:

yum-config-manager --disable remi-safe
yum-config-manager --enable remi

Перед тем как определится какую версию PHP использовать я всегда смотрю на сайте Supported Versions PHP.

Support PHP

В списке имеющихся репозиториев нет версии php5.6, так как он входит в состав remi.repo. Для установки достаточно в команде указать remi-php56.

Установка версии PHP7.2 от Remi

Активируем репу remi-php72, для этого выполняем команду:

# yum-config-manager --enable remi-php72

Устанавливаем php7.2 выполнив команду:

yum install php72

Лучше указывать php72 и тогда пакеты будут установлены только из репозитория remi. Например, я всегда внимательно смотрю какая версия php будет установлена в списке устанавливаемых пакетов.

Установим php-fpm и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap

Проверим установленную версию выполнив команду в консоли сервера:

php -v
= вывод команды =
PHP 7.2.16 (cli) (built: Mar 5 2019 14:45:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.16, Copyright (c) 1999-2018, by Zend Technologies

Внесем необходимые изменения в файл настроек php.ini:

vim /etc/php.ini
= необходимые изменения = 
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Настройка Php-fpm для Nginx

Для того чтобы связать nginx и php будем использовать мост php-fpm. Основной файл настройки находится по пути /etc/php-fpm.conf и там должен быть параметр include=/etc/php-fpm.d/*.conf говорящий о том где лежат настройки пулов.

Запускаем php-fpm и добавляем в автозагрузку:

systemctl start php-fpm
systemctl enable php-fpm

Проверяем, запустился ли он.

netstat -tulpn | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 9084/php-fpm: maste

Все в порядке, работает на 9000 порту.

Использовать порт или сокет решать вам, но говорят что сокет использовать лучше. Запустим php-fpm через unix сокет. Для этого копируем конфиг /etc/php-fpm.d/www.conf и приводим к следующему виду:

cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_orig
vim /etc/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx
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
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

slowlog = /var/log/php-fpm/www-slow.log

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M
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
;php_value[opcache.file_cache]  = /var/lib/php/opcache

Вы можете для каждого сайта созать свой пул и указать там все необходимые параметры. Например, для каждого сайта я создаю свой пул для гибкости настройки и благодаря этому я настраиваю корректный доступ к файлам по sftp.

Перезапускаем php-fpm командой:

systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет.

ll /run/php-fpm/php-fpm.sock 
srw-rw---- 1 nginx nginx 0 фев 13 10:35 /run/php-fpm/php-fpm.sock

Посмотрим статус 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 Ср 2019-03-13 20:08:21 MSK; 32s ago
Main PID: 1097 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /lxc/php7-lxc/system.slice/php-fpm.service
├─1097 php-fpm: master process (/etc/php-fpm.conf)
├─1098 php-fpm: pool www
├─1099 php-fpm: pool www
├─1100 php-fpm: pool www
├─1101 php-fpm: pool www
└─1102 php-fpm: pool www

мар 13 20:08:20 php7-lxc-lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
мар 13 20:08:21 php7-lxc-lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно, что сервис работает правильно и имеется один пул www.

В настройках nginx для сайта необходимо указать требуемый пул. Например, прописать код fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; в секции location ~ \.php$

Обновление версий PHP от Remi

Обновление состоит из нескольких действий:

  • Остановка php-fpm,
  • Вывод и удаление всех имеющихся пакетов php,
  • Удаление старого и активирование нового репозитория требуемой версии php,
  • Установка новой версии,
  • Проверка настрое из старой версии,
  • Запуск php-fpm и проверка сервиса.

Используя вышеизложеный план выполним обновление PHP до версии 7.3.

Останавливаем php-fpm командой:

systemctl stop php-fpm

Выводим список всех установленных пакетов php:

rpm -qa | grep php
= вывод команды =
php-json-7.2.16-1.el7.remi.x86_64
php-process-7.2.16-1.el7.remi.x86_64
php-odbc-7.2.16-1.el7.remi.x86_64
php-soap-7.2.16-1.el7.remi.x86_64
php-fpm-7.2.16-1.el7.remi.x86_64
php-xml-7.2.16-1.el7.remi.x86_64
php-xmlrpc-7.2.16-1.el7.remi.x86_64
php-pecl-memcache-3.0.9-0.9.20170802.e702b5f.el7.remi.7.2.x86_64
php-gd-7.2.16-1.el7.remi.x86_64
php-mbstring-7.2.16-1.el7.remi.x86_64
php-pdo-7.2.16-1.el7.remi.x86_64
php-pear-1.10.8-1.el7.remi.noarch
php-snmp-7.2.16-1.el7.remi.x86_64
php-opcache-7.2.16-1.el7.remi.x86_64
php-ldap-7.2.16-1.el7.remi.x86_64
php-common-7.2.16-1.el7.remi.x86_64
php-cli-7.2.16-1.el7.remi.x86_64
php-7.2.16-1.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.remi.noarch
php-mysqlnd-7.2.16-1.el7.remi.x86_64
php-pecl-zip-1.15.4-1.el7.remi.7.2.x86_64
php-imap-7.2.16-1.el7.remi.x86_6

Произведём удаление всех выведенных пакетов необходимой командой:

yum remove php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

Внимательно смотрим вывод команды при удалении! В выводе вы должны увидеть примерно такие строки:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave

предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

Удалим старый репозиторий php7.2 и установим новый php7.3 выполнив команды:

yum-config-manager --disable remi-php72
yum-config-manager --enable remi-php73

Проверяем правильность установки нужного репозитория выполнив команду:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.sale-dedic.com
* epel: mirrors.colocall.net
* extras: mirror.sale-dedic.com
* remi: mirror.23media.de
* remi-php73: mirror.23media.de
* updates: centos-mirror.rbc.ru
remi-php73 Remi's PHP 7.2 RPM repository for Enterprise Linux 7 - x86_64   362

Устанавливаени пакеты аналогичные удаленным:

yum install php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

Обезательно смотрим версию и репозиторий откуда будут ставится пакеты.

Осталось проверить файлы что выдала команда при удалении старой версии php:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave
предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

В заключение, запустим сервис php-fpm и проверим статус:

systemctl start php-fpm
systemctl status php-fpm
 php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since Ср 2019-03-13 21:16:12 MSK; 7s ago
Main PID: 1392 (php-fpm)
Status: "Ready to handle connections"
CGroup: /lxc/php7-lxc/system.slice/php-fpm.service
├─1392 php-fpm: master process (/etc/php-fpm.conf)
├─1393 php-fpm: pool www
├─1394 php-fpm: pool www
├─1395 php-fpm: pool www
├─1396 php-fpm: pool www
└─1397 php-fpm: pool www

мар 13 21:16:11 php7-lxc-lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
мар 13 21:16:12 php7-lxc-lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно что сервис не стартует при загрузке. Добавим сервис в автозагрузку выполнив команду:

systemctl enable php-fpm

Вывод

В статье рассказано про основные моменты работы с репозиторием Remi Collet. Репозиторий активно обновляется и мой выбор остановился на использовании именно его при работе с PHP.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделитесь ей с друзьями!

Похожие по теме записи

Пожалуйста, оставляйте свои комментарии

Мне это важно, так как получая обратную связь я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем.

18 комментариев для статьи “PHP от Remi для CentOS 7

  1. Раньше стояли старенькие версии Nginx и PHP-FPM из репозитория Epel-Release. Обновился и вот проблема — на сайте в кодировке windows-1251 перестали корректно отображаться все буквы. В конфигурационном файле для данного сайта в директиве Server прописал «charset windows-1251;» как было и раньше — не помогло. Что делать?

    1. Может проще будет сделать перекодировку базе данных? Все что неправильно отображается берется из базы данных?

      1. Базы данных вообще нет) Просто создаю страничку index.html в кодировке windows-1251, прописываю в ней тег и текст на русском. Вешаю ее на домен, в файле этотдомен.conf в директиве Server прописываю charset windows-1251, перезапускаю Nginx и вижу кракозябы. Меняю все на UTF-8 — отображается правильно. А вот на прошлых версиях Nginx 1.12 и PHP-FPM 5.4 работало прекрасно. Может еще где что-то нужно прописать?

        И еще попутный вопросик, раз уж я здесь. У меня на сервере несколько сайтов. Файл default.conf я не редактировал — в нем прописано просто «listen 80». В остальных же *.conf файлах я прописал «listen IP:80» (то есть IP своего сервера). Все работает, все открывается как положено, но — когда в строке браузера указываю просто свой IP, то открывается первый по алфавиту один из моих сайтов.
        Мне это не нравится — я хочу, чтобы при обращении к серверу просто по IP открывалась стандартная заглушка Nginx из файла defaul.conf. Если в файле defaul.conf я прописываю как и везде «listen IP:80» — не помогает. Если во всех других *.conf файлах убираю IP и оставляю просто «listen 80» — сайты вообще не открываются. Подскажите, пожалуйста, как сделать, что по обращению к серверу просто по IP срабатывал default.conf?

        1. «Меняю все на UTF-8 – отображается правильно» вот так и делайте. В кодировке windows-1251 практически никто не делает уже. Думаю можно настроить и с этой кодировкой, но тут я Вам не подскажу.

          По поводу обращения по IP к серверу что бы открывалась нужная Вам страница.
          В файле defaul.conf.
          listen 80; — мне нравится указывать без ip
          server_name localhost; — это говарит о том что когда будет запрос по ip откроется файл что указан в пути

          location / {
          root /usr/share/nginx/html;
          — вот этот путь.
          index index.html index.htm;
          }

          Для всех других ресурсов создаются свои конфигурации по типу

          listen 80;
          server_name forum.mageia.org.ru http://www.forum.mageia.org.ru;

          location / {
          root /var/www/sites/forum.mageia.org.ru/www;
          — это путь до нужного сайта
          index index.html index.htm;
          }

          Грубо говоря идентификация ресурса идет по строчке server_name.

          1. Строка «server_name localhost» в файле default.conf присутствовала по-умолчанию, я попробовал оставить везде только listen 80 — то есть без указания IP и все равно не помогло, при переходе из браузера по IP открывался один из сайтов.

            В итоге я дописал IP в директиве server_name localhost через пробел и, о чудо, наконец стала срабатывать стандартная заглушка Nginx, а другие сайты продолжили нормально работать.

            1. Надо смотреть что прописано в конфигурации того файла что открывается по ip. То что сделали работать будет, но это кривой вариант работы. Можете дать конфигурацию того сайта что открывается по ip?

          2. Да, пожалуйста — вот мой шедевральный конфиг (полный минимализм, сайт статический с небольшими php-скриптами кое-где, SSL нет и в помине, логи отключены, все несуществующие ссылки ведут на главную с ответом 200):

            server {
            listen 80;
            server_name mysite.ru www.mysite.ru;
            root /path/to/mysite/;
            index index.php;
            charset utf-8;

            location / {
            try_files $uri $uri/ /index.php;
            }

            location ~* \.php$ {
            try_files $uri /index.php;
            fastcgi_param SCRIPT_FILENAME /path/to/mysite$fastcgi_script_name;
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            include /etc/nginx/fastcgi_params;
            }

            location ~* \.(jpeg|jpg|gif|png|ico)$ {
            try_files $uri /index.php;
            expires max;
            }

            }

            1. server_name mysite.ru http:// http://www.mysite.ru; — http:// лишние. Остальное вроде всё правильно.
              Можно еще конфиг default.conf?

          3. http:// там нет — это ваша форма ответа подставляет перед www. А вот мой default.conf, каким я его сделал сейчас — если убрать IP адрес из server_name, то все возвращается на круги своя и я вновь вижу открытие сайта по введению IP в адресную строку браузера:

            server {
            listen 80;
            server_name 111.222.333.444 localhost;

            location / {
            return 403;
            }

            }

            1. Хм… Оказывается надо оборачивать код в code и тогда все правильно получается. Решу со временем эту проблему.

              Попробуйте такой код:
              server {
              listen 80;
              server_name localhost;

              location / {
              root /usr/share/nginx/html;
              index index.html index.htm;
              }
              }

              1. Сева, я наконец-то решил проблему! Ответ вот здесь: https://nginx.org/ru/docs/http/request_processing.html

                Теперь мой default.conf выглядит вот так:

                server {
                	listen		80 default_server;
                	server_name	"" localhost;
                
                	location / {
                		return 444;
                	}
                
                }

                При такой конфигурации ничего не отдается ни по IP адресу, ни даже по обратной PTR-записи для данного IP адреса (домен, который хостер присваивает IP по-умолчанию). На сайт теперь можно попасть только прямо указав название домена.

          4. Привет! Такой был по дефолту — не работает. В общем, пока я не добавил IP в строку server_name, продолжал открываться один из сайтов.

            Сева, еще попутный вопросик появился, в access log своего сайта заметил вот такое:

            223.166.75.101 - - [19/Jul/2019:19:41:37 +0300] "GET http://www.123cha.com/ HTTP/1.1" 200 1826 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"

            У меня домен вовсе не http://www.123cha.com и никакого отношения к нему не имеет — откуда появляются такие записи в логах? Ответ моего сервера то 200, то 499 в этих случаях.

            1. Странно как то это что по дефолту не работает. Система CentOS7 и Nginx ставили с их репозитория?

              По логу не отвечу. Запись действительно странная.

              1. CentOS ставил из образа, который сам провайдер VPS предлагает (в VMmanager просто выбрал операционку из списка и она установилась без всяких вопросов). Nginx 1.16.0 и PHP-FPM 7.3.7 по вашей инструкции — первый из официального, второй из Remi. Другого софта не ставил.

                Думаете лучше было CentOS из собственного iso файла устанавливать и настраивать сеть в ручную?

                1. Что это за шаблон установки от хостера и какого он качества для меня всегда загадка. На практике знаю что там очень часто любят вырезать некоторые вещи и добавлять какие то свои скрипты. Когда хостер позволяет устанавливать систему из своего ISO образа я всегда этим пользуюсь. Большинство статей пишут основываясь на настройках с учетом использования родного iso образа разработчика. Если хотите меньше сюрпризов работайте с образами разработчиков.

  2. Здравствуйте! Спасибо за пошаговый мануал.

    В качестве пожелания хотелось бы видеть у Вас на сайте статьи по настройке веб-сервера с применением связки apache+nginx на centOS7, где первый за бекенд отвечает, второй — за фронт.
    И статью бы по настройке подобного на FreeBSD.
    Подобного при беглом поиске не нашёл. В лучшем случае инфа есть но уже устарела. В современном окружении и с различием версий разных служб и приложений могут быть проблемы, где без опыта уже не обойтись 🙂

    1. Спасибо за комментарий. Статья про настройку связки apache+nginx на centOS7 уже есть в черновиках, но когда опубликую сказать не могу. Выпускать урезанную статью нет желания а ответов на все нюансы я пока не нашел. Про FreeBSD можно посмотреть тут https://serveradmin.ru/freebsd-nastroyka-php-fpm-i-nginx/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *