Docker 使用 Nginx 进行动态负载均衡
Docker dynamic load balancing with Nginx
我正在进行 Docker 的实习,我必须对具有客户端、服务器和数据库的应用程序进行负载平衡。我使用 Nginx 作为负载均衡器,我的目标是根据 CPU 的使用动态扩展服务器容器的数量。例如,如果 CPU 使用率超过 60%,我想在不重启 Nginx 的情况下动态添加一个新容器来划分 CPU 使用率。
我必须修改 nginx.conf 文件以添加新容器,但我必须重新启动 Nginx 容器才能应用更改,这非常慢。
所以我的问题是:是否有一种(免费的)动态方式来做到这一点?
如果您想了解更多信息,请告诉我,请原谅我糟糕的英语。
谢谢
编辑: 我按照@Konstantin Azizov 告诉我的那样做了:
docker cp ./new.conf $(docker ps -f "name=dockerizedrubis_nginx" -q ):/etc/nginx/nginx.conf
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c 'kill -HUP $(cat /run/nginx.pid)'
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c '/etc/init.d/nginx reload'
配置文件已粘贴到支持 Nginx 的容器中,我发送 HUP 信号重新配置 Nginx 进程,然后我重新加载以应用我的更改。没有错误,即时重新加载工作正常,但 Nginx 没有考虑我的新节点,请求仍然只定向到创建的第一个节点 ...
编辑 2 : 我找到了问题的根源。似乎为了在 'docker-compose scale' 之后更新容器的 /etc/hosts,需要停止、删除并重新启动该容器。就我而言,我真的不想停止支持 Nginx 的容器。
问题: 任何人都知道如何在重新缩放后更新 /etc/hosts 容器而无需重新启动容器(除了脏脚本) ?
谢谢。
不幸的是,没有简单(免费)的方法可以在不重启的情况下更改配置,实现零停机扩展的唯一方法是优雅重启,当你优雅地重启 Nginx 时,它会生成具有新配置的新实例,等待它启动然后用以前的配置杀死旧实例。
我使用了 Json Wilder 中的 nginx-proxy 镜像一段时间来在容器之间进行负载平衡,它适用于多个可扩展服务。它监视 docker 守护进程,如果发生事件,它会重建 nginx 配置文件,在您向外扩展时添加新的容器实例,或者在您向内扩展时删除它。
从 Docker 1.10(不确定这是否是正确的版本)开始,Docker 守护进程中嵌入了一个内部 DNS,所以从那时起我就使用它的循环功能。现在我使用官方 nginx 图像代理将请求传递到我定义为网络选项别名的域。由于我的英语不好,我不知道我是否清楚,但我相信我的 Github 示例可能会有所帮助。
我正在进行 Docker 的实习,我必须对具有客户端、服务器和数据库的应用程序进行负载平衡。我使用 Nginx 作为负载均衡器,我的目标是根据 CPU 的使用动态扩展服务器容器的数量。例如,如果 CPU 使用率超过 60%,我想在不重启 Nginx 的情况下动态添加一个新容器来划分 CPU 使用率。 我必须修改 nginx.conf 文件以添加新容器,但我必须重新启动 Nginx 容器才能应用更改,这非常慢。
所以我的问题是:是否有一种(免费的)动态方式来做到这一点?
如果您想了解更多信息,请告诉我,请原谅我糟糕的英语。 谢谢
编辑: 我按照@Konstantin Azizov 告诉我的那样做了:
docker cp ./new.conf $(docker ps -f "name=dockerizedrubis_nginx" -q ):/etc/nginx/nginx.conf
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c 'kill -HUP $(cat /run/nginx.pid)'
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c '/etc/init.d/nginx reload'
配置文件已粘贴到支持 Nginx 的容器中,我发送 HUP 信号重新配置 Nginx 进程,然后我重新加载以应用我的更改。没有错误,即时重新加载工作正常,但 Nginx 没有考虑我的新节点,请求仍然只定向到创建的第一个节点 ...
编辑 2 : 我找到了问题的根源。似乎为了在 'docker-compose scale' 之后更新容器的 /etc/hosts,需要停止、删除并重新启动该容器。就我而言,我真的不想停止支持 Nginx 的容器。
问题: 任何人都知道如何在重新缩放后更新 /etc/hosts 容器而无需重新启动容器(除了脏脚本) ?
谢谢。
不幸的是,没有简单(免费)的方法可以在不重启的情况下更改配置,实现零停机扩展的唯一方法是优雅重启,当你优雅地重启 Nginx 时,它会生成具有新配置的新实例,等待它启动然后用以前的配置杀死旧实例。
我使用了 Json Wilder 中的 nginx-proxy 镜像一段时间来在容器之间进行负载平衡,它适用于多个可扩展服务。它监视 docker 守护进程,如果发生事件,它会重建 nginx 配置文件,在您向外扩展时添加新的容器实例,或者在您向内扩展时删除它。
从 Docker 1.10(不确定这是否是正确的版本)开始,Docker 守护进程中嵌入了一个内部 DNS,所以从那时起我就使用它的循环功能。现在我使用官方 nginx 图像代理将请求传递到我定义为网络选项别名的域。由于我的英语不好,我不知道我是否清楚,但我相信我的 Github 示例可能会有所帮助。