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

⚡ W skrócie · 8 min czytania

-   Konfiguracja Apache VirtualHost krok po kroku: Named-Based hosting, HTTP i HTTPS (SSL), a2ensite, a2dissite, testowanie configtest, logi per VirtualHost, przykład dla WordPress.
-   Jak działa Name-Based Virtual Hosting.
-   Struktura katalogów dla wielu domen.
-   VirtualHost HTTP (port 80).
-   VirtualHost HTTPS (port 443).

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 "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 "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 "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/)
-   [phpMyAdmin - bezpieczna instalacja i konfiguracja
    
    phpMyAdmin bezpiecznie: zmiana URL /phpmyadmin, HTTP Basic Auth w Nginx/Apache, IP allowlist, blokada root login,…
    
    ](/baza-wiedzy/phpmyadmin-konfiguracja-bezpieczenstwo/)
-   [Nginx micro-caching - szybkie cache dla aplikacji dynamicznych
    
    Nginx proxy\_cache jako micro-cache: proxy\_cache\_path, cache bypass dla zalogowanych (WordPress/WooCommerce),…
    
    ](/baza-wiedzy/nginx-cache-microcaching/)
-   [ModSecurity WAF - konfiguracja na Apache i Nginx
    
    Jak zainstalować i skonfigurować ModSecurity WAF na serwerze VPS. OWASP Core Rule Set, tryb detection vs prevention,…
    
    ](/baza-wiedzy/modsecurity-waf-hosting/)
-   [Jaki VPS wybrać?](/jaki-vps-wybrac/)

Autor: [Redakcja HostGrade.pl](/autorzy/) Zespół redakcyjny · Aktualizacja: 9 kwietnia 2026

Artykuły HostGrade.pl przygotowuje i aktualizuje redakcja serwisu. Ceny startowe, ceny odnowienia i warunki planów sprawdzamy w cennikach i regulaminach dostawców, a potem liczymy całkowity koszt za 2 lata (cena startowa plus odnowienia). Zasady zbierania danych i liczenia kosztów opisujemy na stronie Metodologia. Linki partnerskie oznaczamy jako #reklama.

[O redakcji i metodologii →](/autorzy/)