【问题标题】:How to make an nginx reverse-proxy load balance between two docker containers?如何在两个 docker 容器之间进行 nginx 反向代理负载平衡?
【发布时间】:2017-12-11 02:54:17
【问题描述】:

我尝试在具有相同 nodejs 应用程序的两个容器之间进行 nginx 反向代理负载平衡。

目录结构:

.
+-- docker-compose.yml
+-- nginx
+-- nodejs
|   +-- index.js
|   +-- …
+-- php

docker-compose.yml:

version: "3.1"

services:

  nginx-proxy:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - php:php-app
      - nodejs:nodejs-app

  nodejs:
    image: node:alpine
    environment: 
      NODE_ENV: production
    working_dir: /home/app
    restart: always
    volumes:
      - ./nodejs:/home/app
    command: ["node", "index.js"]

  php:
    image: php:apache
    volumes:
      - ./php:/var/www/html

index.js 监听端口8080

nginx 配置default.conf:

upstream nodejs-upstream {
  server nodejs-app:8080;
}

server {
  listen 80;
  root /srv/www;

  location / {
    try_files $uri @nodejs;  
  }

  location @nodejs {
    proxy_pass http://nodejs-upstream:8080;
    proxy_set_header Host $host;
  }

  location /api {
    proxy_pass http://php-app:80/api;
    proxy_set_header Host $host;
  }
}

现在我用

启动应用程序
docker-compose up  --scale nodejs=2

它是否负载平衡?

  • 我不这么认为,因为 nodejs 应用程序的两个实例侦听同一端口 8080

如何使 nginx 服务器在 nodejs 应用程序的两个实例之间实现负载平衡?

有没有更好的方法来做到这一点?


编辑 1

我仍然很想知道如何在没有 jwilder/nginx-proxy 的情况下做到这一点。谢谢


编辑 2

我有一些适合的东西:

default.conf:

upstream nodejs-upstream {
  server nodejs_1:8080;
  server nodejs_2:8080;
}

这在两个 nodejs 容器启动时有效。当我docker stop nodejs_2 时,该应用程序仍然可用(负载平衡似乎工作),但请求最终可能真的很慢(在 localhost 上最多 1 分钟)。如果我重新启动这个容器,它会再次正常工作......

【问题讨论】:

    标签: nginx docker docker-compose


    【解决方案1】:

    问。有没有更好的方法来做到这一点?

    是的,国际海事组织。使用 jwilder/nginx 方法。它会自动更新并发现任何新容器,并将其添加到其平衡池中。

    https://github.com/jwilder/nginx-proxy

    version: "3.1"
    
    services:
    
      nginx-proxy:
        image: jwilder/nginx
        ports:
          - "8000:80"
         volumes:
          - /var/run/docker.sock:/tmp/docker.sock:ro
    
      nodejs:
        image: node:alpine
        environment: 
          NODE_ENV: production
          VIRTUAL_ENV: localhost
          VIRTUAL_PORT: 8080
        working_dir: /home/app
        restart: always
        volumes:
          - ../nodejs:/home/app
        command: ["node", "index.js"]
    

    Nginx 会在缩放时自动更新。请注意应用服务中的 VIRTUAL_ENV 环境变量。该 var 将从 nginx 读取。而且您不需要任何进一步的配置。 (无 .conf 文件)

    【讨论】:

    • 不错的 nginx 插件,不知道,但已经喜欢它的易用性了 ;)
    • @Robert 使用这个插件,1. 如何提供静态文件,比如在我的 nginx 配置中:location / { try_files $uri @nodejs; }? 2. 如何在特定的 url 上服务容器,例如:location /api { proxy_pass http://php-app:80/api; proxy_set_header Host $host; }?
    • 它是完全可定制的。请参阅标题“Per-VIRTUAL_HOST”,此处为github.com/jwilder/nginx-proxy/blob/master/README.md
    • 将其与应用容器和 nginx 容器之间的共享命名卷结合
    • @Robert 非常感谢。我正在努力让它立即工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2022-06-22
    • 2019-05-30
    • 1970-01-01
    • 2022-01-03
    • 2021-05-04
    相关资源
    最近更新 更多