可以在nginx的上游块中使用"include"指令吗?

Jie*_*Jie 10 nginx include

我的网站使用两个app服务器,即app1和app2,所以在配置中我有这样的东西:

upstream cluster {
    server app1:8080;
    server app2:8080;
}
Run Code Online (Sandbox Code Playgroud)

由于每次更新代码时我都需要重新启动两个服务器进程,并且我希望服务不受干扰,我将手动执行以下步骤:

  1. app1在上游块内注释,以便将其修改为:

    upstream cluster {
        #server app1:8080;
        server app2:8080;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. nginx -s reload

  3. 更新代码app1并重新启动服务器程序,然后app1在上游块中取消注释

  4. 执行步骤1-3 app2

我希望编写一个脚本来完成这项繁琐的工作,所以我希望这样做:

  1. 有一个名为"available"的文件夹,其中包含app1.confapp2.conf形式为

    server app1:8080;  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 有一个名为"已启用"另一个文件夹包含的软链接app1.confapp2.conf

  3. 将上游集群修改为

    upstream cluster {
        include /usr/local/nginx/conf/enabled/*;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    因此,每次我需要禁用任何应用服务器时,我只需从"已启用"文件夹中删除相应的软链接,稍后可以通过运行来恢复它 ln -s

但是这种方法效果不好,因为我收到了来自nginx的错误消息:

[emerg]:这里不允许使用"include"指令....

难道这样include不能被放入上游区块吗?而且我想我在这种情况下并不孤单,有时禁用和启用服务器,其他人通常如何处理它?

Ser*_*kov 12

不幸的是,nginx无法在上游内部处理include指令.但您可以使用此脚本来管理上游服务器:

在nginx.conf的http部分的某个地方:

include /usr/local/nginx/conf/upstream.conf
Run Code Online (Sandbox Code Playgroud)

创建空文件:

touch /usr/local/nginx/conf/upstream.conf
Run Code Online (Sandbox Code Playgroud)

使用此脚本来管理上游服务器(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
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以运行:

./upstreamctl.sh add app1:8080
Run Code Online (Sandbox Code Playgroud)

./upstreamctl.sh rm app2:8080
Run Code Online (Sandbox Code Playgroud)


Far*_*ahi 6

只是把它放在这里,以防我们可以帮助别人:

Include指令可以在nginx的更高版本的上游块中使用.

例:

/etc/nginx/upstream.conf

server ip:port;
server ip:port;
Run Code Online (Sandbox Code Playgroud)

/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;
    }
}
Run Code Online (Sandbox Code Playgroud)