Mon site utilise deux serveurs d’applications, à savoir app1 et app2. Dans la configuration, j’ai quelque chose comme ceci:
upstream cluster { server app1:8080; server app2:8080; }
Étant donné que chaque fois que je mets à jour le code, je dois redémarrer les deux processus serveur et que je souhaite que le service ne soit pas perturbé. Je vais suivre ces étapes manuellement:
Commentaire app1
dans le bloc en amont afin de le modifier en:
upstream cluster { #server app1:8080; server app2:8080; }
Exécuter nginx -s reload
Mettre à jour le code sur app1
et redémarrer le programme du serveur, puis décommenter app1
dans le bloc en amont
Effectuez les étapes 1 à 3 pour app2
Je souhaite écrire un script pour épargner ce travail fastidieux, alors ce que j’espère faire, c’est ceci:
Avoir un dossier nommé “available” qui contient app1.conf
et app2.conf
sous la forme
server app1:8080;
Avoir un autre dossier nommé “enabled” pour contenir les liens app1.conf
de app1.conf
et app2.conf
Modifier le cluster en amont dans
upstream cluster { include /usr/local/nginx/conf/enabled/*; }
Donc, chaque fois que je dois désactiver un serveur d’applications, je peux simplement supprimer le lien logiciel correspondant du dossier “activé”, puis le restaurer en exécutant ln -s
Cependant, cette approche n’a pas bien fonctionné car j’ai reçu un message d’erreur de nginx disant:
[emerg]: la directive “include” n’est pas autorisée ici dans ….
Est-ce que l’ include
ne peut pas être mise 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 parfois le serveur, comment les autres le traitent normalement?
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
utilisez 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 courir:
./upstreamctl.sh add app1:8080
et
./upstreamctl.sh rm app2:8080
Il suffit de mettre ceci ici au cas où nous pourrions aider les autres:
La directive Include peut être utilisée dans un 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; } }