 Autor: [Robert Zasilny](/autorzy/robert-zasilny) Ekspert bezpieczeństwa i compliance · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Apache VirtualHost — konfiguracja

# Apache VirtualHost — konfiguracja wielu domen na jednym serwerze

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS, Serwer

VirtualHost to mechanizm Apache pozwalający obsługiwać wiele domen z jednego serwera i jednego adresu IP. Każda domena ma własny katalog główny, własne logi i własną konfigurację. W tym artykule pokażemy jak stworzyć VirtualHost dla HTTP i HTTPS, aktywować go za pomocą a2ensite i przetestować konfigurację bez restartu serwera.

## Jak działa Name-Based Virtual Hosting

Gdy przeglądarka wysyła żądanie HTTP, w nagłówku `Host:` przekazuje nazwę domeny (np. `mojastrona.pl`). Apache sprawdza wszystkie aktywne VirtualHosty i dopasowuje ten z pasującym `ServerName` lub `ServerAlias`. Dzięki temu jeden serwer z jednym IP może obsługiwać setki domen.

## Struktura katalogów dla wielu domen

\# Utwórz katalogi dla każdej domeny
sudo mkdir -p /var/www/mojastrona.pl/public\_html
sudo mkdir -p /var/www/innadomena.pl/public\_html

# Ustaw właściciela (www-data = użytkownik Apache)
sudo chown -R www-data:www-data /var/www/mojastrona.pl
sudo chown -R www-data:www-data /var/www/innadomena.pl

# Uprawnienia
sudo chmod -R 755 /var/www/mojastrona.pl

## VirtualHost HTTP (port 80)

Stwórz plik konfiguracyjny w `/etc/apache2/sites-available/`:

\# /etc/apache2/sites-available/mojastrona.pl.conf

<VirtualHost \*:80>
    ServerName mojastrona.pl
    ServerAlias www.mojastrona.pl

    DocumentRoot /var/www/mojastrona.pl/public\_html

    # Logi per domena
    ErrorLog ${APACHE\_LOG\_DIR}/mojastrona.pl-error.log
    CustomLog ${APACHE\_LOG\_DIR}/mojastrona.pl-access.log combined

    # Opcje katalogu
    <Directory /var/www/mojastrona.pl/public\_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All         # Pozwala na .htaccess
        Require all granted
    </Directory>

    # Przekierowanie HTTP -> HTTPS (po instalacji certyfikatu SSL)
    # Redirect permanent / https://mojastrona.pl/
</VirtualHost>

## VirtualHost HTTPS (port 443)

\# /etc/apache2/sites-available/mojastrona.pl-ssl.conf

<VirtualHost \*:443>
    ServerName mojastrona.pl
    ServerAlias www.mojastrona.pl

    DocumentRoot /var/www/mojastrona.pl/public\_html

    # Certyfikat SSL (Let's Encrypt)
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/mojastrona.pl/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mojastrona.pl/privkey.pem

    # Nowoczesne protokoły SSL
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder off
    SSLSessionTickets off

    # Nagłówki bezpieczeństwa
    Header always set Strict-Transport-Security "max-age=63072000"

    # Logi per domena
    ErrorLog ${APACHE\_LOG\_DIR}/mojastrona.pl-ssl-error.log
    CustomLog ${APACHE\_LOG\_DIR}/mojastrona.pl-ssl-access.log combined

    <Directory /var/www/mojastrona.pl/public\_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

## Aktywacja: a2ensite i a2dissite

\# Aktywuj moduł SSL (potrzebny dla HTTPS)
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod rewrite       # Potrzebny dla .htaccess RewriteRule

# Aktywuj VirtualHosty (tworzy symlink sites-available → sites-enabled)
sudo a2ensite mojastrona.pl.conf
sudo a2ensite mojastrona.pl-ssl.conf

# Dezaktywuj domyślny VirtualHost (opcjonalne)
sudo a2dissite 000-default.conf

# Przetestuj konfigurację (BEZ restartu!)
sudo apache2ctl configtest
# Oczekiwany wynik: Syntax OK

# Przeładuj Apache (zero downtime)
sudo systemctl reload apache2

# Lub pełny restart (krótka przerwa)
sudo systemctl restart apache2

## Przykład: VirtualHost dla WordPress

\# /etc/apache2/sites-available/wordpress.pl.conf
# Przekierowanie HTTP → HTTPS

<VirtualHost \*:80>
    ServerName wordpress.pl
    ServerAlias www.wordpress.pl
    Redirect permanent / https://wordpress.pl/
</VirtualHost>

<VirtualHost \*:443>
    ServerName wordpress.pl
    ServerAlias www.wordpress.pl
    DocumentRoot /var/www/wordpress.pl/public\_html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/wordpress.pl/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/wordpress.pl/privkey.pem

    # WordPress wymaga AllowOverride All dla permalink
    <Directory /var/www/wordpress.pl/public\_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted

        # Ochrona pliku konfiguracyjnego
        <FilesMatch "^wp-config\\.php$">
            Require all denied
        </FilesMatch>
    </Directory>

    # Blokada dostępu do ukrytych plików
    <FilesMatch "^\\.ht">
        Require all denied
    </FilesMatch>

    ErrorLog ${APACHE\_LOG\_DIR}/wordpress.pl-error.log
    CustomLog ${APACHE\_LOG\_DIR}/wordpress.pl-access.log combined
</VirtualHost>

## Testowanie i debugowanie konfiguracji

\# Sprawdź składnię konfiguracji
sudo apache2ctl configtest

# Wylistuj aktywne VirtualHosty
sudo apache2ctl -S
# Pokazuje: port, ServerName, DocumentRoot, plik konfiguracyjny

# Sprawdź status Apache
sudo systemctl status apache2

# Obejrzyj logi w czasie rzeczywistym
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/mojastrona.pl-error.log

# Test połączenia (bez DNS)
curl -H "Host: mojastrona.pl" http://127.0.0.1/

### Typowe błędy i ich rozwiązania

-   **AH00558: Could not reliably determine server's FQDN** — dodaj `ServerName localhost` do `/etc/apache2/apache2.conf`
-   **403 Forbidden** — sprawdź uprawnienia katalogów (`chmod 755`) i `Require all granted` w Directory
-   **SSL\_ERROR\_RX\_RECORD\_TOO\_LONG** — port 443 nie ma SSL, brakuje `SSLEngine on` lub moduł ssl nie jest aktywny (`a2enmod ssl`)
-   **Permalinki WordPress nie działają** — brak `AllowOverride All` lub moduł rewrite nie aktywny (`a2enmod rewrite`)

## Najczęstsze pytania

Jaka jest różnica między Name-Based a IP-Based Virtual Hosting? +

Name-Based Virtual Hosting (hosting oparty na nazwie) pozwala obsługiwać wiele domen z jednego adresu IP — Apache odróżnia domeny na podstawie nagłówka Host: w żądaniu HTTP. To standardowe i zalecane rozwiązanie. IP-Based Virtual Hosting wymaga osobnego adresu IP dla każdej domeny — stosowany gdy SSL nie obsługuje SNI (co dziś praktycznie nie ma znaczenia, bo SNI jest wszędzie). Współczesne konfiguracje Apache używają wyłącznie Name-Based z SNI dla HTTPS.

Co robi polecenie a2ensite i gdzie są pliki konfiguracyjne Apache? +

a2ensite (Apache2 Enable Site) tworzy symlink z /etc/apache2/sites-available/nazwa.conf do /etc/apache2/sites-enabled/. Apache wczytuje tylko pliki z sites-enabled/. Analogicznie: a2dissite usuwa symlink (dezaktywuje stronę), a2enmod/a2dismod zarządzają modułami. Po każdej zmianie wykonaj apache2ctl configtest (weryfikacja składni) i systemctl reload apache2 (przeładowanie bez restartu — zero downtime).

Jak wymusić HTTPS redirect w Apache bez certyfikatu SSL? +

Możesz przekierować HTTP→HTTPS w VirtualHost HTTP (port 80) za pomocą: Redirect permanent / https://twojadomena.pl/ lub przez mod\_rewrite: RewriteEngine On, RewriteCond %{HTTPS} off, RewriteRule ^(.\*)$ https://%{HTTP\_HOST}%{REQUEST\_URI} \[R=301,L\]. Jednak przekierowanie na HTTPS ma sens tylko gdy certyfikat SSL jest już zainstalowany — w przeciwnym razie przeglądarka pokaże błąd SSL.

Jak skonfigurować logi per VirtualHost w Apache? +

W każdym bloku VirtualHost dodaj: ErrorLog ${APACHE\_LOG\_DIR}/nazwa-domeny-error.log i CustomLog ${APACHE\_LOG\_DIR}/nazwa-domeny-access.log combined. Każda domena będzie mieć osobne pliki logów, co ułatwia diagnostykę i monitoring. Pamiętaj żeby katalog logów był zapisywalny przez Apache (www-data). Logi możesz analizować narzędziami GoAccess lub AWStats.

## 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.

Contabo

VPS z pełnym dostępem root — idealne do konfiguracji Apache VirtualHost

Pełny root

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikrus

Tani VPS do nauki konfiguracji Apache i testowania wielu domen

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting współdzielony na LiteSpeed — wydajniejsza alternatywa dla Apache

LiteSpeed

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [Nginx VHost — konfiguracja wirtualnych hostów](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [Jak skonfigurować SSL na hostingu](/baza-wiedzy/jak-skonfigurowac-ssl-na-hostingu)
-   [.htaccess — konfiguracja na hostingu](/baza-wiedzy/htaccess-konfiguracja-hosting)
-   [Wszystkie artykuły](/baza-wiedzy/)