Установка Nginx, MySQL, PHP (LEMP) на CentOS 7

Установка Nginx, MySQL, PHP (LEMP) на CentOS 7

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Установка веб-сервера LEMP (NGINX + MySQL + PHP-FPM) на CentOS 7.

Шаг 1. Установка Nginx

Добавляем CentOS 7 Nginx репозиторий.

1
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Установка Nginx.

1
yum install nginx

После установки Nginx - запускаем его.

1
systemctl start nginx.service

Проверить, что веб-сервер запущен можно по адресу http://example.com/
Мы увидим дефолтную страницу Nginx.

Default Nginx Page

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

1
systemctl enable nginx.service

Шаг 2. Установка MySQL (MariaDB)

Теперь, после того как закончена установка веб-сервера, приступаем к установке и настройке сервера баз данных. В данном примере будет использоваться MariaDB, поскольку данный форк зарекомендовал себя с лучшей стороны.

Установка сервера и клиента MariaDB

1
yum install mariadb-server mariadb

Запуск сервера баз данных.

1
systemctl start mariadb

После того как сервер запущен, приступаем к базовой настройке. Запускаем скрипт настройки простой командой.

1
mysql_secure_installation
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
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] y
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] y
... 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] y
... 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] y
- 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] y
... 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
systemctl enable mariadb.service

Шаг 3. Установка и настройка PHP (PHP-FPM)

PHP позволяет отображать динамический контент сайта, а также получать информацию из MySQL базы.

Установка PHP

1
yum install php php-mysql php-fpm

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

Незначительная конфигурация для повышения безопасности

Открываем конфигурационный файл PHP

1
vi /etc/php.ini

Нас интересует параметр cgi.fix_pathinfo. По умолчанию он закомментирован и установлен в значение 1.
Это значение небезопасно, поскольку любой пользователь будет иметь возможность заливать файлы на сервер (например аватары). Создав особенное изображение, которое будет одновременно проходить валидацию размеров GD и исполняться php интерпретатором, будет иметь права на исполнение произвольного кода на сервере с правами php процесса.

Раскомментируем строчку и изменим значение на 0.

1
cgi.fix_pathinfo=0

Также это можно сделать через настройки Nginx

1
2
3
4
5
6
location ~* .php$ {
try_files $fastcgi_script_name =404;
fastcgi_index index.php;
fastcgi_param script_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

Теперь доступ для несуществующих файлов с разрешением *.php закрыт.
Cама реализация cgi.fix_pathinfo достаточно тормознутая — на каждый запрос проверяется каждый компонент пути — не скрипт ли это.
Поэтому стоит выключать также и из соображений производительности.

Также не забываем изменить временную зону, для этого раскомментируем строчку ;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

Далее, откроем конфигурационный файл PHP-FPM

1
vi /etc/php-fpm.d/www.conf

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

1
listen = /var/run/php-fpm/php-fpm.sock

Запускаем PHP-FPM

1
systemctl start php-fpm

Добавляем PHP-FPM в автозагрузку

1
systemctl enable php-fpm.service

Шаг 4. Конфигурация NGINX

После того, как мы завершили установку основных компонентов для успешной работы веб-сервера, приступим к его настройке.

NGINX как и Apache поддерживает работу виртуальных хостов. Создавать файлы с хостами можно в директории /etc/nginx/conf.d/, но мы будем использовать другую схему.

Создаем директории под виртальные хосты

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

В файл конфигурации /etc/nginx/nginx.conf добавляем в конец строчку:

1
2
## Load virtual host conf files. ##
include /etc/nginx/sites-enabled/*;

Вероятно уже стало понятно, что в директории sites-available будут храниться файлы вирутальных хостов, а в директории sites-enabled будут симлинки на них, которые будут активны. Таким образом можно всегда просто включить/отключить один из хостов.

Создаем виртуальный хост

Создаем директории под содержимое сайта, а также под логи для каждого из хостов.

1
2
3
mkdir -p /srv/www/example.com/public_html
mkdir /srv/www/example.com/logs
chown -R apache:apache /srv/www/example.com

Создаем файл example.com в директории /etc/nginx/sites-available.

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
server {
server_name example.com;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
root /srv/www/example.com/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 /srv/www/example.com/public_html$fastcgi_script_name;
}
}

Подключаем наш виртуальный хост

1
2
3
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/example.com
systemctl restart nginx

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

Создаем файл в директории сайта /srv/www/example.com/public_html/info.php

1
<?php phpinfo(); ?>

Открываем файл в браузере

1
http://example.com/info.php

Если все в порядке, то можем наблюдать приблизительно следующее.

PHP INFO

Не забываем удалить файл info.php.
На этом установка LEMP в CentOS 7 завершена.