Пост

Установка web-сервера Nginx для работы с виртуальными хостами, PHP-FPM в режиме работы Sock, Mysql-сервер MariaDB на Centos 7

Nginx — это программное обеспечение с открытым исходным кодом для создания веб-серверов. Оно принимает запрос клиента, например браузера, обрабатывает его и возвращает ответ. Nginx является высокопроизводительным веб-сервером и обратным прокси-сервером, который может использоваться также как почтовый (IMAP/POP3) и балансировочный сервер.

Добавим репозитории EPEL и Remi, необходимое ПО и обновим CentOS

1
2
3
4
$ sudo yum install epel-release
$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum install wget nano mc zip upzip htop
$ sudo yum install update

Добавим репозиторий Nginx.
Для этого создадим файла с содержимым:

1
2
3
4
5
6
$ sudo nano /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1 

Добавим репозиторий MariaDB.
Для этого создадим файла с содержимым:

1
2
3
4
5
6
$ sudo nano /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установим web-сервер Nginx

1
$ sudo yum install nginx

Запускаем Nginx и добавим его в автозагрузку

1
2
$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Откроем порты 80 и 443 в firewall

1
2
3
$ sudo firewall-cmd --zone=public --permanent --add-service=http
$ sudo firewall-cmd --zone=public --permanent --add-service=https
$ sudo firewall-cmd --reload

Установим MariaDB

1
$ sudo yum install mariadb-server mariadb

Запускаем сервер баз данных и запускаем скрипт настройки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$ sudo systemctl start mariadb
$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Добавим сервис в автозагрузку

1
$ sudo systemctl enable mariadb

Отключаем SELinux (не безопасно!)

1
2
3
4
$ sudo nano /etc/sysconfig/selinux
...
SELINUX=disabled
...

Перезагружаемся

1
$ sudo reboot

Установка PHP 7.3, настройка PHP-FPM в режиме работы SOCK

Для начала установим yum-utils для инструмента yum-config-manager

1
$ sudo yum install -y yum-utils

Включаем Remi репозиторий для установки PHP 7.3

1
$ sudo yum-config-manager --enable remi-php73

Устанавливаем PHP 7.3 и некоторые компоненты

1
$ sudo yum install php php-xml php-soap php-xmlrpc php-mbstring php-json php-gd php-mcrypt php-common php-fpm php-pdo php-mysqlnd php-imap php-embedded php-ldap php-odbc php-zip php-fileinfo php-process php-opcache

Проверяем:

1
2
3
4
5
$ sudo  php -v
PHP 7.3.7 (cli) (built: Jul  3 2019 11:30:22) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies

Настройка PHP-FPM в режиме работы SOCK.
Запускаем PHP-FPM и добавляем в автозагрузку

1
2
$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm

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

1
2
$ sudo netstat -tulpn | grep php-fpm
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      3031/php-fpm: maste

Если не хватает утилиты netstat, установим её

1
$ sudo yum install net-tools

Настраиваем PHP-FPM

1
$ sudo nano /etc/php.ini

Нас интересует параметр cgi.fix_pathinfo. По умолчанию он закомментирован и установлен в значение 1. Раскомментируем строчку и изменим значение на 0.

1
cgi.fix_pathinfo=0

Также не забываем изменить временную зону, для этого раскомментируем строчку date.timezone и пропишем необходимую временную зону

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

Включим short_open_tag для разрешения короткой формы записи тегов PHP

1
short_open_tag = On

Изменим пользователя, от которого будет работать PHP-FPM. Вместо apache укажем nginx.

1
2
3
4
5
6
7
8
$ sudo nano /etc/php-fpm.d/www.conf
...
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
...

Находим строчку начинающуюся с listen и заменяем её полностью новым значением.

1
2
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock

Перезапускаем PHP-FPM

1
$ sudo systemctl restart php-fpm

Почему стоит перейти на unix-сокет?

UDS (unix domain socket), в отличии от коммуникации через стек TCP, имеют значительные преимущества:

  • не требуют переключение контекста, UDS используют netisr
  • датаграмма UDS записываться напрямую в сокет назначения
  • отправка дейтаграммы UDS требует меньше операций (нет контрольных сумм, нет TCP-заголвоков, не производиться маршрутизация)
  • у UDS задержка на ~66% меньше и пропускная способность в 7 раз больше TCP

Перезапустим Nginx

1
$ sudo systemctl restart nginx

После перезапуска Nginx у меня вылезла ошибка

1
nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so" version 1012002 instead of 1014000 in /usr/share/nginx/modules/mod-http-geoip.conf:1

Эта ошибка появилась из-за того, что я устанавливал Nginx из стандартного репозитория, а потом подключил официальный репозиторий и обновился.

Чтобы решить эту проблему, удалим все модули из репозитория Nginx:

1
$ sudo sudo yum remove nginx-mod*

Устанавливаем модули из официального репозитория

1
$ sudo sudo yum install nginx-module-*

Перезапускаем Nginx

1
$ sudo sudo systemctl restart nginx

Настройка NGINX для работы с виртуальными хостами

Создадим необходимые директории для виртуального хоста

1
2
$ sudo mkdir -p  /var/www/example.ru/public_html
$ sudo mkdir /var/www/example.ru/logs

В корне создадим HTML-файл

1
2
3
4
5
6
7
8
9
10
11
$ sudo nano /var/www/example.ru/public_html/index.html
<html>
  <head>
    <title>Sample web page on example.ru website</title>
  </head>
  <body>
    <h1>Nginx server</h1>
    This sample web page confirms that the first Nginx virtual host 
   or server block is working for example.ru
  </body>
</html>

Выставляем права на директорию public_html

1
$ sudo chmod -R 755 /var/www/example.ru/public_html

Создадим директории для конфигов виртуальных хостов

1
2
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

Отредактируем основной конфиг nginx.conf

1
$ sudo nano /etc/nginx/nginx.conf

Перед закрывающейся фигурной скобкой блока http добавим строки:

1
2
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

Создаем конфиг-файл нашего виртуального хоста

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ sudo nano /etc/nginx/sites-available/example.ru.conf
server {
    listen  80;
    server_name example.ru www.example.ru;
	access_log /var/www/example.ru/logs/access.log;
    error_log /var/www/example.ru/logs/error.log;
	root /var/www/example.ru/public_html;
	
location / {
        try_files $uri $uri/ /index.html;
    }
 
      location ~ /\.ht {
        deny all;
    }
 
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
 
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }
 
    location ~* .php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        #fastcgi_pass  127.0.0.1:9000; ## Если работаем не по сокетам
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.ru/public_html$fastcgi_script_name;
    }
}

Делаем символическую ссылку. Таким образом проще отключать/подключать новые виртуальные хосты

1
$ sudo ln -s /etc/nginx/sites-available/example.ru.conf /etc/nginx/sites-enabled/example.ru.conf

И перезапускаем Nginx

1
$ sudo systemctl restart nginx

Проверяем работу Nginx и PHP

Создаем файл info.php

1
2
$ sudo nano /var/www/example.ru/public_html/info.php
<?php phpinfo(); ?>

В файле hosts на рабочем ПК прописываем соответствие IP и адреса сайта (как это сделать, можете спросить у меня в комментариях) и убеждаемся что Nginx и PHP работают.

Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.