我有一些奇怪的问题试图使用nginx的上游指令自动化Docker容器的部署。 出于某种原因,当我手动做下面的工作,但是当我尝试自动化它,我没有得到一致的结果。
基本上我把最新的图像停止,删除2个正在运行的容器中的1个然后启动容器然后更新nginx上游conf文件重新加载nginxconfiguration。 重复第二个容器。
看起来很简单,但由于某种原因,我可以“让这个工作在一个bash脚本所有的时间。 我正在使用seige来加载testing应用程序。
siege -d1 -t75S -c25 http://192.168.49.4:8087
我的脚本自动化部署运行脚本之前,最新的图像被拉。
#! /bin/bash appname=appnamexyz; appport=8000; host_ip=192.168.49.4; registry=192.168.254.96; echo "upstream api_servers {${nl} server $(docker port ${appname}-1 ${appport}) max_fails=2 fail_timeout=1s;${nl} server $(docker port ${appname}-2 ${appport}) max_fails=2 fail_timeout=1s;${nl} }" > /etc/nginx/conf.d/api_upstream.conf sed -i "s/server $(docker port $appname-1 $appport)/server xxx/g" /etc/nginx/conf.d/api_upstream.conf docker stop $appname-1 docker rm -f $appname-1 docker run -d --name $appname-1 -p $host_ip::$appport $registry:5000/$appname -APIKey=e5e1c4b8e46d563c3 sed -i "s/server xxx/server $(docker port $appname-1 $appport)/g" /etc/nginx/conf.d/api_upstream.conf nginx -s reload sleep 15s sed -i "s/server $(docker port $appname-2 $appport)/server xxx/g" /etc/nginx/conf.d/api_upstream.conf docker stop $appname-2 docker rm -f $appname-2 docker run -d --name $appname-2 -p $host_ip::$appport $registry:5000/$appname -APIKey=e5e1c4b8e46d563c350b7 sed -i "s/server xxx/server $(docker port $appname-2 $appport)/g" /etc/nginx/conf.d/api_upstream.conf nginx -s reload cat /etc/nginx/conf.d/api_upstream.conf
该应用程序将返回200秒,然后重新启动第二个容器时,我将收到500,502错误。 这是我的应用程序的conf文件。
server { listen 8087; server_name 192.168.49.4; location / { proxy_pass http://api_servers; proxy_next_upstream error timeout invalid_header http_500 http_502 http_504; proxy_connect_timeout 1; } }
我应该怎样做才能解决这个问题?
虽然502对应于后端timout,但500是服务器错误,表示configuration错误。 您可能希望首先解决以下问题:
在睡觉之前,你实际上用api_upstream.confreplace了第一行
sed -i "s/server xxx/server $(docker port $appname-1 $appport)/g" /etc/nginx/conf.d/api_upstream.conf
(你甚至做了两次…目的?双复制粘贴?)
但是那个时候你还没有做的是取代第二条线
server $(docker port ${appname}-2 ${appport}) max_fails=2 fail_timeout=1s;${nl}
我想$appname和$appport是空的,这使得subshell失败/为空,这意味着这一行实际上被解释为
server max_fails=2 fail_timeout=1s;
当使用默认的循环方式对请求进行负载均衡时,nginx可能会遇到问题…
你应该确保api_upstream.conf在使用api_upstream.conf总是包含有效的数据。 稍后可以在那里添加server ,但是让一个部分编写的占位符不会产生任何好处。
我自己也有同样的问题:容器启动时间只是不同图像的部署…因此,从容器重新启动容器并不总是一样快…可能是你必须在旋转另一个容器之前设置一些一致性检查…你甚至可能想从shell脚本中打开容器做一个健康检查,而不是等待一个任意的15秒…?