Mit dem Einsatz von Hugo, das ausschließlich statischen Dateien generiert, konnte ich die Konfiguration von Nginx für meinen Blog sehr einfach gestalten. Vielleicht hilft das anderen Menschen, die Hugo nutzen möchten.

  • Dazu gekommen sind die Weiterleitungen für Umlaute in URLs, wie ich hier beschrieben habe.
  • Die am ersten Tag des Umzugs etwas unglück eingerichteten Weiterleitungen der in WordPress verfügbaren Feeds auf die von Hugo habe ich jetzt in schön geschrieben. (Eine gute Beschreibung der Feeds und deren URLs, die in WordPress automatisch erstellt werden, gibt es hier.)

Somit ist die ganze Konfiguration für den Blog in Nginx relativ einfach geworden.

Hinweis
Ich bin kein Profi für die Konfiguration von Nginx. Es funktioniert so bei mir, es gibt aber keine Garantie, dass ich da nicht irgendwelchen Blödsinn veranstaltet habe.

Es könnte z. B. sein, dass es nicht sinnvoll ist, die URLs der Feeds der anderen Formate stumpf nach rss (index.xml) weiterzuleiten. Etwas anderes erzeugt Hugo per Voreinstellung aber nicht und ich will das auch nicht ändern.

Falls ich etwas Dummes getan habe, würde ich mich über einen Hinweis freuen. Danke.

Hinweis
Es ist bei solchen Angelegenheiten immer gut, wenn man die Logs des Webservers im Blick hat, vor allem Status 404. Dann fällt auf, wenn etwas nicht funktioniert. Zum Testen von Weiterleitungen nutze ich immer curl, denn es merkt sich keine Zustände zu Weiterleitungen, wie das Browser machen.

server.conf

Die Anmerkungen von mir sind inline, da das besser zum Lesen ist:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
server {
    […]

    # Das ganze drumherum an Konfiguration des Blogs in Nginx (TLS,
    # Header, Rootverzeichnis, Logs, …) ist in andere Dateien
    # ausgegliedert. Hier ist nur der relevante Teil für alle
    # Verzeichnisse und Weiterleitungen.



    # Weiterleiten der alten Sitemap URLs auf die neue.
    # Es steht zwar auch schon in der robots.txt, man
    # kann es aber trotzdem machen.
    rewrite ^/sitemap.xml.gz[/]?$ /sitemap.xml permanent;
    rewrite ^/wp-sitemap-posts-post-2.xml$ /sitemap.xml permanent;
    rewrite ^/wp-sitemap-posts-post-1.xml$ /sitemap.xml permanent;



    # Bei neu eingerichteten Weiterleitungen der alten Feeds
    # zu den Feeds von Hugo verwende ich den HTTP Status
    # Code 302 "Found", sobald es sich als gut herausgestellt
    # hat, werde ich es auf 301 "Moved permanently" ändern.
    rewrite ^/feed/(rss|rss2|rdf|atom)[/]?$ /index.xml redirect;
    rewrite ^/category/(.*)/feed/(rss|rss2|rdf|atom)[/]?$ /categories/$1/index.xml redirect;
    rewrite ^/tag/(.*)/feed/(rss|rss2|rdf|atom)[/]?$ /tags/$1/index.xml redirect;

    rewrite ^/(feed|rss|rss2|rdf|atom)[/]?$ /index.xml redirect;
    rewrite ^/category/(.*)/(feed|rss|rss2|rdf|atom)[/]?$ /categories/$1/index.xml redirect;
    rewrite ^/tag/(.*)/(feed|rss|rss2|rdf|atom)[/]?$ /tags/$1/index.xml redirect;



    # Die Taxonomie ist in meinem Theme leicht anders als
    # in WordPress:
    rewrite ^/tag/(.*)$ /tags/$1 redirect;
    rewrite ^/category/(.*)$ /categories/$1 redirect;



    # Umleitungen zu Umlaut-URLs (siehe unten
    # im Blogbeitrag)
    rewrite ^/categories/mobilitaet(.*)$ /categories/mobilität$1 redirect;
    rewrite ^/tags/mobilitaet(.*)$ /tags/mobilität$1 redirect;
    rewrite ^/tags/muell(.*)$ /tags/müll$1 redirect;
    rewrite ^/tags/muellsammeln(.*)$ /tags/müllsammeln$1 redirect;
    […]



    # Habe das Verzeichnis der WordPress-Installation 1 zu 1
    # übernommen. Dort landen per Voreinstellung alle hochgeladenen
    # Dateien. Das Verzeichnis bleibt, da noch viele Beiträge
    # hier in Hugo das originale HTML von WordPress enthalten
    # und eingebettete Bilder von dort geladen werden und/oder
    # dorthin verweisen.
    location /wp-content/ {
        alias /pfad-zu/alten-wordpress-dateien/;
        include pfad-zu/static_files.conf;
    }



    # Alle Dateien bekommen eine maximal mögliche Lebenszeit.
    # Siehe nächster Abschnitt, wo die inkludierte Datei zu sehen ist.
    location / {
        include pfad-zu/static_files.conf;
    }
}

Tipp: Hier ein Blogbeitrag zu Weiterleitungen zu Umlaut-URLs, die Hugo aus Tags mit Umlauten generiert.

static-files.conf

Auch hier sind Anmerkungen wegen der Lesbarkeit inline:

 1    if ($request_uri ~* ".(jpg|jpeg|gif|zip|gz|avi|png|mpeg|mpg|txt|mp4|woff|woff2|ttf|eot)$") {
 2            expires 90d;
 3    }
 4
 5
 6
 7    # Das sind die von Hugo erstellen kleinen Varianten
 8    # von Bildern für Thumbnails.
 9    if ($request_uri ~* ".*hu[a-z0-9]{32}.*resize.*$") {
10        expires 300d;
11        break;
12    }
13
14
15
16    # Das Verzeichnis, in dem JavaScript Assets landen.
17    # Sobald sich die Ursprungsdatei ändert, ändert sich
18    # auch der Hashwert im Namen, sodass man eine sehr
19    # lange Lebenszeit angeben kann.
20    if ($request_uri ~* "^/js/.*$") {
21        expires 300d;
22        break;
23    }
24
25
26
27    # Hier gilt das selbe wie auch für die JavaScript
28    # Assets oben drüber.
29    if ($request_uri ~* "^/css/.*$") {
30        expires 300d;
31        break;
32    }
33
34
35
36    # Eingebundenes CSS und JS für Dinge, die
37    # ich relativ oft verändern möchte. Auch Favicons
38    # möchte ich relativ schnell ändern können.
39    if ($request_uri ~* ".(css|ico|js)$") {
40        expires 48h;
41    }

Das wars. Für mich funktioniert das so gut. Anmerkungen bitte per E-Mail.

Danke :)