2010-11-12 5 views
7

Meine Seite nutzt zwei App-Server, nämlich app1 und app2, so in der Konfiguration, die ich so etwas wie diese:Kann die "include" -Direktive innerhalb des Upstream-Blocks von nginx verwendet werden?

upstream cluster { 
    server app1:8080; 
    server app2:8080; 
} 

Da jedes Mal, wenn ich den Code ich beiden Server-Prozesse neu zu starten, muß aktualisiert werden, und ich möchte den Dienst ungestörte, werde ich diese Schritte manuell folgen:

  1. Comment app1 innerhalb vorgeschalteten Blocks, damit es in modifizieren:

    upstream cluster { 
        #server app1:8080; 
        server app2:8080; 
    } 
    
  2. Run nginx -s reload

  3. Update-Code auf app1 und das Server-Programm neu starten und dann uncomment app1 in Upstream-Block

  4. Führen Sie die Schritte 1-3 für app2

Ich möchte ein schreiben Skript, um diese mühsame Arbeit zu ersparen, so was ich hoffe, ist dies:

  1. Haben Sie einen Ordner "verfügbar" genannt, die app1.conf und app2.conf in Form enthält als

    server app1:8080; 
    
  2. haben einen anderen Ordner mit dem Namen "aktiviert", um die Soft-Links von app1.conf und app2.conf

  3. Ändern Sie den Upstream enthalten Cluster in

    Also jedes Mal, wenn ich jeden App-Server deaktivieren muss, kann ich einfach rem ove den entsprechenden Soft-Link aus den „freigegeben“ Ordnern, und später kann es wiederherstellen, indem ln -s

Doch dieser Ansatz läuft gut funktionierte nicht, wie ich eine Fehlermeldung von nginx bekam sagen:

[Emerg]: "include" Richtlinie wird hier nicht ....

ist erlaubt, dass so include kann nicht nicht in den vorgeschalteten Block gesetzt werden? und ich könnte mir vorstellen, dass ich in einem solchen Szenario nicht alleine bin, den Server manchmal sperrend und aktivierend, wie andere Leute normalerweise damit umgehen?

Antwort

10

Leider kann nginx nicht include directive in upstream umgehen. Aber Sie können dieses Skript verwenden, um Ihre Upstream-Server zu verwalten:

irgendwo im http-Abschnitt von Nginx.conf:

dieses Skript
touch /usr/local/nginx/conf/upstream.conf 

Verwendung Upstream-Servern (upstreamctl.sh) zu verwalten:

include /usr/local/nginx/conf/upstream.conf 

leere Datei erstellen Sie ausführen können

#!/bin/bash 
if [ -n "$1" -a -n "$2" ]; then 
    action="$1"; 
    target="$2"; 
else 
    echo "Usage: $0 (add|rm) server:port" 
    exit 0; 
fi; 
# Path to nginx binary 
BIN="/usr/local/nginx/sbin/nginx" 
# Path to upstream config file 
CONF="/usr/local/nginx/conf/upstream.conf" 

SERVERS=`cat $CONF | grep server` 

output="upstream cluster {" 


if [ $action == "add" ]; then 
    echo -e "$output" > $CONF 
    if $(echo $SERVERS | grep --quiet $target); then 
     echo "Warning: Server is already enabled." 
    else 
     SERVERS="$SERVERS\n\tserver $target;" 
    fi 
    echo -e "$SERVERS" >> $CONF 
    echo "}" >> $CONF 

elif [ $action == "rm" ]; then 
    sed -i "/$target/d" $CONF 
else 
    echo "Unknown action" 
fi 

# Check changes: 
$BIN -t 

In Ihrem Fall:

./upstreamctl.sh add app1:8080 

und

./upstreamctl.sh rm app2:8080 
3

dies hier setzen Gerade falls wir anderen helfen können:

Include Anweisung in Upstream-Block in späteren Versionen von nginx verwendet werden können.

Beispiel:

/etc/nginx/upstream.conf

server ip:port; 
server ip:port; 

/etc/nginx/conf.d/default.conf

upstream cluster { 
    include /etc/nginx/upstream.conf; 
} 
server { 
    listen  80; 
    server_name localhost; 
    location/{ 
     proxy_pass http://cluster; 
    } 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
} 
+0

passieren Sie wissen, welche Ausführung ? –

+0

Ich verwendete die neueste Version zu der Zeit, aber Sie können es leicht testen, indem Sie die Konfiguration ändern und nginx -t zur Überprüfung ausführen. –

Verwandte Themen