Docker nginx 502 плохой шлюз для запросов GET / Post, но не для веб-сокета - PullRequest
1 голос
/ 31 мая 2019

Были и другие подобные случаи в стеке, но все они в основном ссылаются на неверные порты или используют localhost в качестве IP-адреса вместо ip док-машины.

Приложение vue.js прекрасно подключается к веб-сокету и работает. Однако GET-запросы к 192.168.99.100:8080/meows и другим конечным точкам достигают nginx 502 bad gateway. Ручной доступ к конечным точкам (вместо vue.js) также вызывает 502 bad gateway.

IP-адреса установлены правильно. Порты везде одинаковые :8080. конечные точки имеют правильный http verb, и все имеют nginx upstream, указывающий на server location /..{}. Пока нет проблем с подключением к сети, все данные проходят без проблем.

РЕДАКТИРОВАТЬ: я запускаю windows 7 с docker-toolbox, потому что моя версия для Windows не имеет всей виртуализации. Дальнейшая настройка после установки не производится.

Архитектура следующая:

enter image description here

докер-Compose

version: "3.6"

services:
  meow:
    build: "."
    command: "meow-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
  query:
    build: "."
    command: "query-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
      ELASTICSEARCH_ADDRESS: "elasticsearch:9200"
  pusher:
    build: "."
    command: "pusher-service"
    depends_on:
      - "nats"
    environment:
      NATS_ADDRESS: "nats:4222"
  postgres:
    build: "./postgres"
    restart: "always"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
  nats:
    image: "nats-streaming:0.9.2"
    restart: "always"
  elasticsearch:
    image: 'docker.elastic.co/elasticsearch/elasticsearch:6.2.3'
  nginx:
    build: "./nginx"
    ports:
      - "8080:80"
    depends_on:
      - "meow"
      - "query"
      - "pusher"

nginx.conf:

user nginx;
worker_processes 1;

events {
  worker_connections 1024;
}

http {
  upstream meows_POST {
    server meow:8080;
  }

  upstream meows_GET {
    server query:8080;
  }

  upstream search_GET {
    server query:8080;
  }

  upstream pusher {
    server pusher:8080;
  }

  server {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    add_header Access-Control-Allow-Origin *;

    location /meows {
      limit_except GET POST OPTIONS {
        deny all;
      }
      proxy_pass http://meows_$request_method;
    }

    location /search {
      limit_except GET OPTIONS {
        deny all;
      }
      proxy_pass http://search_GET;
    }

    location /pusher {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_pass http://pusher;
    }
  }
}

И чтобы показать, что приложение go также использует правильные порты, следующий порт прослушивает

func newRouter() (router *mux.Router) {
    router = mux.NewRouter()
    router.HandleFunc("/meows", listMeowsHandler).
        Methods("GET")
    router.HandleFunc("/search", searchMeowsHandler).
        Methods("GET")
    return
}

router := newRouter()
if err := http.ListenAndServe(":8080", router); err != nil {
    log.Fatal(err)
}

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вместо:

ports:
  - "8080"

в каждом сервисе docker-compose, попробуйте:

ports:
  // I assume your containers operate on 8080 port
  - "8080:8080"

Указав просто 8080, вы назначаете порт контейнера 8080 случайному порту вашего хоста. Я верю, что ты не хочешь этого. Вы можете проверить это с помощью docker-compose ps.

Кроме того, почему вы везде меняете порт по умолчанию на 8080? В Docker это не обязательно, вы можете просто назначить порт другому порту на стороне хоста, например:

ports:
    - "8080:80"

Помните, что контейнеры общаются друг с другом, используя свои порты, и эти порты не нужно публиковать. Вы публикуете только те порты, к которым хотите получить доступ "из внешнего мира".

0 голосов
/ 31 мая 2019

Удалено все

  ports:
  - "8080"

свойства от всех услуг в ngix.conf, как было предложено.

Основная проблема, однако, заключалась в изображении стыковщика эластичного поиска. При использовании docker ps -a я мог видеть, что через минуту он завершится 78. При использовании docker-compose logs elasticsearch ошибка была max virtual memory areas vm.max_map_count px[ is too low, increase to at least [x]. Используя команду ниже, хост-машина выделила больше памяти для контейнеров, и все было решено.

docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
...