Menu
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

LAMP Stack — instalacja i konfiguracja na Ubuntu

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Hosting

LAMP (Linux + Apache + MySQL + PHP) to klasyczny i sprawdzony stos technologiczny do hostowania aplikacji webowych. Napędza większość instalacji WordPress, Drupal, Joomla i niezliczone aplikacje PHP na świecie. Mimo że Nginx zyskuje popularność, Apache wciąż wyróżnia się elastycznością (zwłaszcza .htaccess) i szeroką kompatybilnością. Ten przewodnik przeprowadzi Cię przez pełną instalację na Ubuntu 22.04/24.04.

Krok 1: Instalacja Apache

apt update
apt install -y apache2

# Sprawdzenie statusu
systemctl status apache2

# Firewall — otwórz port 80 i 443
ufw allow 'Apache Full'
ufw status

# Test — otwórz http://IP_TWOJEGO_VPS w przeglądarce

Krok 2: Instalacja MySQL

apt install -y mysql-server

# Zabezpieczenie instalacji (URUCHOM KONIECZNIE!)
mysql_secure_installation
# Kreator pyta o:
# - poziom walidacji hasła (2 = silne)
# - nowe hasło roota
# - usunięcie anonimowych użytkowników (Y)
# - wyłączenie zdalnego logowania root (Y)
# - usunięcie bazy test (Y)
# - reload uprawnień (Y)

# Sprawdzenie wersji
mysql --version
# Tworzenie bazy i użytkownika dla aplikacji
mysql -u root -p

CREATE DATABASE moja_aplikacja CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'silne-haslo-bazy';
GRANT ALL PRIVILEGES ON moja_aplikacja.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Krok 3: Instalacja PHP

# PHP 8.2 z najpopularniejszymi modułami
apt install -y php8.2 php8.2-cli php8.2-fpm \
    php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring \
    php8.2-xml php8.2-zip php8.2-intl php8.2-bcmath

# Sprawdzenie wersji
php --version

# Moduł Apache dla PHP (mod_php)
apt install -y libapache2-mod-php8.2

# Restart Apache
systemctl restart apache2

Krok 4: Apache Virtual Host

Każda domena powinna mieć własny plik VirtualHost w /etc/apache2/sites-available/:

# /etc/apache2/sites-available/moja-domena.pl.conf

<VirtualHost *:80>
    ServerName moja-domena.pl
    ServerAlias www.moja-domena.pl
    DocumentRoot /var/www/moja-domena.pl/public

    <Directory /var/www/moja-domena.pl/public>
        AllowOverride All          # zezwól na .htaccess
        Require all granted
        Options -Indexes           # wyłącz listowanie katalogów
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/moja-domena-error.log
    CustomLog ${APACHE_LOG_DIR}/moja-domena-access.log combined
</VirtualHost>
# Utwórz katalog i ustaw uprawnienia
mkdir -p /var/www/moja-domena.pl/public
chown -R www-data:www-data /var/www/moja-domena.pl

# Aktywacja VirtualHost
a2ensite moja-domena.pl.conf

# Wyłączenie domyślnej konfiguracji (opcjonalne)
a2dissite 000-default.conf

# Włącz mod_rewrite (wymagany przez WordPress)
a2enmod rewrite

# Sprawdzenie konfiguracji
apache2ctl configtest

# Przeładowanie Apache
systemctl reload apache2

PHP-FPM z mpm_event (wydajność)

Domyślna konfiguracja Apache używa mod_php z mpm_prefork — stara architektura, która tworzy nowy proces na każde połączenie. Lepszym rozwiązaniem jest mpm_event + PHP-FPM:

# Przełącz z prefork na event
a2dismod php8.2 mpm_prefork
a2enmod mpm_event proxy_fcgi setenvif

# Włącz PHP-FPM handler
a2enconf php8.2-fpm

# Uruchom PHP-FPM
systemctl enable php8.2-fpm
systemctl start php8.2-fpm

# Restart Apache
systemctl restart apache2

# Sprawdzenie czy PHP-FPM jest aktywny
systemctl status php8.2-fpm

Testowanie instalacji PHP

# Utwórz testowy plik PHP
echo "<?php phpinfo(); ?>" > /var/www/moja-domena.pl/public/info.php

# Otwórz http://moja-domena.pl/info.php
# Powinnaś zobaczyć stronę z informacjami o PHP

# Po teście USUŃ plik — ujawnia konfigurację serwera!
rm /var/www/moja-domena.pl/public/info.php

Bezpieczeństwo Apache

# /etc/apache2/conf-available/security.conf

# Ukryj wersję Apache
ServerTokens Prod
ServerSignature Off

# Wyłącz TRACE (ochrona przed XST)
TraceEnable Off

# Nagłówki bezpieczeństwa
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options SAMEORIGIN
Header always set X-XSS-Protection "1; mode=block"
# Włącz moduł headers (dla nagłówków bezpieczeństwa)
a2enmod headers
systemctl reload apache2

Darmowy certyfikat SSL (Let's Encrypt)

Produkcyjny LAMP Stack bez HTTPS to dziś standard, którego nie da się obronić - przeglądarki oznaczają strony HTTP jako "niezabezpieczone", a Google traktuje HTTPS jako sygnał rankingowy. Certbot automatyzuje cały proces łącznie z odnawianiem:

# Instalacja Certbota z pluginem Apache
apt install -y certbot python3-certbot-apache

# Wygenerowanie i instalacja certyfikatu (wymaga działającego VirtualHost + DNS wskazującego na serwer)
certbot --apache -d moja-domena.pl -d www.moja-domena.pl

# Certbot doda automatyczne przekierowanie HTTP -> HTTPS (opcja wybierana w kreatorze)

# Test automatycznego odnawiania (certyfikaty ważne 90 dni)
certbot renew --dry-run

# Sprawdzenie timera odnawiania
systemctl status certbot.timer

Firewall (UFW) - pełna konfiguracja

Krok 1 otwierał tylko ruch HTTP/HTTPS. Na produkcyjnym VPS warto od razu ustawić politykę domyślną i ograniczyć dostęp do SSH przed atakami brute-force:

# Domyślna polityka: blokuj przychodzące, zezwalaj na wychodzące
ufw default deny incoming
ufw default allow outgoing

# SSH (zmień port jeśli używasz niestandardowego)
ufw allow OpenSSH

# Ogranicz próby logowania SSH (max 6 połączeń / 30s z tego samego IP)
ufw limit OpenSSH

# HTTP + HTTPS (Apache Full = porty 80 i 443)
ufw allow 'Apache Full'

# Aktywacja firewalla
ufw enable

# Weryfikacja reguł
ufw status verbose

Rozwiązywanie typowych problemów (troubleshooting)

Cztery najczęstsze awarie świeżej instalacji LAMP i jak je szybko zdiagnozować - pełne wyjaśnienia z przyczyną i rozwiązaniem znajdziesz też w sekcji FAQ poniżej.

# 1. Apache nie startuje - sprawdź dokładny błąd
systemctl status apache2
journalctl -xeu apache2 --no-pager | tail -30
apache2ctl configtest          # musi zwrócić "Syntax OK"
ss -tlnp | grep :80            # czy port 80 jest już zajęty

# 2. 403 Forbidden - uprawnienia i konfiguracja Directory
chown -R www-data:www-data /var/www/moja-domena.pl
chmod -R 755 /var/www/moja-domena.pl
tail -f /var/log/apache2/moja-domena-error.log

# 3. PHP się nie wykonuje (przeglądarka proponuje pobranie pliku)
apache2ctl -M | grep php        # mod_php: powinien być widoczny php_module
systemctl status php8.2-fpm     # PHP-FPM: usługa musi być active (running)
ls -la /run/php/                # PHP-FPM: socket musi istnieć

# 4. MySQL "Access denied" / "Connection refused"
systemctl status mysql
mysql -u app_user -p -h localhost moja_aplikacja   # test połączenia jako aplikacja
grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf

Kopie zapasowe (backup) bazy danych i plików

Backup skonfigurowany po incydencie to za późno. Poniższy skrypt eksportuje bazę i pliki aplikacji, a crontab uruchamia go automatycznie co noc:

# /usr/local/bin/backup-lamp.sh
#!/bin/bash
set -e
DATE=$(date +%F)
BACKUP_DIR=/var/backups/lamp
mkdir -p "$BACKUP_DIR"

# Baza danych (--single-transaction = bez blokowania tabel InnoDB)
mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --single-transaction moja_aplikacja \
    > "$BACKUP_DIR/db-$DATE.sql"

# Pliki aplikacji
tar -czf "$BACKUP_DIR/www-$DATE.tar.gz" /var/www/moja-domena.pl

# Usuń kopie starsze niż 14 dni
find "$BACKUP_DIR" -type f -mtime +14 -delete
# Uprawnienia + harmonogram (crontab -e)
chmod +x /usr/local/bin/backup-lamp.sh

# Codziennie o 3:00 w nocy
0 3 * * * /usr/local/bin/backup-lamp.sh >> /var/log/backup-lamp.log 2>&1

Kopie trzymane wyłącznie na tym samym serwerze nie chronią przed awarią dysku - docelowo przesyłaj je poza serwer (np. rsync na inny host albo storage obiektowy z retencją).

LAMP vs LEMP — kiedy co wybrać

Cecha LAMP (Apache) LEMP (Nginx)
.htaccess Pełne wsparcie Brak (trzeba przepisać na server block)
Wydajność statycznych plików Dobra Lepsza
Zużycie RAM Wyższe (prefork) Niższe (event-driven)
WordPress Działa natywnie Wymaga konfiguracji fastcgi
Dokumentacja i support Bardzo duże community Duże community

Najczęstsze pytania

Czym jest LAMP stack? +
LAMP to akronim od: Linux (system operacyjny), Apache (serwer HTTP), MySQL/MariaDB (baza danych) i PHP (język skryptowy). To najpopularniejszy stos technologiczny do hostowania aplikacji webowych — używany przez WordPress, Drupal, Joomla i miliony innych aplikacji PHP. Działa na większości dystrybucji Linuxa i jest domyślnym stackiem na wielu hostingach współdzielonych.
Jaka jest różnica między LAMP a LEMP? +
LEMP zastępuje Apache serwerem Nginx (stąd "E" — wymawiane "engine-x"). Nginx jest szybszy przy obsłudze wielu równoczesnych połączeń i plików statycznych, zużywa mniej RAM niż Apache. Jednak Apache ma lepsze wsparcie dla .htaccess (przydatne dla WordPress/starych aplikacji). LAMP sprawdza się lepiej dla prostych migracji i aplikacji z rozbudowanym .htaccess; LEMP dla nowych projektów i dużego ruchu.
Jak skonfigurować wiele domen na jednym serwerze Apache? +
Użyj Apache Virtual Hosts. Utwórz plik /etc/apache2/sites-available/domena.conf z sekcją VirtualHost zawierającą ServerName, DocumentRoot i logi. Aktywuj przez a2ensite domena.conf, dezaktywuj domyślny przez a2dissite 000-default.conf, przeładuj Apache. Każda domena ma własny katalog i logi. DocumentRoot to katalog z plikami strony (np. /var/www/domena.pl/public).
Jak zabezpieczyć instalację MySQL na serwerze produkcyjnym? +
Po instalacji uruchom mysql_secure_installation — kreator zadaje pytania: ustawienie hasła roota, usunięcie anonimowych użytkowników, wyłączenie zdalnego logowania root, usunięcie testowej bazy danych. Odpowiedz Yes na wszystkie pytania na serwerze produkcyjnym. Dodatkowo: twórz dedykowane konta dla każdej aplikacji z minimalnymi uprawnieniami (GRANT SELECT, INSERT, UPDATE, DELETE ON baza.* TO user@localhost), nigdy nie używaj root w aplikacji.
Apache nie startuje po instalacji - jak to zdiagnozować? +
Sprawdź dokładny powód przez systemctl status apache2 oraz journalctl -xeu apache2. Najczęstsza przyczyna to zajęty port 80 (sprawdź: ss -tlnp | grep :80 - może działać Nginx albo inna usługa) albo błąd składni w konfiguracji (apache2ctl configtest musi zwrócić "Syntax OK" przed każdym restartem). Trzecia częsta przyczyna to brakujący katalog DocumentRoot z VirtualHost - Apache odmówi startu, jeśli katalog nie istnieje.
Dostaję błąd 403 Forbidden mimo poprawnej konfiguracji VirtualHost - co sprawdzić? +
403 Forbidden na LAMP to niemal zawsze uprawnienia plików. Sprawdź: (1) właściciela katalogu - chown -R www-data:www-data /var/www/domena.pl, (2) uprawnienia katalogów muszą mieć bit wykonywania (chmod 755), (3) czy w sekcji <Directory> jest Require all granted (bez tego Apache 2.4 domyślnie blokuje dostęp), (4) czy istnieje plik index (index.php/index.html) w DocumentRoot. Warto też sprawdzić logi błędów: tail -f /var/log/apache2/domena-error.log.
Przeglądarka pobiera plik .php zamiast go wykonać - jak naprawić? +
Oznacza to, że Apache nie ma aktywnego handlera PHP. Przy mod_php sprawdź czy moduł jest włączony: a2enmod php8.2 && systemctl restart apache2. Przy PHP-FPM sprawdź czy konfiguracja proxy jest aktywna: a2enconf php8.2-fpm oraz czy socket istnieje (ls -la /run/php/php8.2-fpm.sock) i czy usługa php8.2-fpm działa (systemctl status php8.2-fpm). Częsty błąd to niedopasowana wersja PHP w nazwie configu (np. php8.3-fpm.conf przy zainstalowanym php8.2).
Aplikacja nie może połączyć się z MySQL - "Connection refused" lub "Access denied"? +
"Connection refused" zwykle oznacza że MySQL nie nasłuchuje na oczekiwanym hoście - sprawdź bind-address w /etc/mysql/mysql.conf.d/mysqld.cnf (domyślnie 127.0.0.1, dla aplikacji lokalnej to poprawne, dla zdalnego dostępu trzeba świadomie zmienić i zabezpieczyć firewallem). "Access denied for user" oznacza zły użytkownik/hasło/host w GRANT - sprawdź SELECT user,host FROM mysql.user; i upewnij się, że aplikacja łączy się z tego samego hosta, dla którego utworzono uprawnienia (localhost vs 127.0.0.1 to różne wpisy w MySQL).
Jak dodać darmowy certyfikat SSL (Let's Encrypt) do LAMP Stack? +
Użyj Certbota z pluginem Apache: apt install -y certbot python3-certbot-apache, następnie certbot --apache -d domena.pl -d www.domena.pl. Certbot automatycznie wykryje VirtualHost, doda konfigurację HTTPS i przekierowanie z HTTP, oraz skonfiguruje automatyczne odnawianie (systemctl status certbot.timer). Certyfikat trzeba mieć zainstalowany zanim ustawisz wymuszenie HSTS, inaczej strona stanie się niedostępna.
Jak zrobić kopię zapasową bazy danych i plików aplikacji LAMP? +
Baza danych: mysqldump -u root -p --single-transaction moja_aplikacja > backup-$(date +%F).sql (flaga --single-transaction zapobiega blokowaniu tabel InnoDB podczas eksportu). Pliki: tar -czf backup-www-$(date +%F).tar.gz /var/www/moja-domena.pl. Oba polecenia warto zapisać w skrypcie i dodać do crontaba (crontab -e) z rotacją starszych kopii oraz kopiować poza serwer (np. do storage obiektowego), żeby awaria dysku nie zabrała jednocześnie danych i backupu.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.