УСТАНОВКА СТЕКА LEMP В CENTOS 8

Thank you for reading this post, don't forget to subscribe!

Про­грамм­ный стек LEMP – это груп­па про­грамм, пред­на­зна­чен­ная для обслу­жи­ва­ния дина­ми­че­ских веб-стра­ниц и при­ло­же­ний, напи­сан­ных на PHP. Акро­ним LEMP рас­шиф­ро­вы­ва­ет­ся как Linux (опе­ра­ци­он­ная систе­ма), Nginx (веб-сер­вер), MySQL (систе­ма управ­ле­ния база­ми дан­ных) и PHP (язык для обра­бот­ки дина­ми­че­ско­го контента).

Обыч­но уро­вень БД в сте­ке LEMP обслу­жи­ва­ет­ся систе­мой управ­ле­ния база­ми дан­ных MySQL. Но до рели­за CentOS 8 паке­та MySQL не было в стан­дарт­ном репо­зи­то­рии систе­мы CentOS. Поэто­му в каче­стве аль­тер­на­ти­вы на маши­нах CentOS ста­ла широ­ко исполь­зо­вать­ся систе­ма MariaDB, под­дер­жи­ва­е­мый сооб­ще­ством форк MySQL. На прак­ти­ке это зна­чит, что вы може­те перей­ти на MariaDB, не меняя код или кон­фи­гу­ра­ции сво­е­го приложения.

Этот ману­ал помо­жет вам уста­но­вить все ком­по­нен­ты сте­ка LEMP на сер­вер CentOS 8. Хотя пакет MySQL есть в стан­дарт­ном репо­зи­то­рии систе­мы CentOS 8, мы уста­но­вим MariaDB.

Посколь­ку сер­вер исполь­зу­ет опе­ра­ци­он­ную систе­му Linux, пер­вый ком­по­нент уже уста­нов­лен. Ману­ал помо­жет вам уста­но­вить остальное.

1: Установка Nginx

Для отоб­ра­же­ния стра­ниц в сте­ке LEMP исполь­зу­ет­ся высо­ко­про­из­во­ди­тель­ный веб-сер­вер Nginx. Мы уста­но­вим его с помо­щью dnf, ново­го стан­дарт­но­го мене­дже­ра паке­тов CentOS 8.

Посколь­ку это пер­вое вза­и­мо­дей­ствие с мене­дже­ром dnf в теку­щей сес­сии, нам нуж­но обно­вить индекс паке­тов. После это­го мож­но уста­но­вить Nginx

sudo dnf update
sudo dnf install nginx

Что­бы под­твер­дить уста­нов­ку, нажми­те y.

После завер­ше­ния уста­нов­ки вве­ди­те эту коман­ду, что­бы вклю­чить и запу­стить сервер:

sudo systemctl start nginx

Если ранее вы вклю­чи­ли бранд­мау­эр firewalld, нуж­но раз­бло­ки­ро­вать в нем сер­вис Nginx. Сле­ду­ю­щая коман­да откро­ет порт 80 для HTTP соеди­не­ний на посто­ян­ной основе:

sudo firewall-cmd --permanent --add-service=http

Что­бы убе­дить­ся, что поли­ти­ка бранд­мау­э­ра изме­ни­лась, введите:

sudo firewall-cmd --permanent --list-all

Вы полу­чи­те такой вывод:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Пере­за­пу­сти­те бранд­мау­эр, что­бы изме­не­ния всту­пи­ли в силу:

sudo firewall-cmd --reload

Доба­вив новое пра­ви­ло бранд­мау­э­ра, нуж­но про­ве­рить, рабо­та­ет ли сер­вер. Попро­буй­те открыть стан­дарт­ную поса­доч­ную стра­ни­цу в бра­у­зе­ре по домен­но­му име­ни или IP-адре­су сервера.

Если вы не зна­е­те сво­е­го IP-адре­са, вы може­те узнать его с помо­щью команды:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Коман­да вер­нёт несколь­ко адре­сов. Про­верь­те каж­дый из них в браузере.

Так­же вы може­те узнать свой рабо­чий IP с помо­щью этой коман­ды, кото­рая запра­ши­ва­ет, как дру­гие точ­ки в интер­не­те видят ваш сервер.

curl -4 icanhazip.com

Полу­чен­ный IP-адрес вве­ди­те в бра­у­зер, что­бы убе­дить­ся, что веб-сер­вер рабо­та­ет долж­ным образом.

http://server_domain_or_IP

На экране долж­на появить­ся стан­дарт­ная поса­доч­ная стра­ни­ца Nginx:

Welcome to nginx on Red Hat Enterprise Linux!

2: Установка MariaDB

Теперь нуж­но уста­но­вить MariaDB, СУБД, кото­рая будет хра­нить и систе­ма­ти­зи­ро­вать дан­ные сайта.

Что­бы сде­лать это, введите:

sudo dnf install mariadb-server

Когда уста­нов­ка завер­шит­ся, вклю­чи­те и запу­сти­те сер­вис MariaDB:

sudo systemctl start mariadb

После уста­нов­ки MariaDB тре­бу­ет допол­ни­тель­ной настрой­ки. Что­бы защи­тить уста­нов­ку, мож­но запу­стить про­стой скрипт без­опас­но­сти, кото­рый уда­лит потен­ци­аль­но рис­ко­ван­ные пара­мет­ры. Запу­сти­те скрипт:

sudo mysql_secure_installation

Скрипт задаст ряд вопро­сов. Сна­ча­ла нуж­но ука­зать root-пароль MariaDB. Это адми­ни­стра­тив­ная учет­ная запись MariaDB, кото­рая име­ет повы­шен­ные при­ви­ле­гии. Вы уста­но­ви­ли MariaDB толь­ко что и еще не внес­ли ника­ких изме­не­ний в кон­фи­гу­ра­цию, это­го паро­ля пока у вас нет, поэто­му про­сто нажми­те Enter.

В сле­ду­ю­щем окне скрипт пред­ло­жит настро­ить root пароль для базы дан­ных. Вве­ди­те N и нажми­те кла­ви­шу Enter. Вме­сто паро­ля MariaDB исполь­зу­ет для root более надеж­ный метод аутен­ти­фи­ка­ции, поэто­му пароль сей­час мож­но не устанавливать.

На осталь­ные вопро­сы мож­но нажать Y и Enter. Это уда­лит ано­ним­ных поль­зо­ва­те­лей и тесто­вые базы дан­ных, отклю­чит уда­лён­ный root логин и обно­вит теку­щие настрой­ки MariaDB.

После это­го открой­те команд­ную стро­ку MariaDB в терминале:

sudo mysql

Вы под­клю­чи­тесь к сер­ве­ру MariaDB в каче­стве root поль­зо­ва­те­ля базы дан­ных. Вы долж­ны уви­деть при­мер­но такой результат:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>

Обра­ти­те вни­ма­ние: вам не нуж­но было вво­дить свой пароль. Это пото­му, что для аутен­ти­фи­ка­ции адми­ни­стра­то­ра по умол­ча­нию MariaDB исполь­зу­ет метод unix_socket, а не password. Сна­ча­ла такой под­ход может пока­зать­ся про­бле­мой для без­опас­но­сти, но это дела­ет сер­вер БД более защи­щен­ным, посколь­ку вой­ти в систе­му как поль­зо­ва­тель root MariaDB могут толь­ко систем­ные поль­зо­ва­те­ли с при­ви­ле­ги­я­ми sudo, под­клю­ча­ю­щи­е­ся с кон­со­ли или через при­ло­же­ние, рабо­та­ю­щее с теми же при­ви­ле­ги­я­ми. На прак­ти­ке это озна­ча­ет, что вы не смо­же­те исполь­зо­вать акка­унт адми­ни­стра­то­ра для под­клю­че­ния с ваше­го PHP-приложения.

Для повы­ше­ния без­опас­но­сти луч­ше иметь для каж­дой БД отдель­ные учет­ные запи­си с более узки­ми при­ви­ле­ги­я­ми (осо­бен­но если вы пла­ни­ру­е­те раз­ме­стить на сво­ем сер­ве­ре несколь­ко баз дан­ных). Давай­те созда­дим БД example_database и поль­зо­ва­те­ля example_user для нее (вы може­те заме­нить эти име­на дру­ги­ми значениями).

Что­бы создать новую базу дан­ных, вве­ди­те сле­ду­ю­щую коман­ду из кон­со­ли MariaDB:

CREATE DATABASE example_database;

Теперь вы може­те создать ново­го поль­зо­ва­те­ля и пере­дать ему все пра­ва на новую БД. Сле­ду­ю­щая коман­да опре­де­ля­ет услов­ный пароль это­го поль­зо­ва­те­ля (password), а вы долж­ны заме­нить это зна­че­ние слож­ным паролем.

GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Это предо­ста­вит поль­зо­ва­те­лю example_user пра­ва досту­па к БД example_database, при этом запре­тив ему созда­вать или изме­нять дру­гие базы дан­ных на вашем сервере.

Сбрось­те привилегии:

FLUSH PRIVILEGES;

Затем вый­ди­те из обо­лоч­ки MariaDB:

exit

Вы може­те про­ве­рить, есть ли у ново­го поль­зо­ва­те­ля необ­хо­ди­мые ему пра­ва досту­па. Сно­ва вой­ди­те в кон­соль MariaDB, на этот раз с помо­щью новых учет­ных данных:

mysql -u example_user -p

Обра­ти­те вни­ма­ние на флаг -p, он запра­ши­ва­ет пароль, кото­рый вы ука­за­ли при созда­нии поль­зо­ва­те­ля example_user. После вхо­да в кон­соль MariaDB убе­ди­тесь, что у вас есть доступ к базе дан­ных example_database:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Что­бы вый­ти из обо­лоч­ки MariaDB, введите:

exit

3: Установка PHP-FPM

PHP – это сер­вер­ный язык сце­на­ри­ев для созда­ния дина­ми­че­ских страниц.

В отли­чие от Apache, Nginx постав­ля­ет­ся без интер­пре­та­то­ра PHP. Пото­му Nginx нуж­на внеш­няя про­грам­ма для обра­бот­ки PHP и соеди­не­ния само­го интер­пре­та­то­ра PHP с веб-сер­ве­ром. Это поз­во­ля­ет повы­сить общую про­из­во­ди­тель­ность боль­шин­ства веб-сай­тов на осно­ве PHP, но тре­бу­ет допол­ни­тель­ной настройки.

Сей­час нуж­но уста­но­вить php-fpm (fastCGI process manager). Так Nginx смо­жет пере­да­вать PHP-запро­сы на обра­бот­ку.  Кро­ме того, вам пона­до­бит­ся php-mysqlnd (модуль PHP, кото­рый поз­во­ля­ет PHP вза­и­мо­дей­ство­вать с MySQL-подоб­ны­ми БД). Базо­вые паке­ты PHP будут авто­ма­ти­че­ски уста­нов­ле­ны как зависимости.

sudo dnf install php-fpm php-mysqlnd

После уста­нов­ки нуж­но открыть файл /etc/php-fpm.d/www.conf и вне­сти несколь­ко поправок.

По умол­ча­нию CentOS 8 постав­ля­ет­ся с тек­сто­вым редак­то­ром vi. Это очень мощ­ный редак­тор, но нович­кам лег­ко в нем запу­тать­ся. Вы може­те уста­но­вить более удоб­ный редак­тор, напри­мер nano:

sudo dnf install nano

Открой­те файл в этом редакторе:

sudo nano /etc/php-fpm.d/www.conf

Най­ди­те дирек­ти­вы user и group. В nano мож­но выпол­нить поиск по откры­то­му фай­лу с помо­щью кла­виш CTRL+W.


; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

Как види­те, в этих дирек­ти­вах нахо­дит­ся зна­че­ние apache, что нуж­но изме­нить на nginx:


; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

Сохра­ни­те и закрой­те файл (Ctrl + X, Y и Enter).

Что­бы вклю­чить и запу­стить сер­вис php-fpm, введите:

sudo systemctl start php-fpm

Пере­за­пу­сти­те Nginx, что­бы он доба­вил кон­фи­гу­ра­цию уста­нов­ки php-fpm:

sudo systemctl restart nginx

4: Тестирование взаимодействия PHP и Nginx

В CentOS 8 стан­дарт­ная уста­нов­ка php-fpm авто­ма­ти­че­ски созда­ет кон­фи­гу­ра­ци­он­ные фай­лы, с помо­щью кото­рых веб-сер­вер Nginx смо­жет обра­ба­ты­вать фай­лы .php в кор­не­вом ката­ло­ге /usr/share/nginx/html. Вам не нуж­но вно­сить изме­не­ния в кон­фи­гу­ра­цию Nginx, что­бы PHP смог рабо­тать корректно.

Един­ствен­ное изме­не­ние, кото­рое нуж­но вне­сти, – это в при­ви­ле­гии на кор­не­вой ката­лог Nginx. Это даст вам воз­мож­ность созда­вать и редак­ти­ро­вать фай­лы в этом ката­ло­ге в сес­сии сво­е­го обыч­но­го поль­зо­ва­те­ля без необ­хо­ди­мо­сти исполь­зо­вать пре­фикс sudo.

Сле­ду­ю­щая коман­да пере­даст пра­ва на стан­дарт­ный кор­не­вой ката­лог Nginx поль­зо­ва­те­лю и груп­пе по име­ни 8host (вме­сто это­го услов­но­го име­ни вы долж­ны ука­зать в коман­де имя сво­е­го поль­зо­ва­те­ля и группы).

sudo chown -R 8host.8host /usr/share/nginx/html/

Пора убе­дить­ся, что веб-сер­вер успеш­но обслу­жи­ва­ет фай­лы PHP.

Для это­го нуж­но создать тесто­вый файл info.php в ката­ло­ге document root.

nano /usr/share/nginx/html/info.php

Вставь­те в этот файл сле­ду­ю­щий код:

<?php
phpinfo();

Сохра­ни­те и закрой­те файл.

Теперь попро­буй­те открыть его в браузере:

http://your_domain/info.php

На экране появит­ся стра­ни­ца, содер­жа­щая инфор­ма­цию о сер­ве­ре. Если такая стра­ни­ца появи­лась, Nginx пра­виль­но обслу­жи­ва­ет фай­лы PHP.

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

rm /usr/share/nginx/html/info.php

При необ­хо­ди­мо­сти вы все­гда може­те сно­ва создать этот файл.

5: Тестирование соединения базы данных с PHP (опционально)

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

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

mysql -u example_user -p

Создай­те таб­ли­цу по име­ни todo_list. В кон­со­ли MariaDB выпол­ни­те сле­ду­ю­щую команду:

CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);

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

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Что­бы под­твер­дить, что дан­ные были успеш­но сохра­не­ны в вашей таб­ли­це, введите:

SELECT * FROM example_database.todo_list;

Вы уви­ди­те сле­ду­ю­щий вывод:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Убе­див­шись, что в тесто­вой таб­ли­це есть ваши дан­ные, вы може­те вый­ти из кон­со­ли MariaDB:

exit

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

nano /usr/share/nginx/html/todo_list.php

Добавь­те в файл PHP-скрип­та сле­ду­ю­щие строки:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}

Сохра­ни­те и закрой­те файл, когда закон­чи­те редактирование.

Теперь вы може­те полу­чить доступ к этой стра­ни­це в сво­ем бра­у­зе­ре, посе­тив домен или внеш­ний IP-адрес, кото­рый вы ука­за­ли в кон­фи­гу­ра­ции Nginx. К нему нуж­но доба­вить сек­цию /todo_list.php:

http://server_host_or_IP/todo_list.php

Вы долж­ны уви­деть тезна­че­ния, кото­рые вы вста­ви­ли в тесто­вую таблицу.

Это озна­ча­ет, что сре­да PHP может под­клю­чать­ся и вза­и­мо­дей­ство­вать с вашим сер­ве­ром MariaDB.