AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 868814
Accepted
sgohl
sgohl
Asked: 2017-08-16 11:57:18 +0800 CST2017-08-16 11:57:18 +0800 CST 2017-08-16 11:57:18 +0800 CST

docker swarm 服务前的 nginx

  • 772

我正在考虑如何以严肃的方式完成这几个星期,但还没有得出结论。也许我想错了方向。

假设您有一百个来来去去的网络应用程序。你想要一个像 gitlab 例子那样的 nginx 配置:

location / {
  proxy_pass http://gitlab;
}

由于 gitlab 是用 创建的docker service create,nginx 将能够通过它在你的入口网络中的 swarm-vip 假 dns 名称来解析 gitlab。

但是:仅当服务容器正在运行时。否则,nginx 将无法启动,因为 [emerg] 1#1: host not found in upstream "gitlab"

现在,当您必须运行高可用性 nginx 并且确保 proxy_pass 的应用程序正在运行时,这是一个难题。

每次更新 nginx 服务时,如果其他 100 个其他 swarm 服务中只有一个在同一秒内没有运行,它就不会出现.. wtf?

如果这不起作用,为什么我们需要在 swarm 中进行名称解析?你怎么解决这个问题?

我考虑了 nginx 虚拟主机模板的 consul 和动态生成(甚至不要考虑 docker-nginx-proxy!),但是应用程序非常不同,您可以说每个应用程序都有自己的单独配置。而所有这些工作都不是出于特殊原因,只是为了解决 nginx 的解决问题?

nginx
  • 1 1 个回答
  • 2075 Views

1 个回答

  • Voted
  1. Best Answer
    BMitch
    2017-08-20T16:25:08+08:002017-08-20T16:25:08+08:00

    我建议将静态定义的 nginx 反向代理换成 traefik,它可以感知集群,并且可以在部署和销毁服务时动态重新配置自身。

    这是一个示例实现:

    1. 为 traefik 创建一个与容器通信的网络:docker network create proxy

    2. 制作一个 traefik.toml,这是一个例子:

    traefik.toml

    accessLogsFile = "/proc/1/fd/1"
    defaultEntryPoints = ["http"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
    [web]
    address = ":8080"
    [docker]
    endpoint = "unix:///var/run/docker.sock"
    domain = "localhost"
    watch = true
    swarmmode = true
    constraints = ["tag==frontend"]
    
    1. traefik 的示例撰写文件:

    docker-compose.traefik.yml

    version: '3'
    
    networks:
      proxy:
        external:
          name: proxy
    
    services:
      traefik:
        image: traefik:latest
        volumes:
        - ./traefik.toml:/etc/traefik/traefik.toml:ro
        - /var/run/docker.sock:/var/run/docker.sock
        ports:
        - 80:80
        - 8080:8080
        networks:
        - proxy
        restart: unless-stopped
    
    1. 使用标签和在同一网络上配置您的应用。

    docker-compose.app.yml

    version: '3'
    
    networks:
      proxy:
        external: true
    
    services:
      webtest:
        image: nginx:latest
        networks:
        - default
        - proxy
        labels:
        - traefik.frontend.rule=PathPrefixStrip:/webtest
        - traefik.port=80
        - traefik.docker.network=proxy
        - traefik.tags=frontend
        restart: unless-stopped
    

    为简单起见,上述规则使用容器的路径前缀,但您可以使用您喜欢的任何规则来代理您的应用程序。

    • 5

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve