2010-11-12 10 views
7

Mi sitio utiliza dos servidores de aplicaciones, a saber app1 y app2, por lo que en la configuración que tengo algo como esto:¿Se puede usar la directiva "include" dentro del bloque upstream de nginx?

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

Dado que cada vez que actualizar el código tengo que reiniciar ambos procesos del servidor y quiero el servicio sin molestias, voy a seguir estos pasos manualmente:

  1. comentario app1 dentro del bloque aguas arriba de modo que modificarlo en:

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

  3. código de actualización en app1 y reinicie el programa de servidor, y luego elimine el comentario app1 en el bloque de aguas arriba

  4. realice los pasos 1-3 para app2

Me gustaría escribir una secuencia de comandos para ahorrar este trabajo tedioso, así que lo que espero hacer es esto:

  1. han nombrado "disponibles", que contiene app1.conf y app2.conf en forma tan

    server app1:8080; 
    
  2. otra carpeta denominada han "activado" para contener los enlaces blandos de app1.conf y app2.conf

  3. Modificar el sentido ascendente una carpeta clúster en

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

    Así que cada vez que tengo que deshabilitar cualquier servidor de aplicaciones puedo simplemente rem ove el enlace blando correspondiente de la carpeta "activado", y más tarde puede restaurar mediante la ejecución de ln -s

Sin embargo, este enfoque no funcionaba bien ya que me dieron un mensaje de error de nginx diciendo:

[emerg]: "incluir" directiva no está permitido aquí en ....

es eso tan include no puede no ser puesto en el bloque de aguas arriba? y me imagino que no estoy solo en este tipo de situaciones, deshabilitando y habilitando el servidor a veces, ¿cómo otras personas normalmente lidian con eso?

Respuesta

10

Desafortunadamente, nginx no puede manejar la directiva include dentro del flujo ascendente. Pero puede usar esta secuencia de comandos para administrar sus servidores ascendentes:

en algún lugar de la sección http de nginx.conf:

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

crear el archivo vacío:

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

uso de este script para gestionar servidores 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 

En su caso, usted puede ejecutar:

./upstreamctl.sh add app1:8080 

y

./upstreamctl.sh rm app2:8080 
3

sólo poner esto aquí en caso de que podemos ayudar a los demás:

directiva include se puede utilizar en el bloque de aguas arriba en versiones posteriores de nginx.

Ejemplo:

/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

qué le sucede a saber qué versión ? –

+0

Estaba usando lo último en ese momento, pero puede probarlo fácilmente modificando la configuración y ejecutando nginx -t para verificar. –

Cuestiones relacionadas