Nginx负载均衡器 - Docker组合

6

我有一个简单的Flask应用程序在容器内运行在端口5000,我正在尝试添加Nginx负载均衡来扩展该应用程序(3个实例)。

这是我的docker-compose文件:

version: "3.7"

services: 
    chat-server:
        image: chat-server
        build: 
            context: .
            dockerfile: Dockerfile
        volumes: 
            - './chat_history:/src/app/chat_history'
        networks: 
            - "chat_net"

    ngnix-server:
        image: nginx:1.13
        ports: 
            - "8080:80"
        volumes: 
            - './ngnix.conf:/etc/ngnix/nginx.conf'
        networks: 
            - "chat_net"
        depends_on: 
            - chat-server

networks: 
    chat_net:

以下是我的nginx.conf文件内容:

events { worker_connections 1024;}

http {
    upstream app {
        server chat-server_1:5000;
        server chat-server_2:5000;
        server chat-server_3:5000;

    }
}

server {
    listen 80;
    location / {
        proxy_pass http://app;
    }
}

这两个服务都在同一个 chat_net 网络上,但是当我在浏览器中输入 localhost:8080 时,我得到的是 nginx 的默认页面,为什么会这样呢?我漏掉了什么吗?


谁/如何解决chat-server_1?我猜只是chat-server:5000 - Federkun
我猜它们在单台机器上运行,那么这三个聊天服务器如何在同一端口5000上监听? - Rocherlee
2个回答

12

您在nginx.conf文件中有一个拼写错误,未正确挂载。

在卷部分的几个地方拼写为ngnix,因此容器使用默认配置(因此默认主页)。

一旦您修复了这个问题,您可能会遇到@Federkun提到的错误(nginx将无法解析您代理的3个域名)。

您也将server指令放错了位置(它需要在http节内)。

这应该是您的文件的修改版本:

events { worker_connections 1024;}

http {
    upstream app {
        server chat-server:5000;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://app;
        }
    }
}

注意,这比需要让nginx了解复制品数量要好。您可以使用--scale chat-server=N运行docker-compose up,并通过使用不同的N重新运行相同的命令来调整大小,而无需停机。


2
我可以只使用proxy_pass http://chat-server:5000;而不需要将应用程序明确定义为上游服务器吗? - jrbe228
@Jedi 为什么让docker compose来做负载均衡比依赖nginx更好?使用nginx作为负载均衡器,你可以采用更好的策略,例如least_conn,而不是docker提供的轮询。 - Damien Plumettaz
使用docker-compose时,我通常是在原型设计阶段,不需要智能路由(宁愿水平扩展)。即使在由于保持连接而导致连接计数失衡的聊天服务器中也是如此。 - Jedi
如果您需要特定的nginx功能,您可能需要重新考虑如何部署服务的副本(您可能无法原生地使用docker-compose副本,并且需要进行一些智能引导)。我的答案更适用于常见情况,人们肯定可以选择自己编写。 - Jedi
1
一旦您静态地启动了N个副本并更新了配置,当您需要缩放服务时,您现在会有停机时间,因为您需要使用更新的配置重新启动nginx。更喜欢养牛而不是宠物。 - Jedi

0

@Jedi 不应该至少在下面吗?

events { worker_connections 1024;}

http {
    upstream app {
        least_conn;
        server chat-server_1:5000;
        server chat-server_2:5000;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://app;
        }
    }
}


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - helvete
1
chat-server_1chat-server_2不是nginx容器知道的名称。 - Jedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接