.

Mit Nginx können, wie mit Apache2 auch, mehrere Websites auf einem Server zur Verfügung gestellt werden. Dies wird in sogenannten ‚Server Blocks‘ realisiert. Dadurch wird jeder Domain ein eigenes Stammverzeichnis zugewiesen. Außerdem ergeben sich weitere Möglichkeiten wie eigenes SSL-Zertifikat oder individuelle Sicherheitsrichtlinien für jede Website.

Inhalt

Nginx Verzeichnisstruktur anlegen
Die Nginx Server-Blocks
PHP Info & Test
Mehr zu Nginx Server Blocks

In diesem Tutorial geht es darum diese ‚Server Blocks‘ für Nginx einzurichten sowie die dafür nötigen Dateien und Ordner kennenzulernen.

Voraussetzung

- Eine Domain, die auf die öffentliche Server-IP zeigt.
- Installierter Nginx Server
- Systemzugriff als root oder Benutzer mit sudo Privilegien.

Oft ist in Verbindung mit Nginx auch von ‚Virtual Hosts‘ die rede. Dies ist eine Bezeichnung der gleichen Technik beim Einsatz von Apache2. Hier sprechen wir von ‚Server Blocks‘!

Nginx Verzeichnisstruktur anlegen

Das Stammverzeichnis ist das Verzeichnis in dem die Dateien einer Website abgelegt werden. Prinzipiell kann kann das Stammverzeichnis ein beliebiges Verzeichnis auf dem Server sein. Bei der ein oder anderen Linux Distribution hat es sich eingebürgert „/usr/share/nginx/html/“ als Basis Verzeichnis für alle Domain Stammverzeichnisse zu nutzen. Debian indes nutzt üblicherweise „/var/www/“ als Basisverzeichnis benutzt, wie es auch für den Apache2 üblich ist.

Wir werden die folgende Verzeichnisstruktur verwenden:

/var/www/
├─── domain1.com
│ └ └── (public) html
├─── domain2.com
│ └ └── (public) html
├─── domain3.com
│ └ └── (public) html

Unterhalb von „/var/www/“ legen wir für jede Domain ein Verzeichnis an. In diesem wiederum ein Verzeichnis „html“ oder nach belieben auch „public_html“, in dem die Dateien der Webseiten gespeichert werden.

Für alle folgenden Code-Schnipsel, in dem ein Kommandozeilenbefehl steht, gilt, alles was in Winkelklammern steht <domain.com> muss für die eigene Konfiguration angepasst werden!

Legen wir nun für alle Domains Ordner an.

sudo mkdir -p /var/wwww/<domain.com>/html

Die Option -p bewirkt bei ‚mkdir‘ dass nicht vorhandenen Parent Verzeichnisse ohne Fehlermeldung mit angelegt werden.

Zum testen der Konfiguration von mehreren Domains auf einem Server empfiehlt es sich in jedem öffentlichen „html“ Verzeichnisse eine „index.html“ Datei an zu legen. Und mit ein wenig HTML-Code zu füllen.

nano /var/www/<domain.com>/html/index.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Dies ist "domain.com"</title>
  </head>
  <body>
    <h1>"domain.com" Startseite!</h1>
  </body>
</html>

Ordner Berechtigung

Um Berechtigungsprobleme zu vermeiden, ändern wir den Eigentümer des Stammverzeichnisses des Domaindokuments auf den Nginx Benutzer (www-data):

chown -R www-data: /var/wwww/<domain.com>

Die Option ‚-R‘ von chown steht für „Rekursiv“ und bewirkt hier das diese Eigentümer Änderung auf alle Ordner und Dateien unterhalb von „/var/www/<domain.com>“ übertragen werden.

Die Nginx Server-Blocks

Auf einigen Distributionen findet man die Konfigurationsdateien für die Server Blocks von Nginx unter „/etc/nginx/conf.d/“. Debian-Systeme gehen auch hier einen eigenen Weg. Angelehnt an die Apache2 Konfiguration für Virtual Hosts. Die Konfigurationsdateien werden im Verzeichnis „/etc/nginx/sites-available“ gespeichert. Durch symbolische Links auf diese Dateien im Verzeichnis „/etc/nginx/sites-enabled/“ werden die sie aktiviert.

Neue Konfiguration anlegen

Zum erstellen einer neuen Server Block Konfiguration benutze ich gerne die „default“ Datei als Grundlage anstatt eine neue, leere Datei zu erzeugen. Um diese Kopie dann entsprechend an zu passen. Den Vorteil sehe ich darin das so bereits eine Struktur Vorhanden ist und ein Copy-Past aus einer Vorlage unnötig wird.

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/<domain.com>

Die Konfigurationsdatei kann nach belieben benannt werden. Der ein oder andere zieht es vor hinten ein „.conf“ an zu fügen. Zur besseren Identifikation jedoch, macht es in Sinn dass der Domainname, für den die Konfiguration angelegt wird, im Dateinamen enthalten ist.

Neue Konfiguration bearbeiten

nano /etc/nginx/sites-available/<domain.com>

Der grundlegende Inhalt für eine Server Block Konfiguration sieht wie folgt aus:

server {
    # Port auf dem der Server Block lauschen soll 
    listen 80;       # Port IPv4
    listen [::]:80;  # Port IPv6

    # Öffentlisches html Verzeichnis der domain.com
    root /var/www/<domain.com>/html;

    # Datei die als erster Inhalt zurück geliefert wird.
    index index.html index.htm index.php;

    # Domain- und Subdomainnamen 
    server_name example.com www.example.com;

    # Dateien für die Server Logs
    access_log /var/log/nginx/<domain.com>.access.log;
    error_log /var/log/nginx/<domain.com>.error.log;

    # Für die Verabeitung der URI Angaben hinter dem Domainnamen.
    location / {
        try_files $uri $uri/ =404;
    }
    
    # Angaben welche Fehler Seiten genutzt werden sollen.
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # Angaben für die Verarbeitung von PHP Dateien.
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}

Durch den symbolischen Link wird die neue Konfiguration im Anschluss aktiviert.

ln -s /etc/nginx/sites-available/<domain.com> /etc/nginx/sites-enabled/

Nginx bietet die Möglichkeit die neue Konfiguration zu auf eine korrekte Syntax zu überprüfen.

nginx -t

Gibt es keine Fehler, sieht die Ausgabe wie folgt aus:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Stimmt etwas nicht kann man der Ausgabe entnehmen in welcher Datei der Fehler steckt. Dazu erhält man Zeilenangaben und meist auch was in der Zeile nicht in Ordnung ist.

Ehe es weiter geht starten wir Nginx neu. Damit die Änderungen übernommen werden.

systemctl restart nginx

FEHLER – „hash bucket size“

Falls der folgende Fehler auftritt gibt es Abhilfe mit sehr wenig Aufwand.

nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

Lange Domainnamen sind die Ursache. Das Problem lässt sich schnell beheben. Indem wir ‚/etc/nginx/nginx.conf mit nano öffnen.

nano /etc/nginx/nginx.conf

Wir suchen nach:

server_names_hash_bucket_size 32;

Die 32 verdoppeln wir nun auf 64. ’strg + o‘ -> ‚Enter‘ zum speichern und mit ’strg + x‘ nano wieder verlassen.
Nginx Konfigurationstest erneut durchführen:

nginx -t

Nun sollte der Test ohne Fehler durchlaufen!

PHP Info & Test

Abschießend wollen wir nun sehen ob alles geklappt hat und PHP auf dem Webserver einsatzbereit ist. Hier für erstellen wir in einem der ‚html‘ Ordner eine ‚.php‘ Datei.

nano /var/wwww/<domain.com>/html/info.php

In diese Datei fügen wir einen Code-Schnipsel ein.

<?php
phpinfo();
?>

Wie schon bekannt: ’strg + o‘ -> ‚Enter‘ und ’strg + x‘ zum speichern und beenden.

Rufen wir diese Datei nun mittels Browser auf solltet ihr ein ähnlichen Inhalt wie ich angezeigt bekommen.

<domain.com>/info.php
Infoseite zur PHP Version und vielem mehr.
Info zur PHP Version und Installation

Mehr zu Nginx Server Blocks

Diese kleine Anleitung enthält nur Grundlagen. Und erhebt somit keinerlei Anspruch auf Vollständigkeit.

Des weiteren ist es möglich in den Server Blocks HTML Header Informationen zu hinterlegen die jeder Seite angefügt werden sollen. Für eine Einrichtung nach heutigen Richtlinien für den Betrieb einer Website ist dies sehr zu empfehlen. Dazu aber ein anderes mal mehr.

Beispiele zu Server Blocks findet ihr auch auf der Wiki Seite von Nginx.


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.