【问题标题】:nginx maintenance page for Docker based Rails app基于 Docker 的 Rails 应用程序的 nginx 维护页面
【发布时间】:2017-12-14 18:22:00
【问题描述】:

我觉得我的情况是先有鸡还是先有蛋:

我的 Rails 应用是基于 Docker 的,我有几个用于 nginx、Rails、Resque worker、Redis 和 MySQL 的图像。

我当前的部署实现是(简单地说):

docker-compose build
docker-compose down
... compile assets
... migrate
docker-compose up

效果很好,但当然,如果我在部署期间浏览到应用程序,我没有任何响应,这不是很好的用户体验。

我知道在站点处于维护模式时在 nginx 中设置一个“维护”页面,但是 nginx 映像是 docker-compose 规范的一部分,因此也会下降。

在一个 docker-compose 规范中包含所有图像确实使部署更容易 - 如果 any 图像(包括 nginx)发生任何变化,它将自动部署。尤其是因为 nginx、Rails、MySQL 等都在同一个网络中。

如果 nginx 是 docker-compose 规范的一部分,我如何在重新部署应用程序时继续提供维护页面?

(如果有什么不同,我在主机上使用 gitlab 和 gitlab-runner 容器从 repo 进行部署。)

谢谢

【问题讨论】:

  • 在您的示例中,nginx 服务是否因为包含 Rails 资产而被重新部署?如果您只是重建资产然后执行docker-compose up(没有down)是否仍会重新启动nginx 服务?
  • @AndyShinn - 实际上它不包含资产,它共享一个包含资产的卷。嗯好的,如果我不做docker-compose down,那么 nginx 就不会重新启动(我的网关不好,但这是可以预料的,因为应用程序容器已关闭)。好的,所以我将尝试围绕部署启用维护页面,而不是关闭所有容器......
  • @SteveFolly,我已经更新了我的答案。我还提供了一个完整的例子here

标签: ruby-on-rails nginx docker docker-compose continuous-deployment


【解决方案1】:

这是一个:

docker-compose 的 NGINX 维护页面示例

只需将 nginx 保存在同一个 docker-compose.yml 中的单独容器中并按以下方式部署:

docker-compose up -d --build --force-recreate your-app-service

添加一些逻辑,将维护页面放在 nginx 中。 compose 不会触及 nginx 服务。


使用类似的东西来启用维护站点:

你的nginx config

upstream backend {
    server app:80;

    server maintenance:80 backup; # <-- note the backup flag
}

server {
    location / {
        proxy_pass http://backend;
        proxy_connect_timeout 1s;
    }

}

然后在你的 docker-compose.yml 中:

version: "3"
services:
  app:
    (...)
  nginx:
    (...)
  maintenance:
    image: nginx
    volumes:
      - ./maintenance.html:/usr/share/nginx/html/index.hml
      - ./maintenance.conf:/etc/nginx/conf.d/default.conf

maintenance.conf

server {
    root /usr/share/nginx/html;
    server {
        listen 8080;

        location / {
            rewrite ^ /index.html break;
        }
    }
}

我在这里有一个完整的工作示例:https://github.com/xbx/docker-compose-nginx-maintenance-page-example

【讨论】:

  • 哦,我喜欢这个而不是“触摸文件以进入维护模式”,后者可能可能会不同步。这只是检查后端是否正在运行并相应地重定向。或者两者兼而有之——这会让我在后端仍在运行的情况下强制维护模式?
  • 这个逻辑有 1 秒的延迟,以便“意识到”后端是否正在运行。所以误报可能会持续 1 秒。
【解决方案2】:

替代工作流程:使用Docker swarm mode。这让您可以执行以下工作流程:

docker swarm init
docker swarm deploy -c mycomposefile.yml
docker-compose build
docker service update ...

这样您就不必关闭服务,群模式会为您更新它。

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 2023-03-12
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2011-08-24
    • 2014-01-21
    相关资源
    最近更新 更多