Last Updated on 04/07/2023 by administrator
Instalace LAMP (Linux, Apache, MySQL, PHP) na Ubuntu
Instalace LAMP
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 instalace LAMP 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
Zobrazí přehled konfigurace všech virtualhostů:
apachectl -S
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:
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:
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: