Instalace LAMP (Linux, Apache, MySQL, PHP) na Ubuntu

By | 14/08/2020

Instalace LAMP (Linux, Apache, MySQL, PHP) na Ubuntu

Motivace:

Instalace LAMP balíčku je vhodná pro budování dynamických webových stránek a webových aplikací. Je také zkratkou pro Linux, Apache, MySQL a PHP. Bude nainstalován a zprovozněn Apache jako HTTP server, MySQL jako relační databázový systém a otestována funkčnost PHP.

OS:

Implementace byla prováděna na Ubuntu 18.04 LTS.

Implementace [1]:

1. Instalace webového serveru Apache:

Aktualizace seznamu balíčků z repozitářů:

sudo apt-get update

Instalace Apache serveru:

sudo apt-get install apache2

Ujistit se, že firewall má aplikační profil pro Apache:

sudo ufw app list

Výstup příkazu sudo ufw app list by měl obsahovat tyto aplikační profily:

Available applications:
  Apache
  Apache Full
  Apache Secure

Profile Apache Full by měl povolovat porty 80 a 443:

sudo ufw app info "Apache Full"

Výstup příkazu sudo ufw app info “Apache Full”:

Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.

Ports:
80,443/tcp

Pokud tomu tak není, příkaz níže povoluje příchozí provoz pro HTTP a HTTPS u profilu Apache Full:

sudo ufw allow in "Apache Full"

Ověření funkce Apache se provede zadáním IP adresy serveru do vyhledávače:

http://ip_adresa_serveru

Podobná “Default Page” by měla být viděna v prohlížeči:


IP adresu lze zjistit pomocí příkazu:

ip a

Alternativně pokud je či bude webový server namapovaný na veřejnou IP adresu, dá se zjistit v CLI pomocí nástroje curl přes který se kontaktuje http://icanhazip.com:

sudo apt install curl 
curl http://icanhazip.com

2. Instalace MySQL databáze:

sudo apt install mysql-server

Po instalaci se spustí jednoduchý “security” script, který je předinstalovaný s MySQL. Ten odstraňuje nebezpečná výchozí nastavení a zamyká přístup do databázového systému:

sudo mysql_secure_installation

Výstup příkazu sudo mysql_secure_installation:

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

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:y

Pokud se povolí “VALIDATE PASSWORD PLUGIN”, budou všechna hesla, která neodpovídají zadaným kritériím zamítnuta. Bude zvoleno “y” – povolit. Tímto bude otevřena nabídka k výběru úrovně ověření hesla. Bude zvolena úroveň zabezpečení MEDIUM – 1:

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

Bez ohledu na to, zda byl nastaven setup pro VALIDATE PASSWORD plugin, script požádá o nastavení MySQL hesla pro root uživatele. Je doporučeno vložit silné heslo:

Please set the password for root here.

New password:

Re-enter new password:

Po zadaní hesla pro uživatele root se vyhodnotí jeho síla hesla. 100 % značí dostatečné silné heslo. Jsme-li spokojeni s heslem potvrdíme “N”:

If you enabled password validation, you’ll be shown the password 
strength for the root password you just entered and your server will ask
if you want to change that password. If you are happy with your current
password, enter N for “no” at the prompt: N

Dalšími otázky bude, zda si přejeme vymazat anonymní uživatelé, zda chceme zakázat přihlášení pod rootem vzdáleně, vymazat “test database” a reload tabulek. Všechny tyto otázky potvrdit “y”:

Opětovné načtení tabulek oprávnění zajistí všechny změny
dosud vyrobené se projeví okamžitě.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

Uživatel root je ve výchozím nastavení pod MySQL 5.7 a vyšší verzi nastaven tak, aby se autentizoval pomocí auth_socket a ne pomocí hesla. To v mnoha případech umožnuje vyšší zabezpečení a použitelnost, ale může komplikovat věci, když je potřeba povolit uživateli přístup např. do PhpMyAdmin. Pokud je preferováno přihlášení heslem jako root k MySQL, je nutné způsob ověřování auth_socket změnit na mysql_native_password. To se provede otevřením mysql:

sudo mysql

Výpis autentizační metody pro každého MySQL uživatele se zjistí příkazem:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

Výpis příkazu SELECT user,authentication_string,plugin,host FROM mysql.user, ukazuje, že uživatel root se autentizuje pomocí pluginu auth_socket:

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *1D50613E1AF57B979C439C663317678F39250046 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Aby se uživatel root autentizoval pomocí hesla, aplikuje se příkaz níže. Doporučuji zvolit silné heslo:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NejakeSilneHeslo';

Příkaz FLUSH PRIVILEGES; aplikuje nové změny:

mysql> FLUSH PRIVILEGES;

Ověření změn se provede příkazem:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;

Výpis příkazu SELECT user,authentication_string,plugin,host FROM mysql.user;, ukazuje, že uživatel root se již autentizuje pomocí hesla:

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *69472483E7628F2658CB557C382027403E1E6DD7 | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *1D50613E1AF57B979C439C663317678F39250046 | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Všechno nastaveno, nyní je možné opustit MySQL shell příkazem:

mysql> exit

Pozn. Nyní se již provede přihlášení pod rootem do MySQL pomocí mysql -u root -p příkazu.

3. Instalace PHP:

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

Otevřít dir.conf ve složce /etc/apache2/mods-enabled/:

sudo vim /etc/apache2/mods-enabled/dir.conf

Defaultně Apache nejdříve vyhledává index.html. Aby preferoval PHP soubory před ostatními, vložit soubor index.php na začátek. Výsledný soubor pak bude vypadat takto:

<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

Restartovat Apache:

sudo systemctl restart apache2

Ověření funkce služby Apache:

sudo systemctl status apache2

Výstup příkazu sudo systemctl status apache2 by měl ukázat, že služba Apache server běží:

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Sun 2020-07-19 10:09:57 CEST; 3h 42min ago
  Process: 11447 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 11452 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 11457 (apache2)
    Tasks: 8 (limit: 2319)
   CGroup: /system.slice/apache2.service
           ├─11457 /usr/sbin/apache2 -k start
           ├─11458 /usr/sbin/apache2 -k start
           ├─11459 /usr/sbin/apache2 -k start
           ├─11460 /usr/sbin/apache2 -k start
           ├─11461 /usr/sbin/apache2 -k start
           ├─11462 /usr/sbin/apache2 -k start
           ├─11463 /usr/sbin/apache2 -k start
           └─11464 /usr/sbin/apache2 -k start

4. Konfigurace Virtualhostu:

Koncept virtualhostů je způsob, jak provozovat více webů (virtuálních webů) na jednom stroji pod jedinou IP adresou. Server podle příchozího požadavku HTTP GET v poli Host pozná, o jaký web se jedná.

Apache má defaultně nastaven jeden webový server umístěný v adresáři /var/www/html. To může být nepraktické, pokud je či bude hostováno více webů na jednom serveru. Místo úpravy souboru v /var/www/html, bude vytvořena nová složka doménového jména nového webu v /var/www/ adresáři. Jako příklad bude zvoleno doménové jméno mojedomena.

Vytvoření složky podle doménového jména:

sudo mkdir /var/www/mojedomena

Nastavení vlastnictví složky mojedomena:

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

Oprávnění složky a souborů by měla být nastavená správně, nicméně pro jistotu aplikovat příkaz:

sudo chmod -R 755 /var/www/mojedomena

Pro vytvoření ukázkové stránky vytvořit soubor index.html ve složce /var/www/mojedomena:

vi /var/www/mojedomena/index.html

a vložit ukázkový HTML kód:

<html>
    <head>
        <title>Toto je mojedomena!</title>
    </head>
    <body>
        <h1>Povedlo se! mojedomena funguje!</h1>
    </body>
</html>

Aby mohl Apache tento obsah obsluhovat, je nutné vytvořit soubor virtuálního hostitele. Místo přímé úpravy defaultního konfiguračního souboru v /etc/apache2/sites-available/000-default.conf se vytvoří nový soubor mojedomena.conf ve složce /etc/apache2/sites-available/:

sudo vim /etc/apache2/sites-available/mojedomena.conf

A vložit následující konfigurační blok:

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

Legenda [2]:

ServerName – určuje jméno virtuálního serveru. Jedná se o nejdůležitější direktivu podle které Apache rozlišuje jednotlivé servery podle hlavičky v HTTP požadavku
DocumentRoot – cesta k adresáři webu s jeho soubory
ServerAdmin – udává emailovou adresu administrátora
ServerAlias – umožňuje nastavit další možné varianty jména virtuálního serveru
ErrorLog – určuje cestu k chybovému logu příslušného virtuálního serveru
CustomLog – určuje cestu k běžnému logu příslušného virtuálního serveru

Pozn. Hvězdička v direktivě <VirtualHost *:80> značí, že daný virtuální web bude k dispozici na všech IP adresách, na kterých Apache naslouchá. 80 je definice TCP portu na kterém web standardně naslouchá.

Aktivace konfiguračního souboru mojedomena.conf příkazem:

sudo a2ensite mojedomena.conf

Deaktivace původního konfiguračního souboru příkazem:

sudo a2dissite 000-default.conf

Otestování konfigurace:

sudo apache2ctl configtest

Vystup příkazu sudo apache2ctl configtest by měl ukázat:

Syntax OK

Pro aplikaci změn restartovat Apache:

sudo systemctl restart apache2

Při otestování funkčnosti doménového jména na serveru by se mělo objevit v prohlížeči něco podobného:

Instalace LAMP - apache server

Pokud se otestování funkčnosti doménového jména provádí na vzdáleném PC, místo mojedomena vložit IP adresu serveru.

5. Test funkce PHP:

Aby bylo ověřeno, že PHP správně pracuje, bude vytvořen jednoduchý PHP script info.php:

sudo vim /var/www/mojedomena/info.php

A vložit následující kód:

<?php
phpinfo();
?>

Otestování PHP:

http://mojedomena/info.php

Mělo by se objevit něco podobného níže. Stránka obsahuje některé základní informace o serveru z pohledu PHP:

Instalace LAMP - PHP

Po tomto testu soubor odstranit, aby nebyly poskytnuty informace o serveru neoprávněným uživatelům, a to pomocí příkazu:

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

Vše hotovo!

Dále je možné navázat na instalaci WordPressu:

Instalace WordPress na Ubuntu (Install WordPress Ubuntu)

Zdroje:

[1] https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-ubuntu-18-04

[2] https://books.google.cz/books?id=j7BaAgAAQBAJ&pg=PA124&lpg=PA124&dq=virtualhost+servername+serveralias+vyznam&source=bl&ots=ltujA6NsX5&sig=ACfU3U0DxCzJiSDvB5BT5kdMiibG6ftEwg&hl=en&sa=X&ved=2ahUKEwiym6vEm-DqAhWB-aQKHcsdBaIQ6AEwD3oECA0QAQ#v=onepage&q=virtualhost%20servername%20serveralias%20vyznam&f=false

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *