So setzen Sie programmgesteuert nur einen bestimmten Nginx-Serverblock in den Wartungsmodus


7

Ich suche nach einer Lösung, um einen Bereitstellungsprozess unserer Anwendung zu automatisieren. Zu Beginn der Bereitstellung möchte ich den angegebenen Server programmgesteuert in den Wartungsmodus versetzen und schließlich nach Abschluss der Bereitstellung das Flag für den Wartungsmodus vom Nginx-Server entfernen.

Mit Wartungsmodus meine ich, dass nginx auf alle Anforderungen (mit einer möglichen benutzerdefinierten Seite) mit dem HTTP-Antwortcode 503 antworten sollte.

Ich weiß, wie der Serverblock so eingestellt wird, dass er mit 503-Code antwortet (siehe http://www.cyberciti.biz/faq/custom-nginx-maintenance-page-with-http503/ ), aber die Frage ist, wie dies programmgesteuert durchgeführt wird und am effizientesten.

Mir sind zwei Optionen in den Sinn gekommen:

Option 1: Schreiben Sie zu Beginn des Bereitstellungsprozesses eine Wartungsdatei in das Dokumentstammverzeichnis und überprüfen Sie bedingt, ob die Wartungsdatei in der Nginx-Serverkonfiguration vorhanden ist:

server {
    if (-f $document_root/in_maintenance_mode) {
        return 503;
    }
}

Diese Methode enthält einen gewissen Overhead, da das Vorhandensein von Dateien für jede Anforderung überprüft wird. Ist es möglich, das Vorhandensein einer Datei nur beim Laden der Nginx-Konfiguration zu überprüfen?

Option 2: Das Bereitstellungsskript ersetzt die gesamte Konfigurationsdatei des Nginx-Servers durch eine Wartungsversion und tauscht sie am Ende der Bereitstellung zurück. Wenn diese Methode verwendet wird, bin ich besorgt über mögliche andere Automatisierungsprozesse wie Puppet, die möglicherweise die Wartungskonfigurationsdatei überschreiben.


Ich glaube, Option 1 ist der Standard dafür. Ja, bei jeder Anfrage fallen Gemeinkosten an. Auf der anderen Seite bringt dich der Overhead um? Option 2 erfordert, dass das Bereitstellungsskript über Sysadmin-Berechtigungen über den Webserverteil des Stapels verfügt. Das mag in Ihrem Fall wahr sein, aber es ist nicht allgemein wahr.
CJC

@cjc danke für deinen Kommentar. Nein, nicht in der Tat, dieser Overhead tötet nicht - ich möchte nur unnötigen Overhead vermeiden. In diesem Fall können wir sogar unsere Server verwenden, /run/shmdamit die Überprüfung der Dateidexistenz nicht auf die Festplatte gelangt. Alle anderen Kommentare sind ebenfalls willkommen.
Ville Mattila

Antworten:


4

Option 1 ist die beste Wahl. Wenn Sie eine zusätzliche Dateianforderung stört (obwohl fast kein Overhead darin liegt), können Sie sie durch die Variablenprüfung ersetzen:

set $maintenance "on";
if ($maintenance = "on") {
    return 503;
}

0

Ich mache Folgendes:

  • Verwenden Sie keinen expliziten Schalter, sondern lassen Sie Haproxy (oder Lack) die nächste vorgelagerte Komponente sein
  • Deaktivieren Sie die nächste Komponente oder verschieben Sie sie an einen separaten Port
  • Verwenden Sie das folgende Snippet:

    ...
    error_page 502 503 /_maintenance/index.html;
    location ^~ /_maintenance {
        alias some/place/on/your/disk/static/_maintenance;
    }
    ...
    

Vielen Dank für Ihren Kommentar. Ich glaube, dass das Hinzufügen einer weiteren Komponente zum Stapel nur für den Wartungsmodus sehr viel Aufwand bedeutet. Trotzdem kann Lack bei anderen Problemen helfen.
Ville Mattila

Recht. Mein Setup beinhaltet im Allgemeinen Nginx / Lack / Haproxy. Ich lasse Lack weg, wenn ich ihn wirklich nicht brauche. Aber Haproxy ist wirklich wertvoll für seine "Live-Überwachung" und sehr nützliche Protokollierung von Timings, Warteschlangenlängen usw.
Theuni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.