如何在两个docker容器之间进行nginx反向代理负载平衡?

Fra*_*ain 4 nginx docker docker-compose

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

目录结构:

.
+-- docker-compose.yml
+-- nginx
+-- nodejs
|   +-- index.js
|   +-- …
+-- php
Run Code Online (Sandbox Code Playgroud)

泊坞窗,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
Run Code Online (Sandbox Code Playgroud)

index.js 在港口听 8080

nginx conf 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我启动应用程序

docker-compose up  --scale nodejs=2
Run Code Online (Sandbox Code Playgroud)

负载平衡吗?

  • 我不这么认为,因为nodejs app的两个实例在同一端口上侦听8080.

如何在nodejs app的两个实例之间进行nginx服务器负载均衡?

有一个更好的方法吗?


编辑1

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


编辑2

我有一些适用的东西:

default.conf:

upstream nodejs-upstream {
  server nodejs_1:8080;
  server nodejs_2:8080;
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ert 5

问:有更好的方法吗?

是的,国际海事组织.使用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"]
Run Code Online (Sandbox Code Playgroud)

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