10 kwi

Instalacja LAMP ? w Ubuntu 18

Konfiguracja LAMP w Ubuntu 18

W instrukcji poniżej pokażemy w jaki sposób można zainstalować podstawowy zestaw LAMP (Apache, MySQL, PHP) do uruchomienia strony internetowej na PHP. Wszystkie komponenty są darmowe i open source, i są jedne z najczęściej wykorzystywanych do uruchomienia stron z dynamiczną treścią. Czyli to będzie: Linux jako system operacyjny, Apache jako serwer www, MariaDB lub MySQL jak serwer bazy danych i PHP jako interpretator języka programowania PHP do generacji stron.

Zaczynamy

Na początek sprawdzamy jaką wersję systemu operacyjnego posiadamy na naszej maszynie, ponieważ poniższe kroki będą dotyczyły Ubuntu 18.04.

Zapraszamy zapoznać się z naszymi VPS SSD, ponieważ z kodem RABATNABLOG dostaniesz 15% na dowolną płatność za serwer dla VPN!

Aktualizujemy system i paczki:

sudo apt update && sudo apt upgrade

Szybka Instalacja LAMP

Zamiast instalacji pojedynczych komponentów LAMP (Apache, MySQL, oraz PHP) możemy skorzystać z gotowego instalatora Tasksel, który zrobi wszystko jednym poleceniem, co może znacznie przyspieszyć konfigurację serwera.

Instalujemy Tasksel, jeżeli nie mamy na serwerze tego pakietu:

sudo apt install tasksel

Instalujemy zestaw LAMP przy pomocy Tasksel:

sudo tasksel install lamp-server

Instalacja pojedynczych pakietów LAMP

Jeżeli nie chcesz instalować oprogramowanie automatycznym instalatorem, można to bez problemu zrobić ręcznie:

  • instalacja Apache 2.4 z repozytorium Ubuntu:
sudo apt install apache2
  • instalacja bazy danych MySQL:
sudo apt install mysql-server
  • instalacja PHP z rozszerzeniami i wsparciem Apache, MySQL::
sudo apt install php7.2 libapache2-mod-php7.2 php-mysql
  • (opcjonalnie) można zainstalować od razu rozszerzenia cURL, JSON oraz CGI:
sudo apt install php-curl php-json php-cgi

Konfiguracja pojedynczych pakietów LAMP

Apache

  • Ustawienie KeepAlive pozwoli serwerowi www Apache lepiej zarządzać pamięcią i zmniejszyć obciążenie od działającej strony. KeepAlive przyspiesza działanie strony jeżeli na serwerze zabraknie wolnej pamięci RAM, a konkretnie Apache będzie korzystać z już otwartych połączeń zamiast tworzenia nowych dla każdego zapytania.

Otwieramy plik konfiguracyjny Apache – apache2.conf:

nano /etc/apache2/apache2.conf
KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 5
Ustawienie MaxKeepAliveRequests konfiguruje maksymalną ilość zapytań w ciągu jednego połączenia. 50 jest w miarę odpowiednią liczbą dla większości projektów, jednak jeżeli potrzebujesz, można bez problem zwiększyć go. Ustawienie KeepAliveTimeout kontroluje jak długo (ile sekund) serwer będzie czekał na nowe zapytania od obecnych odwiedzających. Ustawienie na 5 zmniejszy wykorzystanie RAM.
  • Domyślnie moduł MPM (“multi-processing module”) może być wyłączony lub nie skonfigurowany, ale mpm_prefork kompatybilny z większością systemów operacyjnych. Otwieramy mpm_prefork.conf i konfigurujemy według ustawień poniżej dla 2 Gb RAM w naszym przypadku:
nano /etc/apache2/mods-available/mpm_prefork.conf
StartServers 4
MinSpareServers 3
MaxSpareServers 40
MaxRequestWorkers 200
MaxConnectionsPerChild 10000
  • Włączamy zaporę sieciową (firewall) aby odblokować ruch do stron. Opisujemy kroki działania dla konfiguracji zapory UFW na serwerze.

a. Sprawdzamy dostępność portów, które są potrzebne dla profilu  Apache Full:

sudo ufw app info "Apache Full"

Porty 80 oraz 443 muszą być włączone (enabled) dla Apache Full.

b. Odblokowujemy ruch poprzez HTTP i HTTPS dla profilu Apache Full:

sudo ufw allow in "Apache Full"
  • wyłączamy logowanie wydarzeń i włączamy prefork:
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
  • Uruchomiamy ponownie Apache:
sudo systemctl restart apache2

Virtual Hosts

Można skonfigurować domeny (virtual hosts) w kilka sposobów, jednak polecamy opisany poniżej. W każdym kroku należy zamienić example.com na własną domenę.

  • Tworzymy kopie domyślnego pliku konfiguracyjnego Apache dla nowej strony:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
  • Otwieramy nowy  plik domeny example.com w edytorze. Odkomentujemy opcję ServerName i zmieniamy ją na naszą domenę. Wpisujemy ścieżkę folderu głównego domeny oraz ścieżkę do przechowywania logów, i dodajemy blok z Directory:
nano /etc/apache2/sites-available/example.com.conf
<Directory /var/www/html/example.com/public_html>
        Require all granted
</Directory>
<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/example.com/public_html

        ErrorLog /var/www/html/example.com/logs/error.log
        CustomLog /var/www/html/example.com/logs/access.log combined

</VirtualHost>
Przykład pliku powyżej nie zawiera żadnych komentarzy, które są domyślnie w pliku, można ich zostawić lub usunąć, nie ma różnicy 🙂

Opcja ServerAlias pozwala na konfiguracje kilku różnych domen lub poddomen (subdomen) dla jednej domeny. W przykładzie skierowaliśmy użytkowników na ten sam folder dla domen example.com i www.example.com.

  • Tworzymy foldery zgodnie z ustawieniem wyżej:
sudo mkdir -p /var/www/html/example.com/{public_html,logs}
Warto sprawdzić czy nie została dodana spacja pomiędzy public_html oraz logs, bo to może utworzyć folder o nazwie {public_html, i spowoduje problemy z Apache.
  • Przypisujemy właściciela do folderu public_html na zmienną $USER:
sudo chown -R $USER:$USER /var/www/html/example.com/public_html
  • Ustawiamy uprawnienia do folderu public_html:
sudo chmod -R 755 /var/www/html/example.com/public_html
  • Przypisujemy plik konfiguracyjny z sites-available do folderu sites-enabled:
sudo a2ensite example.com
Aby wyłączyć stronę, można uruhcomić a2dissite example.com.
  • Wyłączamy domyślny host aby zwiększyć bezpieczeństwo serwera:
sudo a2dissite 000-default.conf
  • Uruchamiamy ponownie Apache:
sudo systemctl reload apache2

Hosty wirtualne (Virtual hosts) teraz są pomyślnie skonfigurowane, aby skierować domenę na serwer – musisz sprawdzić wpisy A Twojej domeny u Rejestratora domeny lub na serwerach DNS, muszą być skierowane na adres IP serwera.

Dodanie kolejnych stron, domen, odbywa się w taki sam sposób i według kroków opisanych wyżej, dla każdego po kolei.

MySQL

  • Logujemy się do terminalu SQL – MySQL:
sudo mysql -u root
Autoryzacja, Logowanie się do MySQL
Domyślnie MySQL skonfigurowany w taki sposób, żeby korzystać z wtyczki auth_socket. Taka metoda autoryzacji pozwala na logowanie się do bazy danych jako root, jeżeli jesteśmy połączeni z serwerem jako root, lub jako użytkownik z uprawnieniami sudo (czyli przy pomocy sudo mysql -u root). W tym przypadku hasło jest niepotrzebne dla użytkownika root MySQL:

mysql> SELECT user,host,authentication_string,plugin FROM mysql.user WHERE user='root';
+------+-----------+-----------------------+-------------+
| user | host | authentication_string | plugin |
+------+-----------+-----------------------+-------------+
| root | localhost | | auth_socket |
+------+-----------+-----------------------+-------------+
1 row in set (0.02 sec)

Można korzystać z wtyczki auth_socket , ale możemy zabezpieczyć dostęp hasłem, jak poniżej:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'password';
mysql> FLUSH PRIVILEGES;

Po wykonaniu zmian w dostępach, logować się będziemy z dodaniem parametru -p:

mysql -u root -p
  • Tworzymy bazę danych oraz użytkownika z uprawnieniami do niej. W naszym przypadku baza danych nazywa się webdata, i użytkownik webuser, oraz hasło password. Upewnij się że podałeś własne hasło, które różni się od hasła do root w MySQL:
CREATE DATABASE webdata;
GRANT ALL ON webdata.* TO 'webuser' IDENTIFIED BY 'password';
  • Wylogujemy się z terminalu SQL:
quit
  • Uruchamiamy narzędzie mysql_secure_installation do skonfigurowania reguł bezpieczeństwa. Narzędzie również zapyta o to, czy chcemy zmienić hasło dla użytkownika root MySQL, co możemy pominąć:
sudo mysql_secure_installation

Wpisujemy Y na następne pytania:

  1. Remove anonymous users?
  2. Disallow root login remotely?
  3. Remove test database and access to it?
  4. Reload privilege tables now?

PHP

  • Edytujemy plik konfiguracyjny, który znajduje się w /etc/php/7.2/apache2/php.ini aby włączyć wyświetlenie błędów, logowanie oraz zwiększyć wydajność. Proponujemy zmiany poniżej:
nano /etc/php/7.2/apache2/php.ini
error_reporting = E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR
max_input_time = 30
error_log = /var/log/php/error.log
Na początku pliku php.ini znajdują się zakomentowane przykłady ze średnikiem (;), który wyłączają opcje/konfiguracje, znajdujące się po nim. Upewnij się czy linia, którą edytujesz nie zawiera średnika na początku.
  • Tworzymy folder do logów i ustawiamy uprawnienia aby Apache mógł edytować pliki w nim:
sudo mkdir /var/log/php
sudo chown www-data /var/log/php
  • Uruchomiamy ponownie Apache:
sudo systemctl restart apache2
Jeżeli planujesz trzymać na serwerze z LAMP – stronę na WordPress, musisz dodatkowo zainstalować następne pakiety: sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc

Opcjonalnie: Sprawdzenie i testowanie zainstalowanego oprogramowania LAMP

Poniżej utworzymy testową stronę w języku PHP, którą Apache będzie w stanie wyświetlić oraz sprawdzimy czy działa połączenie z bazą danych MySQL. To może być przydatne aby zidentyfikować na którym kroku popełniliśmy błąd, albo jaki element nie działa.

Wklejamy następny kod do nowego pliku phptest.php, w folderze public_htm. Zmieniamy nazwę webuser oraz hasło do użytkownika bazy danych, którego utworzyliśmy wcześniej:

nano /var/www/html/example.com/public_html/phptest.php
<html>
<head>
    <title>PHP Test</title>
</head>
    <body>
    <?php echo '<p>Hello World</p>';

    // In the variables section below, replace user and password with your own MySQL credentials as created on your server
    $servername = "localhost";
    $username = "webuser";
    $password = "password";

    // Create MySQL connection
    $conn = mysqli_connect($servername, $username, $password);

    // Check connection - if it fails, output will include the error message
    if (!$conn) {
        die('<p>Connection failed: </p>' . mysqli_connect_error());
    }
    echo '<p>Connected successfully</p>';
    ?>
</body>
</html>

Przechodzimy do example.com/phptest.php w przeglądarce, jeżeli wszystko działa poprawnie, zobaczymy komunikat “Connected successfully”. Jeżeli coś nie działa, zobaczymy komunikaat z błędem.

Usuwamy plik do testów:

sudo rm /var/www/html/example.com/public_html/phptest.php

FAQ

  • Jeżeli strona nie ładuje się w cale, sprawdzamy czy Apache jest uruchomiony, i uruchomiamy go ponownie, jeżeli jest taka potrzeba:
sudo systemctl status apache2
sudo systemctl restart apache2
  • Jeżeli strona się ładuje, ale wyświetla się standardowa domyślna strona Apache – “Congratulations”, wracamy do działu z konfiguracją Virtual Host, i sprawdzamy czy opcja z DocumentRoot  odpowiada naszej ścieżce do folderu example.com/public_html.
  • Jeżeli strona wyświetla listę katalogów/plików – “Index of /“, musimy spróbować utworzyć plik do testu index.html.

O tym jak skonfigurować OpenVPN na Ubuntu 18 – pisaliśmy chwilę wcześniej, zapraszamy do zapoznania się z artykułem.

Zapraszamy zapoznać się z naszymi VPS SSD, ponieważ z kodem RABATNABLOG dostaniesz 15% na dowolną płatność za serwer dla VPN!