Obsługa wielu domen na jednym serwerze WWW (Nginx/Apache2)#

Jeśli kilka domen ma działać na jednym serwerze, konfiguracja sprowadza się do prostego układu:

  • wszystkie domeny wskazują na ten sam serwer,
  • każda domena ma osobny katalog z plikami,
  • każda domena ma osobny blok konfiguracyjny w serwerze WWW,
  • logi są rozdzielone per domena.

Załóżmy taki przykład:

  • example.com
  • www.example.com
  • drugadomena.pl
  • www.drugadomena.pl

Katalogi aplikacji:

/var/www/example.com
/var/www/drugadomena.pl

Nginx#

DNS i katalogi#

Na początek rekordy DNS muszą wskazywać na ten sam adres IP, w przypadku konfiguracji domeny przez Cytrusa będzie to:

example.com         A     135.181.95.85
www.example.com     A     135.181.95.85
drugadomena.pl      A     135.181.95.85
www.drugadomena.pl  A     135.181.95.85

💡 Uwaga! Pamiętaj by dodać je w konfiguracji w panelu Mikrusa.

Jednak jeżeli używasz domen przez Cloudflare, musisz podać adres IPv6 w konfiguracji. Pamiętaj by zmienić adres IPv6 na własny!

example.com         AAAA    2a01:4f9:c001:ca1::100
www.example.com     AAAA    2a01:4f9:c001:ca1::100
drugadomena.pl      AAAA    2a01:4f9:c001:ca1::100
www.drugadomena.pl  AAAA    2a01:4f9:c001:ca1::100

Należy stworzyć katalogi na serwerze:

mkdir -p /var/www/example.com/
mkdir -p /var/www/drugadomena.pl/

echo "example.com działa" > /var/www/example.com/index.html
echo "drugadomena.pl działa" > /var/www/drugadomena.pl/index.html

Konfiguracja wielu domen w Nginx#

W Nginx standardowy układ to:

  • pliki konfiguracyjne w /etc/nginx/sites-available/
  • aktywne strony w /etc/nginx/sites-enabled/

💡 W systemach Alpine (Frog) obie funkcje pełni katalog /etc/nginx/http.d

Osobny plik dla każdej domeny#

example.com#

Plik:

/etc/nginx/sites-available/example.com

Zawartość:

server {
    listen [::]:80; # Ważne! to musi być adres IPv6!

    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html index.htm index.php;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

drugadomena.pl#

Plik:

/etc/nginx/sites-available/drugadomena.pl

Zawartość:

server {
    listen [::]:80;

    server_name drugadomena.pl www.drugadomena.pl;
    root /var/www/drugadomena.pl;
    index index.html index.htm index.php;

    access_log /var/log/nginx/drugadomena-access.log;
    error_log /var/log/nginx/drugadomena-error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Aktywacja konfiguracji#

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ # aktywacja pierwszej domeny
ln -s /etc/nginx/sites-available/drugadomena.pl /etc/nginx/sites-enabled/ #... oraz drugiej
nginx -t # sprawdzenie poprawności konfiguracji
systemctl reload nginx # i finalne załadowanie jej

Po tej operacji obie domeny powinny odpowiadać z własnych katalogów.

Jeśli aplikacja używa PHP#

Dla PHP w Nginx trzeba dodać obsługę PHP-FPM. Przykład dla example.com:

server {
    
    listen [::]:80;

    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html index.htm;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }
}

Jeśli masz inną wersję PHP, zmień ścieżkę do socketa. Możesz je zobaczyć poleceniem ls /run/php/*.sock

Redirect www → bez www#

Jeśli chcesz mieć jedną główną wersję domeny, ustaw osobny blok (w tym samym pliku):

server {
    listen [::]:80;

    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

Wtedy główny blok dla example.com może wyglądać tak:

server {
    listen [::]:80;

    server_name example.com;
    root /var/www/example.com;
    index index.html index.htm index.php;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

Konfiguracja wielu domen w Apache2#

W Apache2 każda domena dostaje własny VirtualHost.

Włączenie podstawowych modułów#

Najczęściej potrzebne są:

a2enmod rewrite
systemctl restart apache2

Osobny plik dla każdej domeny#

example.com#

Plik:

/etc/apache2/sites-available/example.com.conf

Zawartość:

<VirtualHost [::]:80>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example.com

    <Directory /var/www/example.com>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

drugadomena.pl#

Plik:

/etc/apache2/sites-available/drugadomena.pl.conf

Zawartość:

<VirtualHost [::]:80>
    ServerName drugadomena.pl
    ServerAlias www.drugadomena.pl

    DocumentRoot /var/www/drugadomena.pl

    <Directory /var/www/drugadomena.pl>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/drugadomena-error.log
    CustomLog ${APACHE_LOG_DIR}/drugadomena-access.log combined
</VirtualHost>

Aktywacja konfiguracji#

a2ensite example.com.conf
a2ensite drugadomena.pl.conf
apache2ctl configtest
systemctl reload apache2

Po tej operacji Apache powinien serwować obie domeny z osobnych katalogów.

Redirect www → bez www#

Jeśli chcesz wymusić jedną wersję adresu, zrób osobny VirtualHost tylko do przekierowania:

<VirtualHost [::]:80>
    ServerName www.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Główna konfiguracja zostaje wtedy tylko dla example.com:

<VirtualHost [::]:80>
    ServerName example.com

    DocumentRoot /var/www/example.com

    <Directory /var/www/example.com>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

Najczęstsze błędy#

1. Zły root albo DocumentRoot#

Jeśli ścieżka jest błędna, domena może zwracać 404, 503 albo błąd ogólny błąd 500.

2. Brak aktywacji konfiguracji#

Samo utworzenie pliku nic nie daje. Trzeba go jeszcze włączyć:

  • w Nginx przez utworzenie linku symbolicznego do sites-enabled,
  • w Apache2 przez polecenie a2ensite.

3. Brak testu konfiguracji przed restartem#

Zawsze warto sprawdzić składnię przed przeładowaniem usługi:

# dla nginx:
nginx -t
# lub dla apache2:
apache2ctl configtest

4. Złe uprawnienia dla katalogów stron#

Upewnij się że użytkownik stron (www-data) ma uprawnienia do odczytu katalogu w którym jest twoja strona.


Jeżeli używasz Cloudflare, twoje strony powinny już być dostępne. Jeżeli hostujesz je przez Cytrusa, pamiętaj by dodać je w panelu!