Можно ли использовать директиву include в вышестоящем блоке nginx? - PullRequest
9 голосов
/ 12 ноября 2010

Мой сайт использует два сервера приложений, а именно app1 и app2, поэтому в конфигурации у меня что-то вроде этого:

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

Поскольку каждый раз, когда я обновляю код, мне нужно перезапустить оба серверных процесса, и я хочу, чтобы служба не работала, я буду выполнять следующие шаги вручную:

  1. Комментарий app1 внутри вышестоящего блока, чтобы изменить его на:

    upstream cluster {
        #server app1:8080;
        server app2:8080;
    }
    
  2. Выполнить nginx -s reload

  3. Обновите код на app1 и перезапустите серверную программу, а затем раскомментируйте app1 в восходящем блоке

  4. Выполните шаги 1-3 для app2

Я хочу написать сценарий, чтобы избавить от этой утомительной работы, поэтому я надеюсь сделать следующее:

  1. Иметь папку с именем «available», которая содержит app1.conf и app2.conf в форме

    server app1:8080;  
    
  2. Иметь другую папку с именем «enabled», которая будет содержать программные ссылки app1.conf и app2.conf

  3. Измените вышестоящий кластер на

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

    Таким образом, каждый раз, когда мне нужно отключить любой сервер приложений, я могу просто удалить соответствующую программную ссылку из «включенной» папки, а затем восстановить ее, запустив ln -s

Однако этот подход не сработал, так как я получил сообщение об ошибке от nginx:

[emerg]: директива include не допускается здесь в ....

Так ли include нельзя поместить в блок восходящего потока? и я полагаю, что я не одинок в этом сценарии, время от времени отключая и включая сервер, как другие люди обычно справляются с этим?

Ответы [ 2 ]

11 голосов
/ 08 января 2012

К сожалению, nginx не может обработать директиву include внутри апстрима. Но вы можете использовать этот скрипт для управления вышестоящими серверами:

где-то в разделе http файла nginx.conf:

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

создать пустой файл:

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

использовать этот скрипт для управления вышестоящими серверами ( 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

В вашем случае вы можете запустить:

./upstreamctl.sh add app1:8080

и

./upstreamctl.sh rm app2:8080
5 голосов
/ 01 марта 2017

Просто поместите это здесь на случай, если мы сможем помочь другим:

Директива включения может использоваться в восходящем блоке в последующих версиях nginx.

Пример:

/ 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...