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

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

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

Вся указанная в заголовке статей связка теперь установлена. Осталось сделать несколько доводок до рабочего состояния и проверить работу всего комплекса в целом. В качестве скриптов я не буду использовать какие либо CMS, ограничусь самым простейшим phpinfo(), дабы убедиться в правильности работы.


Содержание:

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

10. Ключ на старт...

Для работы общего сервиса, как я и говорил в предыдущей статье, мы указали пользователя и группу, которых еще нет в системе. Поэтому мы должны создать такого пользователя и группу. К тому же, для данной учетной записи не требуется авторизация, так это не пользователь.

[23:37 ebabenko@centos7 ~]$ sudo groupadd www -g 80
[23:37 ebabenko@centos7 ~]$ sudo useradd www -d /var/www -u 80 -g 80 -s /sbin/nologin

Проверяем созданные записи.

[23:37 ebabenko@centos7 ~]$ cat /etc/group | grep www
www:x:80:
[23:38 ebabenko@centos7 ~]$ cat /etc/passwd | grep www
www:x:80:80::/var/www:/sbin/nologin

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

[23:40 ebabenko@centos7 ~]$ sudo mkdir -p /var/www/html
[23:41 ebabenko@centos7 ~]$ sudo vi /var/www/html/index.php

Прописываем в нем следующее содержимое.

<h4>This is the public site</h4>
<?php
phpinfo();
?>

Теперь осталось указать, что все файлы и директории принадлежат новому пользователю и новой группе.

[23:41 ebabenko@centos7 ~]$ cd /var
[23:43 ebabenko@centos7 /var]$ sudo chown -R www:www www

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

[23:44 ebabenko@centos7 /var]$ cd /home/ebabenko
[23:44 ebabenko@centos7 ~]$ mkdir -p public_html
[23:44 ebabenko@centos7 ~]$ vi public_html/index.php

Так же создаем индексный файл. Только здесь дополнительно я ещё прописал подключение к установленной MariaDB для проверки, что все работает верно.

<h4>This is the private site</h4>
<?php
$mi = new mysqli('localhost', 'root', 'root', 'mysql');
printf("Server version: <b>%s</b><br/>\n", $mi->server_info);
var_export($mi->get_charset());
$mi->close();
phpinfo();
?>

Все готово. Запускаем сервисы и прописываем их в автозагрузку.

[23:46 ebabenko@centos7 ~]$ systemctl list-unit-files | grep php
php-fpm.service                             disabled
[23:46 ebabenko@centos7 ~]$ systemctl list-unit-files | grep nginx
nginx.service                               disabled
[23:46 ebabenko@centos7 ~]$ sudo systemctl start php-fpm.service
[23:50 ebabenko@centos7 ~]$ sudo systemctl start nginx.service
[23:50 ebabenko@centos7 ~]$ sudo systemctl enable php-fpm.service
ln -s '/usr/lib/systemd/system/php-fpm.service' '/etc/systemd/system/multi-user.target.wants/php-fpm.service'
[23:50 ebabenko@centos7 ~]$ sudo systemctl enable nginx.service
ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'

Чтобы вы смогли получить ответ по указанным адресам в конфигурациях серверов NGINX, вам потребуется изменить файл hosts на локальной машине, с которой вы будете открывать страницы (не на сервере). Содержание следующее:

192.168.0.123 nginx.local
192.168.0.123 www.local
192.168.0.123 ebabenko.local

где:

  • 192.168.0.123 - это IP-адрес сервера CentOS, который вы конфигурировали.
  • nginx.local www.local ebabenko.local - имена доменов серверов NGINX.

Что ж, проверяем. Открываем для начала сайт со статическими страницами NGINX. Набираем в адресной строке браузера http://nginx.local и... обламываемся, потому что соединения к серверу блочит фаервол на стороне CentOS. Я не буду сейчас заморачиваться в настройке фаервола, да и параноей не болею. Поэтому, исправляю ситуацию "топорно". Кому интересно поиграться с найтроками, ваше личное право.

Для того, чтобы фаервол сервера не блокировал подключения, отключаем его.

[00:07 ebabenko@centos7 ~]$ systemctl list-unit-files | grep iptable
[00:07 ebabenko@centos7 ~]$ systemctl list-unit-files | grep firewall
firewalld.service                           enabled
[00:07 ebabenko@centos7 ~]$ sudo systemctl stop firewalld.service
[00:08 ebabenko@centos7 ~]$ sudo systemctl disable firewalld.service
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'

Теперь можно приступать к тестированию.

Общий сервис уже выдаст информацию PHP.

Пользовательский сервис помимо информации PHP еще выдаст информацию о сервере БД и установленным в ней кодировкам.

Так же проверяем, что каждый из сервисов пишет в лог свои действия.

[00:09 ebabenko@centos7 ~]$ ps ax | grep php
 4684 ?        Ss     0:00 php-fpm: master process (/etc/php-fpm.conf)
 5173 pts/0    S+     0:00 grep --color=auto php
[00:13 ebabenko@centos7 ~]$ ps ax | grep nginx
 4692 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
 4693 ?        S      0:00 nginx: worker process
 4694 ?        S      0:00 nginx: worker process
 5175 pts/0    S+     0:00 grep --color=auto nginx
[00:13 ebabenko@centos7 ~]$ ll /var/log/php-fpm
ls: cannot open directory /var/log/php-fpm: Permission denied
[00:13 ebabenko@centos7 ~]$ sudo ls -la /var/log/php-fpm
total 16
drwxrwx---. 2 apache root   76 Jul  1 23:50 .
drwxr-xr-x. 9 root   root 4096 Jul  1 22:40 ..
-rw-------. 1 root   root  318 Jul  2 00:11 access.ebabenko.log
-rw-------. 1 root   root  280 Jul  2 00:10 access.www.log
-rw-------. 1 root   root  186 Jul  1 23:50 error.master.log
[00:14 ebabenko@centos7 ~]$ sudo ls -la /var/log/nginx
total 32
drwx------. 2 nginx nginx 4096 Jul  1 23:50 .
drwxr-xr-x. 9 root  root  4096 Jul  1 22:40 ..
-rw-r--r--. 1 root  root   864 Jul  2 00:09 access.default.log
-rw-r--r--. 1 root  root   493 Jul  2 00:11 access.ebabenko.log
-rw-r--r--. 1 root  root     0 Jul  1 23:50 access.master.log
-rw-r--r--. 1 root  root   493 Jul  2 00:10 access.www.log
-rw-r--r--. 1 root  root   426 Jul  2 00:09 error.default.log
-rw-r--r--. 1 root  root  1314 Jul  2 00:11 error.ebabenko.log
-rw-r--r--. 1 root  root     0 Jul  1 23:50 error.log
-rw-r--r--. 1 root  root     0 Jul  1 23:50 error.master.log
-rw-r--r--. 1 root  root  1174 Jul  2 00:10 error.www.log

Так-с, а откуда ошибки уже взялись?

[00:14 ebabenko@centos7 ~]$ sudo cat /var/log/nginx/error.default.log
2015/07/02 00:09:45 [error] 4693#0: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.1.250, server: _, request: "GET /favicon.ico HTTP/1.1", host: "nginx.local"
2015/07/02 00:09:45 [error] 4693#0: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.1.250, server: _, request: "GET /favicon.ico HTTP/1.1", host: "nginx.local"

Понятно. "Фав-иконок" не хватает, но это уже не беда. С остальными логами то же самое.

11. Послесловие

На этом можно было и закончить описание. Тем не менее, считаю нужным вкратце объяснить как пользоваться такой структурой.

Для создания нового сервиса требуется:

  1. Создать нового пользователя, если требуется. Если сервис будет запускаться в рамках уже существующего пользователя, то понятное дело, создавать еще одного такого же пользователя не нужно.
  2. Создать базу данных в рамках учетной записи, если для нового сервиса она требуется. Как это сделать я писал в предыдущих статьях, в данной статье я не рассматривал этот момент.
  3. Создать директорию, где будут располагаться файлы сервиса. Перенести в эту директорию файлы сайта и проверить все ли файлы и директории принадлежат этому пользователю и группе. После произвести все нужные настройки сайта (конфигурация, подключение к БД и прочее).
  4. В директории /etc/php-fpm.d/pool-available скопировать конфигурацию пула из любого имеющегося, более подходящему по содержимому для нового пула и сделать в нём соответствующие изменения. Создать симлинк на созданный пул в директории /etc/php-fpm.d/pool-enabled.
  5. В директории /etc/nginx/sites-available скопировать конфигурацию сервера из любого имеющегося, более подходящему по содержимому для нового сервера. Если новый сервис запускается в рамках уже существующего пользователя, лучше выбрать ту конфигурацию, которая у него уже существует и потом уже дополнить или изменить содержимое до нужной конфигурации. После этого создать симлинк на созданную конфигурацию в директории /etc/nginx/sites-enabled.
  6. Перезапускаем сервисы: сначала PHP-FPM, потом NGINX.
[00:31 ebabenko@centos7 ~]$ sudo systemctl restart php-fpm.service
[00:31 ebabenko@centos7 ~]$ sudo systemctl restart nginx.service

Отключение определенного сервиса делается проще:

  1. Из директории /etc/php-fpm.d/pool-enabled, удаляем симлинк пула, который требуется отключить.
  2. Из директории /etc/nginx/sites-enabled, удаляем симлинк того сервера, который требуется отключить.
  3. Перезапускаем сервисы в обратном порядке: сначала перезапускается NGINX, после него перезапускается PHP-FPM
[00:31 ebabenko@centos7 ~]$ sudo systemctl restart nginx.service
[00:31 ebabenko@centos7 ~]$ sudo systemctl restart php-fpm.service

На этом все. Если заметили недочеты по статьям, пишите в комментариях.

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