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

如何在两个docker容器之间实现nginx反向代理负载平衡?,nginx,docker,docker-compose,Nginx,Docker,Docker Compose,我尝试在使用相同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" vo

我尝试在使用相同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 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;
  }
}
upstream nodejs-upstream {
  server nodejs_1:8080;
  server nodejs_2:8080;
}
现在我用

docker-compose up  --scale nodejs=2
它有负载平衡吗

  • 我不这么认为,因为nodejs应用程序的两个实例在同一个端口上侦听
    8080
如何在nodejs应用程序的两个实例之间实现nginx服务器负载平衡?

有更好的方法吗


编辑1

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


编辑2

我有一些与之相关的东西:

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;
  }
}
upstream nodejs-upstream {
  server nodejs_1:8080;
  server nodejs_2:8080;
}
这在两个nodejs容器启动时起作用。当I
docker stop nodejs_2
时,应用程序仍然可用(负载平衡似乎可以工作),但请求结束时可能非常慢(在本地主机上最多1分钟)。如果我重新启动这个容器,它会再次正常工作

有没有更好的办法

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


Nginx将在缩放时自动更新。注意应用服务中的虚拟\uEnv ENV var。该变量将从nginx读取。您不需要任何进一步的配置。(None.conf文件)

Nice nginx插件,不知道,但已经喜欢它的易用性;)@罗伯特与这个插件,1。如何为静态文件提供服务,比如在我的nginx配置中使用:
location/{try_files$uri@nodejs;}
?2.如何在特定url上提供容器,如:
location/api{proxy\u passhttp://php-app:80/api;proxy_set_header Host$Host;}
?完全可自定义。请参阅标题“Per-VIRTUAL_主机”,这里将其与应用程序容器和nginx之间的共享命名卷结合起来container@Robert非常感谢你。我现在正努力让它工作。