La directive “include” peut-elle être utilisée dans le bloc en amont de nginx?

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:

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

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

  3. Mettre à jour le code sur app1 et redémarrer le programme du serveur, puis décommenter app1 dans le bloc en amont

  4. 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:

  1. Avoir un dossier nommé “available” qui contient app1.conf et app2.conf sous la forme

     server app1:8080; 
  2. Avoir un autre dossier nommé “enabled” pour contenir les liens app1.conf de app1.conf et app2.conf

  3. 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; } }