我的网站使用两个app服务器,即app1和app2,所以在配置中我有这样的东西:
upstream cluster {
server app1:8080;
server app2:8080;
}
由于每次更新代码时我都需要重启两个服务器进程,并且我希望服务不受干扰,我将手动执行以下步骤:
在上游块中注释app1
,以便将其修改为:
upstream cluster {
#server app1:8080;
server app2:8080;
}
运行nginx -s reload
更新app1
处的代码并重新启动服务器程序,然后在上游块中取消注释app1
执行app2
我希望编写一个脚本来完成这项繁琐的工作,所以我希望这样做:
有一个名为“available”的文件夹,其中包含app1.conf
和app2.conf
格式为
server app1:8080;
让另一个名为“已启用”的文件夹包含app1.conf
和app2.conf
的
将上游群集修改为
upstream cluster {
include /usr/local/nginx/conf/enabled/*;
}
因此,每次我需要禁用任何应用服务器时,我都可以从“已启用”文件夹中删除相应的软链接,稍后可以通过运行ln -s
然而,这种方法效果不佳,因为我收到了来自nginx的错误消息:
[emerg]:这里不允许使用“include”指令......
那么include
是不是不能被放入上游块?而且我想我在这种情况下并不孤单,有时禁用和启用服务器,其他人通常如何处理它?</ p>
答案 0 :(得分:11)
不幸的是,nginx无法在上游处理include指令。 但您可以使用此脚本来管理上游服务器:
在nginx.conf的http部分中的某处:
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
答案 1 :(得分:5)
请将此放在这里,以防我们可以帮助其他人:
Include指令可以在nginx的更高版本的上游块中使用。
示例:
/etc/nginx/upstream.conf
150 x 150
/etc/nginx/conf.d/default.conf
server ip:port;
server ip:port;