nginx прокси-сервер websocket храповик в docker

#nginx #websocket #ratchet #bad-gateway

#nginx #websocket #храповик #плохой шлюз

Вопрос:

У нас есть приложения symfony, которые используют Ratchet php для websocket. Это приложение представляет собой контейнер docker. На сервере мы используем nginx с прокси для обслуживания приложения docker. Он работает для http-запроса в 443. Но с websocket у нас ошибка : failed: Error during WebSocket handshake: Unexpected response code: 502 .

У вас есть идея?

Спасибо.

Наша конфигурация nginx :

 map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
 
upstream websocket {
   server 127.0.0.1:8081;
}

server {
    server_name my-domain.fr;

    location /ws {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
    
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
        proxy_redirect off;
    }

    location / 
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_buffer_size          128k;
        proxy_buffers              4 256k;
        proxy_busy_buffers_size    256k;
        proxy_pass http://127.0.0.1:8080;
    }   

    listen [::]:443 ssl ipv6only=on http2; # managed by Certbot
    listen 443 ssl http2;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/my-domain.fr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.fr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = my-domain.fr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name my-domain.fr;
    return 404; # managed by Certbot
}

 

Ответ №1:

Я нашел проблему, это была моя конфигурация храповика. Я заменил на

  $server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new Chat($this->containerInterface, $this->entityManager)
                )
            ),
            $this->params->get('chat.ws_port'),
            '127.0.0.1'
        );
 

Автор:

  $server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new Chat($this->containerInterface, $this->entityManager)
                )
            ),
            $this->params->get('chat.ws_port'),
            '0.0.0.0'
        );