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.
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
- 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>
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}
- 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
- 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
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:
- Remove anonymous users?
- Disallow root login remotely?
- Remove test database and access to it?
- 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
- 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
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.
Comments (1)
Programista
Osobiście zawsze odradzam konfigurowanie serwerów dla większych projektów bez odpowiedniej wiedzy i umiejętności. Projekty domowe lub hobbystyczne jak najbardziej, ale coś bardziej "poważnego" tylko i wyłącznie z odpowiednim doświadczeniem lub na hostingu współdzielonym..backupy same się nie zrobią :)