Welche unterschiedlichen Verwendungen gibt es für sites-available im Vergleich zum conf.d-Verzeichnis für nginx?

98

Ich habe einige Erfahrungen mit Linux, aber keine mit Nginx. Ich wurde beauftragt, die Lastausgleichsoptionen für einen Anwendungsserver zu untersuchen.

Ich habe Apt-Get verwendet, um Nginx zu installieren und alles scheint in Ordnung.

Ich habe ein paar Fragen.

Was ist der Unterschied zwischen dem Ordner sites-available und dem Ordner conf.d? Beide Ordner waren in der Standardkonfiguration für nginx enthalten. Tutorials verwenden beide. Wofür sind sie gedacht und was ist die beste Vorgehensweise?

Wofür wird der für Websites aktivierte Ordner verwendet? Wie benutze ich es?

Die Standardkonfiguration bezieht sich auf einen WWW-Datenbenutzer? Muss ich diesen Benutzer erstellen? Wie erteile ich diesem Benutzer die optimalen Berechtigungen zum Ausführen von nginx?

Seth Spearman
quelle
Versuchen Sie, bei der Beantwortung von Fragen ein Schleichen des Oszilloskops zu vermeiden. www-dataist ein separates Thema. Die meisten Betriebssysteme definieren einen separaten Benutzer mit niedrigeren Berechtigungen, als den der Prozess nach dem Binden an Port 80 als Root ausgeführt werden kann. Es ist in der Konfigurationsdatei definiert. Wenden Sie von dort aus grundlegende Sicherheitspraktiken an. Lassen Sie den Benutzer nicht auf etwas schreiben, auf das der Webserver nicht schreiben muss. Lassen Sie andere Benutzer nur dann auf die Dateien schreiben, wenn dies beabsichtigt ist.
Andrew B

Antworten:

93

Die sites- * Ordner werden von nginx_ensiteund verwaltet nginx_dissite. Für Apache-httpd-Benutzer, die dies mit einer Suche finden, ist das Äquivalent a2ensite/ a2dissite.

In diesem sites-availableOrdner werden alle Ihre vhost-Konfigurationen gespeichert, unabhängig davon, ob sie derzeit aktiviert sind oder nicht.

Der sites-enabledOrdner enthält Symlinks zu Dateien im Ordner sites-available. Auf diese Weise können Sie vhosts selektiv deaktivieren, indem Sie den Symlink entfernen.

conf.derledigt den Job, aber Sie müssen etwas aus dem Ordner verschieben, löschen oder Änderungen daran vornehmen, wenn Sie etwas deaktivieren müssen. Die sites- * Ordner-Abstraktion macht die Dinge etwas organisierter und ermöglicht Ihnen, sie mit separaten Support-Skripten zu verwalten.

(es sei denn, Sie sind wie ich und einer von vielen Debian-Administratoren, die die Symlinks direkt verwaltet haben und nichts über die Skripte wissen ...)

Andrew B
quelle
12
Habe ich etwas falsch gemacht? Verstehe die Ablehnung nicht.
Andrew B
1
Ich bin neugierig, ob das in Nginx eingebaut ist. Ich habe manuell github.com/perusio/nginx_ensite
lfender6445
18
Es ist wichtig anzumerken, dass dies sites-available|sites-enabledein Debian-Ismus ist und nicht etwas, was Nginx oder Apache tun. Es war wahrscheinlich in der Vergangenheit recht nützlich, aber in Zeiten des Konfigurationsmanagements und der Container ist seine Nützlichkeit etwas eingeschränkt.
Michael Hampton
Können Sie kommentieren, wie Konfigurationsverwaltung und Container den Nutzen von Sites einschränken, die | für Sites verfügbar sind?
Karthik Vee
1
@karthikvee der punkt ist, dass heutzutage server oft als kurzlebige container erscheinen, die nur eine einzelne website / einen einzelnen service bedienen, sodass dies nginx.confohne einbußen bei der lesbarkeit berücksichtigt werden kann. Dies steht im Gegensatz zu dem Ansatz vor einigen Jahren, als Server normalerweise Dutzende von Websites speichern würden.
Adamczi
38

Ich möchte zu den vorherigen Antworten hinzufügen, dass das Wichtigste nicht ist, wie Sie die Verzeichnisse aufrufen (obwohl dies eine sehr nützliche Konvention ist), sondern was Sie tatsächlich eingeben nginx.conf. Beispielkonfiguration:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

Die einzige Anweisung, die hier verwendet wird, ist include , daher gibt es keinen internen Unterschied zwischen zB conf.d/und sites-enabled/.

Aus der obigen Dokumentation:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

Um die ursprüngliche Frage zu beantworten: Es gibt keinen internen Unterschied, und Sie können sie so gut wie möglich verwenden, wobei Sie sich an die Ratschläge der anderen Antworten erinnern. Und bitte vergessen Sie nicht, die "richtige" Antwort zu wählen.

Jaroslaw Nikitenko
quelle
1
Richtig, sites-enabledwurde durch eine Art Distribution erfunden, die wie ein nerviges Zwischenprodukt herumwirbelt. Holen Sie sich Nginx aus der offiziellen Quelle : Sie erhalten ein aktuelles Produkt und werden diesen Konfigurationsfehler / die Hölle los.
Bernard Rosset
2
Dies erklärt, warum es in der offiziellen Nginx-Dokumentation keinen einzigen Verweis auf diese Namenskonvention gibt. Es ist ein Drittanbieter-Projekt! github.com/perusio/nginx_ensite
AxeEffect
30

In der Regel wird der sites-enabledOrdner für virtuelle Hostdefinitionen verwendet, während conf.der für die globale Serverkonfiguration verwendet wird. Wenn Sie mehrere Websites unterstützen - dh virtuelle Hosts -, erhält jede eine eigene Datei, sodass Sie diese ganz einfach aktivieren und deaktivieren können, indem Sie Dateien in und aus verschieben sites-enabled(oder Symlinks erstellen und entfernen, was wahrscheinlich der Fall ist) eine bessere Idee).

Verwenden Sie diese conf.dOption zum Laden von Modulen, für Protokolldateien und für andere Dinge, die nicht für einen einzelnen virtuellen Host spezifisch sind.

Die Standardkonfiguration bezieht sich auf einen WWW-Datenbenutzer? Muss ich diesen Benutzer erstellen?

Sie sollten nginx als Benutzer ohne Rootberechtigung ausführen. Dies ist in einigen Fällen benannt www-data, aber Sie können es benennen, was Sie wollen.

Wie erteile ich diesem Benutzer die optimalen Berechtigungen zum Ausführen von nginx?

Ich bin mir der Antwort auf diese Frage weniger sicher (ich verwende derzeit kein Nginx), aber wenn es sich um etwas wie Apache handelt, muss der www-dataBenutzer nur Leseberechtigungen für statische Dateien besitzen (und in Verzeichnissen lesen + ausführen) ) dass Sie Berechtigungen für Dinge wie CGI-Skripte bereitstellen oder lesen / ausführen und sonst nirgends Berechtigungen.

larsks
quelle
1
Ein dedizierter Benutzer zum Ausführen des Webservers ist ebenfalls wichtig, da die Anmeldefunktion für diesen Benutzer durch Entfernen eines gültigen Shell-Datensatzes deaktiviert wird.
DukeLion
> 'Sie sollten nginx als Nicht-Root-Benutzer ausführen lassen' - könnten Sie mehr darüber ausarbeiten?
lfender6445
1
Das Ausführen als nicht privilegierter Benutzer ist eine Möglichkeit, den Schaden einzudämmen, der sich aus einer Remote-Kompromittierung ergeben kann. Wenn Sie einen Webserver als ausführen rootund eine Art Remote-Kompromittierung vorliegt, hat der Angreifer sofort vollen Zugriff auf das System. Wenn Sie als nicht privilegierter Benutzer ausgeführt werden, ist der Administratorzugriff nur in Kombination mit einem lokalen Exploit möglich.
Larsks
14

Was ist los?

Sie müssen Debian oder Ubuntu verwenden, da das Böse sites-available / die sites-enabledLogik nicht von der Upstream-Paketierung von Nginx von http://nginx.org/packages/ verwendet wird .

In beiden Fällen werden beide mit Hilfe der Standard- includeDirektive in als Konfigurationskonvention implementiert /etc/nginx/nginx.conf.

Hier ist ein Ausschnitt /etc/nginx/nginx.confaus einem offiziellen Upstream-Paket von nginx von nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Hier ist ein Ausschnitt /etc/nginx/nginx.confaus Debian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Aus Sicht von NGINX besteht der einzige Unterschied darin, dass Dateien von conf.dfrüher verarbeitet werden. Wenn Sie also Konfigurationen haben, die im Hintergrund miteinander in Konflikt stehen, haben diese conf.dmöglicherweise Vorrang vor denen in sites-enabled.


Best Practice ist conf.d.

Sie sollten verwenden /etc/nginx/conf.d, da dies eine Standardkonvention ist, und sollten überall funktionieren.

Wenn Sie eine Site deaktivieren müssen, benennen Sie den Dateinamen einfach so um, dass er kein .confSuffix mehr hat. Dies ist sehr einfach, unkompliziert und fehlerfrei:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

Oder das Gegenteil, um eine Site zu aktivieren :

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


Vermeiden sites-available& sites-enabledum jeden Preis.

Ich sehe absolut keinen Grund, sites-available/ zu benutzen sites-enabled:

  • Einige Leute haben nginx_ensiteund nginx_dissiteSkripte erwähnt - die Namen dieser Skripte sind noch schlimmer als der Rest dieses Debakels - aber diese Skripte sind auch nirgends zu finden - sie fehlen nginxsogar in Debian (und wahrscheinlich auch in Ubuntu) im Paket , und auch nicht in einem eigenen Paket vorhanden. Benötigen Sie wirklich ein nicht standardmäßiges Drittanbieter-Skript, um die Dateien einfach zwischen den beiden Verzeichnissen zu verschieben und / oder zu verknüpfen ?!

  • Und wenn Sie die Skripte nicht verwenden (was in der Tat eine gute Wahl ist, wie oben beschrieben), stellt sich die Frage, wie Sie die Websites verwalten:

    • Erstellen Sie symbolische Links von sites-availablebis sites-enabled?
    • Dateien kopieren?
    • Verschieben Sie die Dateien?
    • Bearbeiten Sie die Dateien an Ort und Stelle in sites-enabled?

Das oben Genannte scheint ein paar kleinere Probleme anzugehen, bis einige Leute anfangen, das System zu verwalten, oder bis Sie eine schnelle Entscheidung treffen, nur um es Monate oder Jahre später zu vergessen ...

Welches bringt uns zu:

  • Ist es sicher, eine Datei von zu entfernen sites-enabled? Ist es eine weiche Verbindung? Eine harte Verbindung? Oder die einzige Kopie der Konfiguration? Ein Paradebeispiel für die Hölle der Konfiguration.

  • Welche Websites wurden deaktiviert? (Führen Sie conf.dmit nur eine Inversionssuche nach Dateien durch, die nicht mit .conf- enden find /etc/nginx/conf.d -not -name "*.conf", oder verwenden Sie grep -v.)

Nicht nur all das oben Genannte, sondern auch die spezielle includeAnweisung, die von Debian / Ubuntu verwendet wird - /etc/nginx/sites-enabled/*- für sites-enabledwird im Gegensatz zu für kein Dateinamensuffix angegeben conf.d.

  • Was dies bedeutet ist , dass , wenn Sie ein Tag entscheiden , um schnell eine Datei oder zwei innerhalb zu bearbeiten /etc/nginx/sites-enabledund Ihre emacsBackup - Datei erstellt , wie default~, dann plötzlich, haben Sie beide defaultund default~als aktive Konfiguration enthalten, die je Richtlinien verwendet wird , kann nicht einmal geben Sie alle Warnungen und führen zu einer längeren Debugging-Sitzung. (Ja, es ist mir passiert; es war während eines Hackathons und ich war total verwirrt darüber, warum meine Konferenz nicht funktioniert hat.)

Daher bin ich überzeugt, dass sites-enableddas reine Böse ist!

cnst
quelle
Zusätzlich zu all dem, ist es anscheinend auch sehr verbreitet, falsche Symlinks zu erstellen! stackoverflow.com/a/14107803/1122270 Nur für den Fall, dass Sie es nicht für sites-enabledböse genug hielten !
27.
Manchmal kann es auch vorkommen, dass sich jemand entscheidet, die Dateien zu bearbeiten sites-enabled, und dann eine andere Person entscheidet, sie zu deaktivieren, indem sie sie löscht. Möglicherweise glaubt sie, es handele sich nur um einen Symlink. stackoverflow.com/q/45852224/1122270
cnst
Ich muss mit den Behauptungen über sites-availableund nicht einverstanden sein sites-enabled; Es ist wichtig, dass Sie Konfigurationsdateien außerhalb des "Live" -Pickup-Verzeichnisses so vorbereiten können, dass Nginx beim erneuten Laden oder Neustarten keine partiellen Konfigurationsdateien aufnimmt. Es kann auch nützlich sein, Konfigurationsdateien zu behalten, die nicht mehr aktiv sind. Das Erstellen von Symlinks ist keine besonders schwierige Aufgabe, wenn Sie über ausreichend Erfahrung verfügen, um Nginx, IMO, zu verwalten.
BE77Y
@ BE77Y Sie gehen komplizierter vor. Bei der Programmierung wird empfohlen, nicht verwendeten Code vollständig zu entfernen und ihn nicht nur zu deaktivieren oder auszukommentieren. Ich sehe keinen Grund, warum DevOps anders sein sollte - wenn eine Konfiguration nicht mehr benötigt wird, entfernen Sie sie (sie sollte noch in Ihrem VCS vorhanden sein). Dasselbe gilt für partielle Conf-Dateien - warum sollten Sie sie aktivieren und Nginx hinter Ihrem Rücken neu laden lassen? ( USR1, Die wieder öffnen logs, reload nicht Konf.) Ich finde Ihre Symlink „Erfahrung“ Kommentare falsche Richtung - die Frage ist eine Frage der Konsequenz, die wenig mit Erfahrung zu tun hat.
22.
2
Es ist klar, dass a) dies nicht das geeignete Medium für diese Diskussion ist und vielleicht noch wichtiger, b) es wahrscheinlich in jedem Fall fruchtlos ist. Lassen Sie uns zustimmen, nicht zuzustimmen.
BE77Y