2010-11-12 11 views
7

Il mio sito utilizza due application server, vale a dire app1 e app2, quindi nella configurazione che ho qualcosa di simile:La direttiva "include" può essere utilizzata nel blocco upstream di nginx?

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

Dal momento che ogni volta che aggiornare il codice ho bisogno di riavviare entrambi i processi server e voglio il servizio indisturbata, io seguente procedura manualmente:

  1. Commento app1 all'interno del blocco a monte in modo da modificare in:

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

  3. codice di aggiornamento a app1 e riavviare il programma server, quindi rimuovere il commento app1 nel blocco a monte

  4. Do i passaggi 1-3 per app2

desidero scrivere un script per risparmiare questo noioso lavoro, quindi quello che spero di fare è questo:

  1. avere una cartella denominata "disponibile", che contiene app1.conf e app2.conf in forma come

    server app1:8080; 
    
  2. avere un'altra cartella denominata "abilitato" per contenere i soft link di app1.conf e app2.conf

  3. Modificare il monte cluster in

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

    Così ogni volta che ho bisogno di disattivare qualsiasi server di app posso solo rem Ove il soft link corrispondente dalla cartella "enabled", e più tardi in grado di ripristinare eseguendo ln -s

Tuttavia questo approccio non ha funzionato bene come ho ricevuto un messaggio di errore da nginx dicendo:

[Emerg]: "include" direttiva non è permesso qui a ....

è così include non si può non essere messo in blocco a monte? e immagino di non essere solo in questo tipo di scenario, disabilitando e abilitando il server a volte, come gli altri normalmente si occupano di esso?

risposta

10

Sfortunatamente, nginx non può gestire la direttiva include all'interno di upstream. Ma è possibile utilizzare questo script per gestire i server upstream:

da qualche parte nella sezione http di nginx.conf:

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

creare file vuoto:

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

uso questo script per gestire i server upstream (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 

Nel tuo caso si possono eseguire:

./upstreamctl.sh add app1:8080 

e

./upstreamctl.sh rm app2:8080 
3

Basta mettere questo qui nel caso in cui siamo in grado di aiutare gli altri:

direttiva include può essere utilizzato in blocco a monte nelle versioni successive di nginx.

Esempio:

/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

Ti capita di sapere quali versione? –

+0

Stavo usando l'ultima volta, ma è possibile testarlo facilmente modificando la configurazione ed eseguendo nginx -t per verificare. –

Problemi correlati