用于实现nginx负载均衡分配时特殊标识的轮询脚本:
#!/bin/bash
# 定义nginx的upstream配置文件路径
UPSTREAM_CONF_PATH=/etc/nginx/conf.d/upstream.conf
# 读取特殊标识
while getopts "t:" opt; do
case $opt in
t)
TAG=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# 根据标识从upstream配置文件中获取对应的upstream服务器列表
SERVERS=$(grep -oP "(?<=zone $TAG )[^\{\}\s]+" $UPSTREAM_CONF_PATH)
# 将服务器列表转换为数组
IFS=' ' read -ra SERVERS_ARR <<< "$SERVERS"
# 轮询选出一个服务器
CURRENT_INDEX_FILE=/var/run/nginx-lb-${TAG}.idx
if [ ! -f $CURRENT_INDEX_FILE ]; then
echo 0 > $CURRENT_INDEX_FILE
fi
CURRENT_INDEX=$(cat $CURRENT_INDEX_FILE)
if [ $CURRENT_INDEX -ge ${
#SERVERS_ARR[@]} ]; then
CURRENT_INDEX=0
fi
echo $((CURRENT_INDEX+1)) > $CURRENT_INDEX_FILE
echo ${SERVERS_ARR[CURRENT_INDEX]}
该脚本需要传入一个参数 -t
,用于指定特殊标识。例如,如果我们用 example.com
作为特殊标识,则执行以下命令来调用该脚本:
./nginx-lb.sh -t example.com
该脚本会从nginx的upstream配置文件 /etc/nginx/conf.d/upstream.conf
中读取名为 example.com
的upstream定义,并从中获取服务器列表。然后,它会使用一个简单的轮询算法,将服务器列表中的服务器依次选出来。该脚本会在 /var/run/nginx-lb-${TAG}.idx
文件中记录当前的选中服务器下标,以实现轮询的连续性。