ruby-on-rails - 基于 Docker 的 Rails 应用程序的 nginx 维护页面

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

我想我有一个鸡和蛋的情况:

我的 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 规范中确实使部署更容易——如果任何图像(包括 nginx)发生任何变化,都会自动部署。尤其是因为 nginx、Rails、MySQL 等都在同一个网络中。

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

(如果它有所作为,我将在主机上使用 gitlab 和 gitlab-runner 容器从 repo 进行部署。)

谢谢

最佳答案

这是一个:

docker-compose 的 NGINX 维护页面示例

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

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

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

使用这样的东西来启用维护站点:

您的 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

维护配置文件
server {
    root /usr/share/nginx/html;
    server {
        listen 8080;

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

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

关于ruby-on-rails - 基于 Docker 的 Rails 应用程序的 nginx 维护页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021826/

相关文章:

mysql - 错误启动mysql docker

ruby-on-rails - Sunspot Solr 不使用简单范围

ruby-on-rails - Rails 处理多重关系的正确方法

python - Django、Gunicorn 和设置目录

php - AWS ECS Docker-nginx : [emerg] host not found in upstream

docker - 无法从 docker hub 拉取公共(public) MongoDB 镜像

ruby-on-rails - 使用凭据创建一个新用户,然后在 API 中使用 Doorkeeper 为该用户获取 token

ruby-on-rails - 如何让 Rails 将发布的字符串解析为 json 而不发送 'Content-type: application/json' header ?

ruby-on-rails - 卸载Passenger安装的nginx

n 秒内的 Docker 统计信息