【问题标题】:2 apps with different port in single docker-compose and nginx reverse proxy单个 docker-compose 和 nginx 反向代理中具有不同端口的 2 个应用程序
【发布时间】:2017-11-07 05:20:11
【问题描述】:

我的本​​地主机中有一个以 app.dev 域运行的应用程序。但是,我希望有其他应用程序使用不同的端口运行。而不是端口 80,它将是 2000,域 app.dev:2000 在 app2/ 我可以知道我应该对我的 docker-compose 和 nginx 进行哪些更改吗?谢谢

这是我的 docker-compose

version: "2"

volumes: 
  mongostorage:

services:
  app:
    build: ./app
    ports:
      - "3000"
    links:
      - mongo
      - redis
    command: node ./bin/www
  app2:
    build: ./app2
    ports:
      - "2000"
    links:
      - mongo
      - redis
    command: node app.js
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    links:
      - app:app
  mongo:
    image: mongo:latest
    environment:
      - MONGO_DATA_DIR=/data/db
    volumes:
      - mongostorage:/data/db
    ports:
      - "27017:27017"
  redis:
    image: redis
    volumes:
      - ./data/redis/db:/data/db
    ports:
      - "6379:6379"

这是我的 ngnix.conf

events {
  worker_connections  1024;
}

http{
    upstream app.dev{
        least_conn;
        server app:3000 weight=10 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name app.dev;

        location / {
            proxy_pass http://app.dev;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

【问题讨论】:

标签: docker nginx docker-compose


【解决方案1】:

我觉得只要按照下面的方式改变app2的端口就足够了,因为nginx只监听80端口。

app2:
  build: ./app2
  ports:
    - "2000:2000"
  links:
    - mongo
    - redis
  command: node app.js

【讨论】:

    【解决方案2】:

    最简单的方法是将app2暴露在2000端口

      app2:
        build: ./app2
        ports:
          - '2000:2000'
    

    另一种是通过nginx路由连接,与第一个app保持一致。

    作曲

      nginx:
        build: ./nginx
        ports:
          - '80:80'
          - '2000:2000' 
    

    Nginx

    http{
        upstream app.dev{
            least_conn;
            server app:3000 weight=10 max_fails=3 fail_timeout=30s;
        }
        upstream app2.dev{
            least_conn;
            server app2:2000 weight=10 max_fails=3 fail_timeout=30s;
        }
    
        server {
            listen 80;
            server_name app.dev;
    
            location / {
                proxy_pass http://app.dev;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
            }
        }
        server {
            listen 2000;
            server_name app.dev;
    
            location / {
                proxy_pass http://app2.dev/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
            }
        }
    }
    

    顺便说一句,您不需要任何 links 在版本 2+ 撰写文件中。您已经可以通过服务名称访问所有服务。

    【讨论】:

    • 嗨@matt 我收到了这个错误:[error] 5#5: *15 connect() failed (111: Connection refused) while connection to upstream, client: 172.21.0.1, server: app .dev,请求:“GET /favicon.ico HTTP/1.1”,上游:“172.21.0.5:1123/favicon.ico”,主机:“app.dev:1123”,引用者:“app.dev:1123”
    • 1123端口是什么?
    • 抱歉,现在是 2000 年。现在可以使用了。但是,我该怎么做才能使文件的更改反映在主机上? Npm install 已运行,但主机上的 node_modules 为空。谢谢
    • 不确定,您可能需要在新问题中详细说明该问题
    • 嗨@matt 我对此提出了一个新问题:stackoverflow.com/questions/47173020/…
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多