2010-11-12 3 views
7

Mon site utilise deux serveurs d'applications, à savoir app1 et App2, donc dans la configuration que j'ai quelque chose comme ceci:La directive "include" peut-elle être utilisée dans le bloc amont de nginx?

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

Depuis chaque fois que je mets à jour le code que je dois redémarrer les deux processus serveur et je veux le service non perturbée, je vais suivre ces étapes manuellement:

  1. Commentaire app1 dans le bloc en amont afin de le modifier en:

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

  3. Code de mise à jour à app1 et redémarrez le programme serveur, puis uncomment app1 dans le bloc amont

  4. Effectuez les étapes 1-3 pour app2

Je souhaite écrire un script pour épargner ce travail fastidieux, donc ce que j'espère faire est la suivante:

  1. avoir un dossier nommé « disponible » qui contient app1.conf et app2.conf sous forme que

    server app1:8080; 
    
  2. Demandez à un autre dossier nommé « activé » pour contenir les liens souples de app1.conf et app2.conf

  3. Modifier l'amont cluster en

    upstream cluster { 
        include /usr/local/nginx/conf/enabled/*; 
    } 
    

    Donc, chaque fois que je dois désactiver un serveur d'application, je peux juste rem ove le lien souple correspondant du « activé » dossier, puis peut restaurer en exécutant ln -s

Cependant, cette approche ne fonctionne pas bien comme je l'ai reçu un message d'erreur de nginx disant:

[Emerg]: « inclure » la directive n'est pas autorisé ici ....

est-ce si include ne peut pas être mis dans le bloc en amont? et j'imagine que je ne suis pas seul dans ce genre de scénario, en désactivant et en activant le serveur à la fois, comment les autres gens traitent normalement avec lui?

Répondre

10

Malheureusement, nginx ne peut pas gérer la directive include en amont ,. Mais vous pouvez utiliser ce script pour gérer vos serveurs en amont:

quelque part dans la section http de nginx.conf:

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

créer un fichier vide:

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

utiliser ce script pour gérer les serveurs en amont (upstreamctl.sh):

#!/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 

Dans votre cas, vous pouvez exécuter:

./upstreamctl.sh add app1:8080 

et

./upstreamctl.sh rm app2:8080 
3

Juste mettre cela ici au cas où nous pouvons aider les autres:

Include peut être utilisé dans le bloc en amont dans les versions ultérieures de nginx.

Exemple:

/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

ne vous connaissez qui version ? –

+0

J'utilisais la dernière version à la fois, mais vous pouvez facilement la tester en modifiant la configuration et en exécutant nginx -t pour vérifier. –

Questions connexes