четверг, 2 июля 2015 г.

Установка MariaDB + Nginx + PHP-FPM на CentOS 7 (Часть 3)

Продолжение статьи об установке MariaDB + Nginx + PHP-FPM на сервер под управлением CentOS 7. Предыдущие части: Часть 1, Часть 2.

В предыдущих двух статьях я рассказал каким образом я настраивают CentOS под себя, чтобы с ней было удобно работать, а так же описал установку сервера баз данных MariaDB. Теперь пришло время установить движки для обработки Web. В качестве Web-сервера я оставил выбор за NGINX. В качестве препроцессора - PHP-FPM. Но обо все по порядку. Сейчас подошло время для установки PHP.

 


Содержание:

  1. Проверка текущей версии CentOS
  2. Установка FTP сервера (vsFTPd)
  3. Создание пользователя с правами root
  4. Настройка строки приглашения
  5. Установка MariaDB (MySQL)
  6. Настройка MariaDB
  7. Установка PHP
  8. Настройка PHP-FPM
  9. Установка NGINX
  10. Ключ на старт...
  11. Послесловие

7. Установка PHP.

Продолжим свой путь "в ногу со временем" и установим PHP версии 5.6. Сейчас активно развивается репозитарий Remi (ссылка [3]). Кому интересно, могут посмотреть текущий список доступных репозитариев PHP по ссылке [4]. В любом случае, для установки пакета Remi PHP, понадобится установить Extra Packages for Enterprise Linux (EPEL, ссылка [1]). Полный список пакетов вы можете посмотреть по ссылке [2]. На момент установки была доступна версия EPEL http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm, Remi http://rpms.famillecollet.com/enterprise/remi-release-7.rpm. Так, вроде обо всем рассказал, все линки указал... Поехали.

[01:55 ebabenko@centos7 ~]$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
warning: /var/tmp/rpm-tmp.ajfbma: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:epel-release-7-5                 ################################# [100%]
[01:56 ebabenko@centos7 ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Retrieving http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
warning: /var/tmp/rpm-tmp.16Bmcg: Header V3 DSA/SHA1 Signature, key ID 00f97f56: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:remi-release-7.1-1.el7.remi      ################################# [100%]
[01:56 ebabenko@centos7 ~]$ sudo yum repolist
Loaded plugins: fastestmirror
epel/x86_64/metalink                                        |  25 kB  00:00:00
epel                                                        | 4.4 kB  00:00:00
remi-safe                                                   | 2.9 kB  00:00:00
(1/3): remi-safe/primary_db                                 |  69 kB  00:00:00
(2/3): epel/x86_64/group_gz                                 | 169 kB  00:00:00
(3/3): epel/x86_64/primary_db                               | 3.6 MB  00:00:01
(1/2): epel/x86_64/updateinfo                               | 415 kB  00:00:00
(2/2): epel/x86_64/pkgtags                                  | 1.6 MB  00:00:00
Loading mirror speeds from cached hostfile
 * base: mirrors-ru.go-parts.com
 * epel: fedora-mirror01.rbc.ru
 * extras: mirrors-ru.go-parts.com
 * remi-safe: mirror.h1host.ru
 * updates: mirrors-ru.go-parts.com
repo id          repo name                                                   status
base/7/x86_64    CentOS-7 - Base                                             8,652
epel/x86_64      Extra Packages for Enterprise Linux 7 - x86_64              8,142
extras/7/x86_64  CentOS-7 - Extras                                             149
mariadb          MariaDB                                                        11
remi-safe        Safe Remi's RPM repository for Enterprise Linux 7 - x86_64    124
updates/7/x86_64 CentOS-7 - Updates                                            928
repolist: 18,006
[01:57 ebabenko@centos7 ~]$ ll /etc/yum.repos.d
total 44
-rw-r--r--. 1 root root 1664 Apr  1 01:27 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Apr  1 01:27 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Apr  1 01:27 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  290 Apr  1 01:27 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 1331 Apr  1 01:27 CentOS-Sources.repo
-rw-r--r--. 1 root root 1002 Apr  1 01:27 CentOS-Vault.repo
-rw-r--r--. 1 root root  957 Nov 25  2014 epel.repo
-rw-r--r--. 1 root root 1056 Nov 25  2014 epel-testing.repo
-rw-r--r--. 1 root root  135 Jul  1 01:11 MariaDB.repo
-rw-r--r--. 1 root root 2260 Jun  2 18:39 remi.repo
-rw-r--r--. 1 root root  449 Jun  2 18:39 remi-safe.repo
[01:58 ebabenko@centos7 ~]$ sudo vi /etc/yum.repos.d/remi.repo

Для того, чтобы установить PHP версии 5.6, требуется в разделе [remi] установить параметр enabled=1, а так же в нужном разделе php так же указать этот параметр. Для данной установки, я этот параметр указываю в разделе [remi-php56].

[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[...skipped...] [remi-php56]
name=Remi's PHP 5.6 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php56/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php56/mirror
# WARNING: If you enable this repository, you must also enable "remi"
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi [...skipped...]

Производим установку. Из списка, который я указал ниже, вы можете поставить только те, которые вам требуются, т.е. не просто скопировать командную строку, а выбрать те пакеты, с которыми вы будете работать (или будет работать тот Framework или CMS, который вы собираетесь использовать). Для данного контекста обязательными являются пакеты php-cli и php-fpm, все остальные опциональны. В любом случае "перегружать" PHP установленными пакетами я не рекомендую. При необходимости, вы всегда сможете доставить все то, что вам требуется. В прочем, и деинсталировать ненужные пакеты вы так же сможете, но об этом чаще всего просто забываешь.

[02:06 ebabenko@centos7 ~]$ sudo yum install php-cli php-fpm php-mysqli php-mcrypt

[...skipped...]

Install  4 Packages (+6 Dependent packages)

Total download size: 7.1 M
Installed size: 27 M
Is this ok [y/d/N]: y

[...skipped...]

Installed:
  php-cli.x86_64 0:5.6.10-1.el7.remi      php-fpm.x86_64 0:5.6.10-1.el7.remi
  php-mcrypt.x86_64 0:5.6.10-1.el7.remi   php-mysqlnd.x86_64 0:5.6.10-1.el7.remi

Dependency Installed:
  libmcrypt.x86_64 0:2.5.8-13.el7
  libtool-ltdl.x86_64 0:2.4.2-20.el7
  php-common.x86_64 0:5.6.10-1.el7.remi
  php-pdo.x86_64 0:5.6.10-1.el7.remi
  php-pecl-jsonc.x86_64 0:1.3.7-1.el7.remi.5.6
  php-pecl-zip.x86_64 0:1.12.5-1.el7.remi.5.6

Complete!

Установим таймзону, соответствующую региону, на котором будет работать сервер:

[02:11 ebabenko@centos7 ~]$ sudo vi /etc/php.ini
[...skipped...]

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Moscow"

[...skipped...]

Проверим, что получилось в итоге

[02:13 ebabenko@centos7 ~]$ php -v
PHP 5.6.10 (cli) (built: Jun 11 2015 07:45:02)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
[02:14 ebabenko@centos7 ~]$ php -m
[PHP Modules]
bz2
calendar
Core

[...skipped...]

[Zend Modules]

8. Настройка PHP-FPM.

Тут я уже буду описывать настройки, опираясь на собственный опыт и подобных настроек, по правде говоря, я не увидел ни у кого (во всяком случае не нашел и Google мне тут не помог). Не помню, под какой версией Linux я первый раз увидел подобную настройку NGINX, но суть такой реализации мне оказалась по душе. Смысл этих настроек заключался в том, что один сервер может содержать большое количество конфигураций, но загружаться будут только те, которые располагаются в определенной директории. Таким образом, в NGINX все конфигурации находились в директории sites-available, загружаемые - в директории sites-enabled. И чтобы загрузить какую-либо конфигурацию, достаточно прописать симлинк на существующий конфиг и перегрузить сервис NGINX. Создадим подобную структуру для загрузки конфигурация PHP-FPM. По умолчанию, FPM загружает все конфигурации, расположенные в директории /etc/php-fpm.d. Я же в ней создам директорию pool-available, где буду сохранять все возможные пулы, но запускаться будут только те, симлинки которых будут помещены в директорию pool-enabled. Существующий пул www.conf я перенесу с именем pool.example как эталон конфигурации, так как там описаны комментарии к параметрам настроек.

[02:29 ebabenko@centos7 ~]$ cd /etc/php-fpm.d
[02:36 ebabenko@centos7 /etc/php-fpm.d]$ ll
total 20
-rw-r--r--. 1 root root 18549 Jun 11 08:48 www.conf
[02:36 ebabenko@centos7 /etc/php-fpm.d]$ sudo mkdir pool-available pool-enabled
[02:37 ebabenko@centos7 /etc/php-fpm.d]$ ll
total 20
drwxr-xr-x. 2 root root     6 Jul  1 21:07 pool-available
drwxr-xr-x. 2 root root     6 Jul  1 21:07 pool-enabled
-rw-r--r--. 1 root root 18549 Jun 11 08:48 www.conf
[02:37 ebabenko@centos7 /etc/php-fpm.d]$ sudo mv www.conf pool-available/pool.example
[02:38 ebabenko@centos7 /etc/php-fpm.d]$ ll
total 0
drwxr-xr-x. 2 root root 25 Jul  1 21:08 pool-available
drwxr-xr-x. 2 root root  6 Jul  1 21:07 pool-enabled
[02:38 ebabenko@centos7 /etc/php-fpm.d]$ ll pool-available
total 20
-rw-r--r--. 1 root root 18549 Jun 11 08:48 pool.example

Директории созданы, шаблон конфигурации пула перенесен. Настроим основной конфигурационный файл.

[03:08 ebabenko@centos7 /etc/php-fpm.d]$ sudo vi /etc/php-fpm.conf

Настроечных параметров в файле достаточно много и каждый может их настроить под свои нужды, как кому требуется. Однако, я ограничусь тем, что:

  • укажу директорию и расширения файлов, которые будут загружаться. В моём случае это директория /etc/php-fpm.d/pool-enabled, загружаться будут все файлы с расширением conf;
  • укажу куда будут писаться логи ошибок мастер-процесса;
  • укажу механизм FPM. По умолчанию этот параметр закомментирован и система сама определяет какой процесс лучше выбрать. Однако, я укажу принудительно epol, указав что FPM работает под управлением OS Linux.
[...skipped...]

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
include=/etc/php-fpm.d/pool-enabled/*.conf

[...skipped...]

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Default Value: /var/log/php-fpm.log
error_log = /var/log/php-fpm/error.master.log

[...skipped...]

; Specify the event mechanism FPM will use. The following is available:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; Default Value: not set (auto detection)
events.mechanism = epoll

[...skipped...]

Создаем требуемые пулы. Согласно описанию в начале статьи, мне потребуется создать 2 пула: для общего сервиса и для пользовательского.

[03:14 ebabenko@centos7 /etc/php-fpm.d]$ cd pool-available
[03:14 ebabenko@centos7 /etc/php-fpm.d/pool-available]$ sudo vi www.conf

Данный пул будет обрабатывать общий сервис. Комментарии к каждому параметру я описал.

; имя пула
[www]

; имя пользователя пула
user = www
; группа пользователя пула
group = www

; путь к сокету пула
listen = /var/run/php5-fpm-$pool.sock
; права доступа к сокету
listen.mode = 0666

; тип контроля за процессами пула: определяется системой
pm = ondemand
; Максимальное количество подключений на пул
pm.max_children = 50

; путь к логу доступа
access.log = /var/log/php-fpm/access.$pool.log
; формат лога доступа
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
; путь к логу медленных обработок
slowlog = /var/log/php-fpm/slow.$pool.log

Хочу остановить внимание на следующих параметрах:

  • [www] - имя пула. Задавать можно любые имена, главное, чтобы у вас не было 2 разных пула с одинаковым именем. Я придерживаюсь правила, что имя пулу даётся согласно имени его файла.
  • $pool - данная переменная подставит в любую часть конфигурации имя пула. В данном случае, где прописана эта переменная, после инициализации будет подставлено www. Это очень удобно при создании конфигурации нового пула. Обычно, я просто копирую существующую конфигурацию с новым именем, при редактировании даю новое имя и прописываю пользователя и группу, от кого будет работать пул. Остальные параметры автоматически пропишутся нужным образом (например, сокет пула будет создан как /var/run/php5-fpm-www.sock). По сути, можно было бы эту переменную так же вставить и в имя пользователя и группы, однако не всегда это правило справедливо, так как очень часто у меня под одним пользователем крутятся разные пулы.
  • listen.mode = 0666 - до не давнего времени, данный параметр был закомментирован в конфигурации пула и по правде говоря я не понимал, для чего он нужен если и без него все работает. Однако, последние версии PHP претерпели изменения, где этот параметр стал использоваться и даже больше: без него NGINX не мог получить доступ к сокету пула.
  • pm = ondemand - описание данного параметра процесс-менеджера так же не всегда можно найти. Суть его заключается в том, что система сама будет определять, сколько и в какой момент требуется запускать пулов одновременно. С другими типами всегда требуется изрядного копания и экспериментирования, дабы добиться нужного результата. Этот тип может и не на столько является оптимальным, но с моей точки зрения даже на очень загруженном сервере этот параметр показал отличную производительность.
[03:20 ebabenko@centos7 /etc/php-fpm.d/pool-available]$ sudo vi ebabenko.conf

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

[ebabenko]

user = ebabenko
group = ebabenko

listen = /var/run/php5-fpm-$pool.sock
listen.mode = 0666

pm = ondemand
pm.max_children = 50

access.log = /var/log/php-fpm/access.$pool.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
slowlog = /var/log/php-fpm/slow.$pool.log

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

[03:27 ebabenko@centos7 /etc/php-fpm.d/pool-available]$ cd ../pool-enabled
[03:27 ebabenko@centos7 /etc/php-fpm.d/pool-enabled]$ sudo ln -s /etc/php-fpm.d/pool-available/ebabenko.conf
[03:27 ebabenko@centos7 /etc/php-fpm.d/pool-enabled]$ sudo ln -s /etc/php-fpm.d/pool-available/www.conf
[03:28 ebabenko@centos7 /etc/php-fpm.d/pool-enabled]$ ll
total 0
lrwxrwxrwx. 1 root root 43 Jul  1 22:27 ebabenko.conf -> /etc/php-fpm.d/pool-available/ebabenko.conf
lrwxrwxrwx. 1 root root 38 Jul  1 22:28 www.conf -> /etc/php-fpm.d/pool-available/www.conf
[03:28 ebabenko@centos7 /etc/php-fpm.d/pool-enabled]$ ll ../pool-available
total 28
-rw-r--r--. 1 root root   302 Jul  1 22:26 ebabenko.conf
-rw-r--r--. 1 root root 18549 Jun 11 08:48 pool.example
-rw-r--r--. 1 root root   802 Jul  1 22:21 www.conf

Продолжение статьи "Установка MariaDB + Nginx + PHP-FPM на CentOS 7 (Часть 4)".

Источники:
[1] http://fedoraproject.org/wiki/EPEL (вернутсья к тексту)
[2] http://dl.fedoraproject.org/pub/epel/7/x86_64/ (вернутсья к тексту)
[3] http://rpms.famillecollet.com/ (вернутсья к тексту)
[4] http://rpms.famillecollet.com/enterprise/7/ (вернутсья к тексту)