Websocket на Docker с nginx - PullRequest
       8

Websocket на Docker с nginx

0 голосов
/ 12 февраля 2020

Я пытаюсь построить сервис из двух частей: бэкэнда и внешнего интерфейса. Оба находятся в другом контейнере docker и обмениваются данными через docker -композитную конфигурацию и контейнер nginx.

Для доступа через https все хорошо, но когда я пытаюсь работать с websocket, У меня ошибка обновления, даже если конфигурация Nginx получила эту информацию

Сообщение об ошибке: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header

Я использую fasthttp и fasthttp/websocket для моего Golang бэкенд. Код работает на локальном хосте (без nginx конфигурации), но сочетание Docker + nginx, похоже, что-то ломает. Внешний интерфейс работает с react и представляет собой простой let socket = new WebSocket( wss.mydomain.com / ws / uploadPicture / );

РЕДАКТИРОВАТЬ:

  • при использовании ctx.Request.Header.ConnectionUpgrade() незадолго до upgrader.Upgrade результат равен true, но ctx.Response.Header.ConnectionUpgrade() ложно

Спасибо!


Golang Backend

var upgrader = websocket.FastHTTPUpgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(ctx *fasthttp.RequestCtx) bool {
        return true
    },
}
func    InitRouter() func(*fasthttp.RequestCtx) {
    router := fasthttprouter.New()

    router.GET("/ws/uploadPicture/", doWS)

    return router.Handler
}
func    doWS(ctx *fasthttp.RequestCtx) {
    err := upgrader.Upgrade(ctx, func(conn *websocket.Conn) {
        //SHOULD DO STUFF
    })
    if (err != nil) {
        logs.Error(err.Error()) //HIT THIS ERROR
        return
    }
}

...
fasthttp.ListenAndServe(`:8000`, InitRouter())

Nginx .conf

#############################################################################
## NGINX CONFIGURATION FOR THE WEBAPP
#############################################################################
upstream webapp {
    server webapp:3000;
    keepalive 4;
}
server {
    listen [::]:443 ssl;
    listen 443 ssl;

    server_name mydomain.com;

    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://webapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

#############################################################################
## NGINX CONFIGURATION FOR THE PROXY
#############################################################################
upstream proxy {
    server proxy:8000;
    keepalive 4;
}
server {
    listen [::]:443 ssl;
    listen 443 ssl;

    server_name api.mydomain.com;

    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
        add_header 'Access-Control-Allow-Credentials' true;
        proxy_pass http://proxy;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}


#############################################################################
## NGINX CONFIGURATION FOR THE PROXY
#############################################################################
upstream proxyws {
    server proxy:8000;
    keepalive 4;
}
server {
    listen [::]:443 ssl;
    listen 443 ssl;

    server_name wss.mydomain.com;

    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        proxy_pass http://proxyws;
    }

}

Docker -композит

  #############################################################################
  ## IMAGE FOR THE PROXY
  #############################################################################
  proxy:
    container_name: proxy
    build: ./src/Proxy
    restart: always
    env_file: .env
    ports:
      - "8000:8000"

  #############################################################################
  ## IMAGE FOR THE WEBAPP
  #############################################################################
  webapp:
    container_name: webapp
    build: ./src/Webapp
    restart: always
    volumes:
      - ./src/Webapp:/home/app
      - /home/app/.next
      - /home/app/node_modules
    ports:
      - 3000:3000

  #############################################################################
  ## IMAGE THE NGINX & CERTBOT FOR REVERSE PROXY
  #############################################################################
  nginx: 
    image: nginx:latest
    container_name: nginx
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
      - 80:80
      - 443:443

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Оказывается, это не проблема с Nginx / Docker, а с пакетом http в golang, который должен обновить соединение. Я использовал fasthttp с fasthttp / websocket , который должен работать, но который не работает в docker контейнере.

Я пытался перейти на httprouter с официальным (не форком, как у fasthttp) gorilla / websocket и соединение успешно обновлено.

Собираюсь проверить, откуда возникла проблема!

1 голос
/ 17 февраля 2020

Я поддерживаю пакет websocket для fasthttp. Проблема исправлена ​​в основной ветке.

Загрузите его с помощью:

go get github.com/fasthttp/websocket@master

и повторите попытку, пожалуйста.

Если проблема не устранена, откройте ее в https://github.com/fasthttp/websocket/issues

Скоро я выпущу новую версию.

0 голосов
/ 13 февраля 2020

Я считаю, upgrade должно быть строкой:

proxy_set_header Connection "upgrade";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...