Subdomains sind untergeordnete Domains, die vor der Hauptdomain stehen. Sie ermöglichen eine logische Trennung verschiedener Dienste oder Bereiche.

Was ist eine Subdomain?

Aufbau einer Domain:

subdomain.domain.tld
    │        │     │
    │        │     └── Top-Level-Domain (.de, .com)
    │        └──────── Second-Level-Domain (ihr-name)
    └───────────────── Subdomain (blog, shop, api, ...)

Beispiele:
blog.example.com
shop.example.com
api.example.com
mail.example.com

Wann Subdomains nutzen?

Typische Anwendungsfälle

| Subdomain | Verwendung | |-----------|------------| | www | Hauptwebsite | | blog | Blog/News | | shop | Online-Shop | | api | API-Server | | mail | Webmail | | admin | Admin-Panel | | staging | Testumgebung | | dev | Entwicklung | | cdn | Content Delivery | | app | Web-Anwendung |

Subdomain vs. Unterverzeichnis

Subdomain (blog.example.com):

  • Technisch getrennt
  • Eigene Webserver-Konfiguration
  • Eigenes SSL-Zertifikat (oder Wildcard)
  • Andere Server möglich
  • Gut für separate Anwendungen

Unterverzeichnis (example.com/blog):

  • Gleiche Domain
  • Gleiche Konfiguration
  • Gleiche SSL
  • Einfacher zu verwalten
  • Besser für SEO (geteilte Autorität)

DNS-Einträge erstellen

A-Record (IPv4)

Name:  blog
Typ:   A
Wert:  123.45.67.89
TTL:   3600

Ergebnis: blog.example.com zeigt auf IP 123.45.67.89

AAAA-Record (IPv6)

Name:  blog
Typ:   AAAA
Wert:  2001:db8::1
TTL:   3600

CNAME-Record (Alias)

Name:  blog
Typ:   CNAME
Wert:  example.com.
TTL:   3600

Hinweis: CNAME verweist auf anderen Domainnamen, nicht auf IP.

Mehrere Subdomains auf gleiche IP

blog    A    123.45.67.89
shop    A    123.45.67.89
api     A    123.45.67.89

Oder mit Wildcard:

*       A    123.45.67.89

DNS prüfen

# A-Record prüfen
dig blog.example.com A +short

# Alle Records
dig blog.example.com ANY

# Mit bestimmtem DNS-Server
dig @8.8.8.8 blog.example.com

Webserver-Konfiguration

Apache Virtual Host

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

<VirtualHost *:80>
    ServerName blog.example.com
    DocumentRoot /var/www/blog

    <Directory /var/www/blog>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

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

Aktivieren:

a2ensite blog.example.com.conf
systemctl reload apache2

Nginx Server Block

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

server {
    listen 80;
    server_name blog.example.com;

    root /var/www/blog;
    index index.html index.php;

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

    error_log /var/log/nginx/blog-error.log;
    access_log /var/log/nginx/blog-access.log;
}

Aktivieren:

ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

SSL für Subdomains

Let's Encrypt für einzelne Subdomain

certbot --nginx -d blog.example.com
# oder
certbot --apache -d blog.example.com

Mehrere Subdomains in einem Zertifikat

certbot --nginx -d example.com -d www.example.com -d blog.example.com -d shop.example.com

Wildcard-Zertifikat

# Erfordert DNS-Challenge
certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com

Bei der DNS-Challenge müssen Sie einen TXT-Record erstellen.

Nginx mit SSL

server {
    listen 80;
    server_name blog.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name blog.example.com;

    ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;

    root /var/www/blog;
    index index.html index.php;

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

Subdomain auf anderen Server

DNS-Eintrag

blog    A    234.56.78.90  (anderer Server)

Reverse Proxy (Subdomain auf anderen Port)

Wenn die Anwendung auf localhost:3000 läuft:

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

PHP-Anwendungen

WordPress auf Subdomain

server {
    listen 80;
    server_name blog.example.com;

    root /var/www/blog;
    index index.php;

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

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

Mehrere WordPress-Installationen

/var/www/main/      → example.com
/var/www/blog/      → blog.example.com
/var/www/shop/      → shop.example.com

E-Mail-Subdomain

MX-Record für Subdomain

support.example.com.    MX    10    mail.support.example.com.
mail.support.example.com.    A    123.45.67.89

SPF für Subdomain

support.example.com.    TXT    "v=spf1 mx -all"

Wildcard-Subdomain

DNS

*    A    123.45.67.89

Nginx Catch-All

server {
    listen 80;
    server_name *.example.com;

    root /var/www/wildcard;

    # Subdomain als Variable
    set $subdomain "";
    if ($host ~ ^(.+)\.example\.com$) {
        set $subdomain $1;
    }

    # Dynamisches Root-Verzeichnis
    root /var/www/subdomains/$subdomain;
}

Subdomain für Entwicklung

Lokale Hosts-Datei

# /etc/hosts (Linux/Mac) oder C:\Windows\System32\drivers\etc\hosts (Windows)
127.0.0.1    dev.example.local
127.0.0.1    blog.example.local

Staging-Subdomain

server {
    listen 80;
    server_name staging.example.com;

    # Basic Auth für Zugriffschutz
    auth_basic "Staging Server";
    auth_basic_user_file /etc/nginx/.htpasswd;

    root /var/www/staging;
    # ...
}

Troubleshooting

DNS nicht aufgelöst

# DNS prüfen
dig blog.example.com

# Lokaler Cache leeren
# Linux
systemd-resolve --flush-caches

# Windows
ipconfig /flushdns

Webserver antwortet nicht

# Nginx Config testen
nginx -t

# Apache Config testen
apachectl configtest

# Logs prüfen
tail -f /var/log/nginx/error.log
tail -f /var/log/apache2/error.log

SSL-Probleme

# Zertifikat prüfen
openssl s_client -connect blog.example.com:443 -servername blog.example.com

# Certbot Status
certbot certificates

Checkliste neue Subdomain

□ DNS-Eintrag erstellt (A/AAAA/CNAME)
□ DNS-Propagation abgewartet (dig prüfen)
□ Verzeichnis erstellt (/var/www/subdomain)
□ Webserver-Konfiguration erstellt
□ Konfiguration aktiviert
□ Webserver neu geladen
□ SSL-Zertifikat erstellt
□ HTTP→HTTPS Redirect eingerichtet
□ Firewall-Regel (falls nötig)
□ Testen!

Fazit

Subdomains bieten eine saubere Trennung verschiedener Dienste und Anwendungen unter einer Domain. Der Prozess ist immer gleich: DNS-Eintrag erstellen, Webserver konfigurieren, SSL einrichten. Für mehrere Subdomains empfiehlt sich ein Wildcard-Zertifikat. Beachten Sie die DNS-Propagation – Änderungen können einige Stunden dauern, bis sie weltweit sichtbar sind.