nginx + websocket proxy + Ratchet in docker

1.2k Views Asked by At

We have symfony app's who use Ratchet php for websocket. This app is an docker container. On the server we use nginx with proxy to serve docker app. It works for http request in 443. But with websocket we have error : failed: Error during WebSocket handshake: Unexpected response code: 502.

Do you have an idea ?

Thank's.

Our nginx config :

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

There are 1 best solutions below

0
On

I found the problem, it was my ratchet configuration. I replaced by

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

by

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