menu icon
Тагове: , , , ,

Как да инсталираме Linux, Apache, MySQL, PHP (LAMP) на Ubuntu 22.04

„LAMP“ стек е група от отворен код софтуер, който обикновено се инсталира заедно, за да позволи на сървъра да хоства динамични уеб сайтове и уеб приложения, написани на PHP. Този термин е акроним, който представлява операционната система Linux с уеб сървъра Apache. Данните на сайта се съхраняват в MySQL база данни, а динамичното съдържание се обработва от PHP.

В това ръководство ще настроите LAMP стек на сървър с Ubuntu 22.04.

Изисквания

Преди да започнете с това ръководство, ще ви бъде необходим сървър с Ubuntu 22.04, настроен с non-root потребител със sudo права и активирана защитна стена, която блокира ненужни портове.

Инсталиране на Apache и актуализация на защитната стена (Firewall)

Уеб сървърът Apache е сред най-популярните уеб сървъри в света. Той е добре документиран, с активна общност от потребители и е широко използван през голяма част от историята на уеба, което го прави отличен избор за хостинг на уеб сайт.

Започнете като актуализирате кеша на мениджъра на пакети. Ако това е първият път, когато използвате sudo в този сесия, ще бъдете подканени да въведете паролата на потребителя си, за да потвърдите, че разполагате с правилните привилегии за управление на системни пакети с apt:

След това инсталирайте Apache:

Ще бъдете подканени да потвърдите инсталацията на Apache. Потвърдете, като натиснете Y, след което ENTER.

След като инсталацията завърши, ще трябва да настроите защитната стена, за да разрешите HTTP трафика. Инструментът за конфигуриране на защитната стена по подразбиране в Ubuntu се нарича Uncomplicated Firewall (UFW). Той разполага с различни application профили, които можете да използвате. За да изведете всички налични приложениепрофили в момента, изпълнете тази команда:

Output
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Ето какво означават тези профили:

  • Apache: Този профил отваря само порт 80 (нормален, некриптиран уеб трафик).
  • Apache Full: Този профил отваря и порт 80 (нормален, некриптиран уеб трафик), и порт 443 (шифрован TLS/SSL трафик).
  • Apache Secure: Този профил отваря само порт 443 (шифрован TLS/SSL трафик).

За сега е най-добре да позволите само връзки към порт 80, тъй като това е свежа инсталация на Apache и все още нямате конфигуриран сертификат TLS/SSL, който да позволява HTTPS трафик към вашия сървър.

За да позволите само трафика към порт 80, използвайте профила Apache:

sudo ufw allow in "Apache"
Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                                
Apache                     ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)                    
Apache (v6)                ALLOW       Anywhere (v6)

Трафикът към порт 80 вече е разрешен през защитната стена.

Можете да направите проверка веднага, за да потвърдите, че всичко е протекло според плана, като посетите локалния адрес на вашия сървър в уеб браузъра си:

Страницата по подразбиране на Apache за Ubuntu 22.04 е налична с информационна и тестова цел. По-долу е пример на Apache страницата по подразбиране:

Ако можете да видите тази страница, вашият уеб сървър е правилно инсталиран и достъпен през вашата защитна стена.

Инсталиране на MySQL

Сега, когато имате работещ уеб сървър, трябва да инсталирате системата за управление на бази данни, за да можете да съхранявате и управлявате данни за вашия сайт. MySQL е популярна система за управление на бази данни, използвана в PHP среди.

Отново използвайте apt, за да придобиете и инсталирате този софтуер:

sudo apt install mysql-server

Когато бъдете подканени, потвърдете инсталацията, като въведете Y и след това натиснете ENTER.

След като инсталацията приключи, е препоръчително да стартирате скрипт за сигурност, който вече е инсталиран с MySQL. Този скрипт ще премахне някои несигурни настройки по подразбиране и ще заключи достъпа до вашата база данни.

Предупреждение: От юли 2022 г., при изпълнение на скрипта mysql_secure_installation без някои допълнителни конфигурации ще възникне грешка. Причината е, че този скрипт ще се опита да зададе парола за root акаунта на MySQL, но по подразбиране при инсталациите на Ubuntu този акаунт не е конфигуриран да се свързва с парола.

Преди юли 2022 г., този скрипт щеше да се провали тихо след опит за задаване на парола за root акаунта и щеше да продължи с останалите подсказки. Въпреки това, към настоящия момент скриптът ще върне следната грешка след като въведете и потвърдите парола:

Output
 ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.

New password:

Това ще доведе до рекурсивен цикъл в скрипта, от който можете да излезете само чрез затваряне на прозореца на терминала.

Тъй като скриптът mysql_secure_installation извършва редица други действия, които са полезни за осигуряване на безопасността на вашата инсталация на MySQL, все още се препоръчва да го изпълните, преди да започнете да използвате MySQL за управление на данни. За да избегнете влизането в този рекурсивен цикъл, обаче, първо ще трябва да настроите начина, по който се удостоверява вашият root MySQL потребител.

Първо, отворете MySQL промпта:

След това изпълнете следната команда ALTER USER, за да промените метода на удостоверяване на root потребителя, така че да използва парола. В следния пример методът на удостоверяване се променя на mysql_native_password:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

След като направите тази промяна, излезте от MySQL промпта:

След това можете да изпълните скрипта mysql_secure_installation без проблеми.

Стартирайте интерактивния скрипт, като изпълните:

sudo mysql_secure_installation

Това ще попита дали искате да конфигурирате VALIDATE PASSWORD PLUGIN.

Забележка: Активирането на тази функция е въпрос на субективно решение. Ако я активирате, паролите, които не отговарят на определените критерии, ще бъдат отхвърляни от MySQL с грешка. Безопасно е да оставите валидацията деактивирана, но винаги трябва да използвате силни, уникални пароли за достъп до базата данни.

Отговорете с Y за да, или въведете каквото и да е друго, за да продължите без да я активирате.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

Ако отговорите „да“, ще бъдете попитани за избор на ниво на валидация на паролата. Имайте предвид, че ако въведете 2 за най-силното ниво, ще получавате грешки при опит за задаване на всяка парола, която не съдържа числа, главни и малки букви, и специални символи:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Независимо дали сте избрали да конфигурирате VALIDATE PASSWORD PLUGIN, следващата стъпка е да изберете и потвърдите парола за MySQL root потребителя. Това не трябва да се бърка с системния потребител root. Root потребителят на базата данни е административен потребител с пълни права върху системата за управление на бази данни. Въпреки че методът на удостоверяване по подразбиране за MySQL root потребителя не включва използване на парола, дори когато е зададена, трябва да дефинирате силна парола тук като допълнителна мярка за безопасност.

Ако сте активирали валидацията на паролата, ще видите силата на паролата за root потребителя, която въведохте, и сървърът ви ще ви попита дали искате да продължите с тази парола. Ако сте доволни от текущата си парола, въведете Y за „да“ на подсказката:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

За останалите въпроси, натиснете Y и след това ENTER на всяка подсказка. Това ще премахне някои анонимни потребители и тестовата база данни, ще деактивира отдалечените влизания като root, и ще зареди тези нови правила, така че MySQL незабавно да зачита направените от вас промени.

Когато приключите, тествайте дали можете да влезете в MySQL конзолата, като въведете:

Това ще ви свърже към MySQL сървъра като административен потребител на базата данни root, което се предполага от използването на sudo при изпълнението на тази команда. По-долу е примерен изход:

Output
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

За излизане от MySQL конзолата, напишете:

Забележете, че не е необходимо да предоставите парола, за да се свържете като root потребител, въпреки че сте дефинирали такава, когато стартирахте скрипта mysql_secure_installation. Това се дължи на факта, че методът на удостоверяване по подразбиране за административния потребител на MySQL е unix_socket вместо password. Въпреки че това може да изглежда като проблем за сигурност, това прави базата данни по-сигурна, тъй като единствените потребители, разрешени да влизат като root потребител на MySQL, са системните потребители със sudo привилегии, свързващи се от конзолата или чрез приложение, работещо със същите привилегии. Практически това означава, че няма да можете да използвате административния root потребител на базата данни, за да се свържете от вашето PHP приложение. Задаването на парола за root акаунта на MySQL действа като защитна мярка, ако методът на удостоверяване по подразбиране бъде променен от unix_socket на password.

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

Забележка: Има стари версии на PHP, които не поддържат caching_sha2_password, методът за удостоверяване по подразбиране за MySQL 8. Поради тази причина, когато създавате потребители на база данни за PHP приложения на MySQL 8, може да бъде необходимо да конфигурирате вашето приложение да използва mysql_native_password плъгин-a. Този tutorial ще покаже как да направите това в стъпката Тестване на връзката с базата данни от PHP (по избор).

Вашият MySQL сървър вече е инсталиран и сигурен. Следва да инсталирате PHP, последният компонент в LAMP стека.

Инсталиране на PHP

Вече имате инсталиран Apache, който да обслужва вашето съдържание, и MySQL, инсталиран за съхранение и управление на вашите данни. PHP е компонентът на нашата конфигурация, който ще обработва кода, за да покаже динамично съдържание на крайния потребител. Освен php пакета, ви е необходим php-mysql, PHP модул, който позволява на PHP да комуникира с MySQL базирани бази данни. Също така ще ви е необходим libapache2-mod-php, за да позволите на Apache да обработва PHP файлове. Основните PHP пакети ще бъдат автоматично инсталирани като зависимости.

За да инсталирате тези пакети, изпълнете следната команда:

sudo apt install php libapache2-mod-php php-mysql

След като инсталацията приключи, изпълнете следната команда, за да потвърдите версията на вашия PHP:

Output
PHP 8.1.2 (cli) (built: Mar  4 2022 18:13:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies

В този момент вашият LAMP стек е напълно функционален, но преди да тествате конфигурацията си с PHP скрипт, е най-добре да настроите правилен виртуален хост на Apache, за да съдържа файлове и папки на вашия уебсайт.

Създаване на виртуален хост за вашия уебсайт

При използване на уеб сървъра Apache, можете да създавате виртуални хостове (подобни на сървърни блокове в Nginx), за да енкапсулирате конфигурационни детайли и да хоствате повече от един домейн от един сървър. В този tutorial ще настроим домейн, наречен your_domain, но вие трябва да го замените със своето собствено име на домейн.

Apache на Ubuntu 22.04 по подразбиране има включен един виртуален хост, който е конфигуриран да обслужва документи от директорията /var/www/html. Въпреки че това работи добре за единичен сайт, може да стане неудобно, ако хостнете множество сайтове. Вместо да променяте /var/www/html, ще създадем структура от директории в /var/www за сайта your_domain, като оставим /var/www/html на мястото му като стандартна директория, която да се обслужва, ако заявката на клиента не съответства на други сайтове.

Създайте директорията за your_domain по следния начин:

sudo mkdir /var/www/your_domain

След това задайте собственика на директорията със $USER променливата на средата, която ще се отнася до текущия ви системен потребител:

sudo chown -R $USER:$USER /var/www/your_domain

След това отворете нов конфигурационен файл в директорията sites-available на Apache, използвайки предпочитания от вас текстов редактор от командния ред. Тук ще използваме nano:

sudo nano /etc/apache2/sites-available/your_domain.conf

Това ще създаде нов празен файл. Добавете следната минимална конфигурация със собственото си име на домейн:

<VirtualHost *:80>
    ServerName your_domain
    ServerAlias www.your_domain 
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Запазете и затворете файла, когато приключите. Ако използвате nano, направете това, като натиснете CTRL+X, след това Y и ENTER.

С тази конфигурация VirtualHost казваме на Apache да обслужва your_domain, използвайки /var/www/your_domain като основна директория. Ако искате да тествате Apache без домейн име, можете да премахнете или закоментирате опциите ServerName и ServerAlias, като добавите решетка (#) в началото на редовете на всяка опция.

Сега използвайте a2ensite, за да активирате новия виртуален хост:

Може да искате да деактивирате стандартния уебсайт, който идва инсталиран с Apache. Това е необходимо, ако не използвате персонализирано име на домейн, защото в този случай стандартната конфигурация на Apache би заменила вашия виртуален хост. За да деактивирате стандартния уебсайт на Apache, напишете:

sudo a2dissite 000-default

За да се уверите, че конфигурационният ви файл не съдържа синтактични грешки, изпълнете следната команда:

sudo apache2ctl configtest

И накрая, презаредете Apache, за да влязат в сила тези промени:

sudo systemctl reload apache2

Вашият нов уебсайт вече е активен, но основната директория /var/www/your_domain все още е празна. Създайте файл index.html на това място, за да тествате дали виртуалният хост работи както очаквате:

nano /var/www/your_domain/index.html

Включете следното съдържание в този файл:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Запазете и затворете файла, след което отидете в браузъра и посетете името на домейна на вашия сървър или IP адрес:

http://server_domain_or_IP

Вашият уебсайт трябва да показва съдържанието на файла, който току-що редактирахте:

Можете да оставите този файл засега като временна стартова страница за вашето приложение, докато настроите index.php файл, който да го замени. Когато го направите, не забравяйте да премахнете или преименувате index.html файла, тъй като по подразбиране той би взимал превес пред index.php файл.

Забележка относно DirectoryIndex в Apache

С настройките по подразбиране на DirectoryIndex в Apache, файл с име index.html винаги ще има предимство пред файл index.php. Това е полезно при настройката на страници за поддръжка в PHP приложения, като се създаде временен файл index.html, съдържащ информативно съобщение за посетителите. Тъй като тази страница ще има предимство пред страницата index.php, тя става началната страница на приложението. След като поддръжката приключи, index.html се преименува или премахва от основната директория, връщайки стандартната страница на приложението.

Ако искате да промените това поведение, трябва да редактирате файла /etc/apache2/mods-enabled/dir.conf и да промените реда, в който файлът index.php е изброен в директивата DirectoryIndex:

sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

След като запазите и затворите файла, трябва да презаредите Apache, за да влязат в сила промените:

sudo systemctl reload apache2

В следващата стъпка ще създадем PHP скрипт, за да тестваме дали PHP е правилно инсталиран и конфигуриран на вашия сървър.

Тест на изпълнението на PHP на вашия уеб сървър

Сега, като имате персонализирано място за съхранение на файловете и папките на вашия уебсайт, създайте PHP тестов скрипт, за да потвърдите, че Apache може да обработва и изпълнява заявки за PHP файлове.

Създайте нов файл с име info.php във вашата персонализирана основна директория за уебсайт:

nano /var/www/your_domain/info.php

Това ще отвори празен файл. Добавете следния текст, който е валиден PHP код, във файла:

Когато приключите, запазете и затворете файла.

За да тествате този скрипт, отидете в уеб браузъра си и посетете домейн името на вашия сървър или IP адрес, следвано от името на скрипта, което в този случай е info.php:

http://server_domain_or_IP/info.php

Ето пример на стандартната PHP уеб страница:

Тази страница предоставя информация за вашия сървър от гледна точка на PHP. Тя е полезна за отстраняване на проблеми и за уверяване, че настройките ви се прилагат правилно.

Ако виждате тази страница в браузъра си, значи вашата PHP инсталация работи коректно.

След като проверите съответната информация за вашия PHP сървър чрез тази страница, е най-добре да изтриете създадения файл, тъй като той съдържа чувствителна информация за вашата PHP среда и вашия Ubuntu сървър. Използвайте командата rm, за да направите това:

sudo rm /var/www/your_domain/info.php

Винаги можете да създадете отново тази страница, ако в бъдеще имате нужда от достъп до информацията.

Тестване на връзката с базата данни от PHP (по избор)

Ако искате да проверите дали PHP може да се свърже с MySQL и да изпълнява заявки към базата данни, можете да създадете тестова таблица с тестови данни и да извършвате заявки към нея от PHP скрипт. Преди да направите това, трябва да създадете тестова база данни и нов MySQL потребител, правилно конфигуриран за достъп до нея.

Създайте база данни с име example_database и потребител с име example_user. Можете да замените тези имена с различни стойности.

Първо, свържете се с MySQL конзолата, използвайки акаунта root:

За да създадете нова база данни, изпълнете следната команда от MySQL конзолата:

CREATE DATABASE example_database;

Сега създайте нов потребител и му предоставете пълни привилегии върху създадената от вас персонализирана база данни.

Следната команда създава нов потребител с име example_user, който се удостоверява с метода caching_sha2_password. Задаваме паролата за този потребител като password, но вие трябва да замените тази стойност със сигурна парола по ваш избор:

CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';

Забележка: Предходната команда ALTER USER задава root MySQL потребителят да се удостоверява с помощта на плъгина caching_sha2_password. Според официалната документация на MySQL, caching_sha2_password е предпочитаният плъгин за удостоверяване на MySQL, тъй като предоставя по-сигурно шифриране на паролите в сравнение с по-стария, но все още широко използван, mysql_native_password.

Въпреки това някои версии на PHP не работят надеждно с caching_sha2_password. PHP съобщава, че този проблем е решен от PHP 7.4 нататък, но ако срещнете грешка при опит за вход в phpMyAdmin по-късно, може да искате да настроите root да се удостоверява с mysql_native_password вместо това:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Сега предоставете права на този потребител върху базата данни example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

Това ще предостави на потребителя example_user пълни привилегии върху базата данни example_database, като в същото време ще предотврати този потребител от създаване или променяне на други бази данни на вашия сървър.

Сега напуснете MySQL конзолата с:

Тествайте дали новият потребител има правилни привилегии, като влезете отново в MySQL конзолата, този път използвайки потребителските данни за вход:

Забележете флага -p в тази команда, е който ще ви подкани да въведете паролата, използвана при създаването на потребителя example_user. След като влезете в MySQL конзолата, потвърдете, че имате достъп до базата данни example_database:

Това ще ви покаже следното:

Output
+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

След това създайте тестова таблица с име todo_list. От MySQL конзолата изпълнете следната команда:

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;

Ето изходът:

Output
+---------+--------------------------+
| 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)

След като потвърдите, че имате валидни данни в тестовата си таблица, напуснете MySQL конзолата:

Сега можете да създадете PHP скрипта, който ще се свърже с MySQL и ще извърши заявки към вашето съдържание. Създайте нов PHP файл в основната ви директория за уебсайт, използвайки предпочитания от вас редактор:

nano /var/www/your_domain/todo_list.php

Следният PHP скрипт се свързва с MySQL базата данни и изпълнява заявка за съдържанието на таблицата todo_list, показвайки резултатите в списък. Ако има проблем с връзката към базата данни, той ще генерира изключение.

Добавете този код във вашия todo_list.php скрипт, като не забравяте да замените example_user и password с вашите собствени:

<?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 адрес, конфигуриран за вашия уебсайт, следван от /todo_list.php:

http://your_domain_or_IP/todo_list.php

Тази уеб страница трябва да покаже съдържанието, което сте вмъкнали във вашата тестова таблица:

Това означава, че вашата PHP среда е готова да се свързва и взаимодейства с вашия MySQL сървър.

Заключение

В това ръководство изградихте гъвкава основа за предоставяне на PHP уебсайтове и приложения, използвайки Apache като уеб сървър и MySQL като система за управление на бази данни.

Като следваща стъпка, трябва да се уверите, че връзките към вашия уеб сървър са защитени чрез предоставянето им чрез HTTPS. За да постигнете това, можете да използвате Let’s Encrypt, за да защитите вашия сайт с безплатен сертификат TLS/SSL или да си създадете свой собствен SSL сертифициращ орган (CA) за локално HTTPS разработване на сайтове.

Петьо Лазаров


Добре дошли в нашия техномагически свят!

Аз съм Петьо Лазаров, Web Developer, и този блог е порталът ми към вълшебството на технологията.

Всеки ред написан код, всяка иновация - това са част от магията, която обичам да създавам. От големи технологични предизвикателства до спонтанни моменти на вдъхновение, ви каня да споделяте този вълшебен път с мен.

Благодаря за това, че сте тук, и се подгответе за изцяло ново измерение от техническо вълшебство! 🌌✨🖥️