Настройте обратный прокси-сервер NGINX с помощью браузера WebSocket и docker-compose. - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь заставить nginx прокси-соединение через веб-сокет с внутренним сервером.Все сервисы связаны через docker-compose.

Когда я создаю объект WebSocket в моем приложении реакции внешнего интерфейса:

let socket = new WebSocket(`ws://engine/socket`)

Я получаю следующую ошибку:

WebSocket connection to 'ws://engine/socket' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED

Я полагаю, что проблема заключается в преобразовании ws:// в http:// и что моя конфигурация nginx, похоже, неправильно определяет местоположение совпадения.

Вот моя конфигурация nginx:

server {
    # listen on port 80
    listen 80;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    location ^~ /engine {
      proxy_pass http://matching-engine:8081/;
      proxy_http_version 1.1;
      proxy_redirect     off;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }

    # Media: images, icons, video, audio, HTC
    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
      expires 1M;
      access_log off;
      add_header Cache-Control "public";
    }

    # Javascript and CSS files
    location ~* \.(?:css|js)$ {
        try_files $uri =404;
        expires 1y;
        access_log off;
        add_header Cache-Control "public";
    }

    # Any route containing a file extension (e.g. /devicesfile.js)
    location ~ ^.+\..+$ {
        try_files $uri =404;
    }
}

Вот часть моей конфигурации docker-compose:

  matching-engine:
    image: amp-engine
    ports:
      - "8081:8081"
    depends_on:
      - mongodb
      - rabbitmq
      - redis
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s

  client:
    image: amp-client:latest
    container_name: "client"
    ports:
      - "80:80"
    depends_on:
      - matching-engine
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s

docker-compose разрешает 'механизм поиска'автоматически (я могу делать обычные запросы http get / post, которые nginx разрешает правильно, и nslookup правильно находит механизм соответствия, поэтому я считаю, что базовая сеть работает правильно для запросов HTTP, что заставляет меня думать, что проблема связана с расположением совпаденияв конфигурации nginx.

Как можно получить запрос, исходящий из `new WebSocket ('ws: // engine / socket') в директиве location. Я пробовал следующие:

  • location ^~ engine
  • location /engine
  • location /engine/socket
  • location ws://engine

без какого-либо успеха.

Я также пытался изменить new Websocket('ws://engine/socket') на new Websocket('/engine/socket'), но это не удалось (только ws: // или wss: // префиксы принимаются)

Как заставить эту конфигурацию работать?

1 Ответ

0 голосов
/ 16 января 2019

Поскольку вы уже выставляете порт 80 вашего клиентского контейнера вашему хосту через docker-compose, вы можете просто подключиться к вашему websocket-прокси через localhost:

new Websocket('ws://localhost:80/engine')
...