martinlev

martinlev

Getting Bad request 400 with reverse proxy NGINX with web socket channels

Hi guys,

I am playing around with phoenix 1.4 channels, everything works well in local (of course), but I am unable to make channels work when deployed online (http://eerf.fr.openode.io/ the web socket connection always get 400 status code) with reverse proxies.

I have an NGINX → docker container setup and my NGINX server have the proper upgrade settings for web sockets:

 upstream backendeerfhttp {
    server 127.0.0.1:64193;
  }

  server {
      listen       80;
      server_name  eerf.fr.openode.io;

      location / {
          proxy_pass http://backendeerfhttp;
          proxy_set_header Upgrade $http_upgrade; 
          proxy_set_header Connection "Upgrade";
          proxy_set_header        X-Forwarded-For   $remote_addr;
          proxy_set_header        X-Real-IP         $remote_addr;
          proxy_set_header        Host              $host;
          proxy_set_header Access-Control-Allow-Origin *;
          proxy_read_timeout 900;
      }
  }

I have another simple test web socket (in Node.js) to make sure NGINX is set up properly for web socket here and it works if you check the networks connection (chrome) - http://wssimpletest.fr.openode.io/.

I have the following endpoint config in prod.exs

config :eerf, EerfWeb.Endpoint,
  http: [:inet6, port: System.get_env("PORT") || 4000],
  check_origin: ["//localhost", "//eerf.fr.openode.io"],
  url: [host: "eerf.fr.openode.io", port: 80]#,

From js I connect via let socket = new Socket(“/socket”, {params: {token: window.userToken}})
and in networks connection I can see it tries to connect correctly to ws://eerf.fr.openode.io/socket/websocket?token=undefined&vsn=2.0.0

The server logs show the following

20:45:43.091 [info] CONNECT EerfWeb.UserSocket
  Transport: :websocket
  Connect Info: %{}
  Parameters: %{"token" => "undefined", "vsn" => "2.0.0"}
20:45:43.091 [info] Replied EerfWeb.UserSocket :ok

But strangely NGINX always returns 400 bad requests. The code is available over here GitHub - martinlevesque/eerf · GitHub

Any idea what could the issue or any idea to better debug?

Thanks

Most Liked

martinlev

martinlev

Just found out that the exact missing setting was to force http 1.1 (i’m just testing without ssl for now): “proxy_http_version 1.1”.

as in:

location / {
          proxy_http_version 1.1; # <------------------------------
          proxy_pass http://localhost:some-port-here;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "Upgrade";
          proxy_set_header        X-Forwarded-For   $remote_addr;
          proxy_set_header        X-Real-IP         $remote_addr;
          proxy_set_header        Host              $host;
          proxy_set_header Access-Control-Allow-Origin *;
          proxy_read_timeout 900;
      }

Where Next?

Popular in Questions Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: &lt;h1&gt;Create Post&lt;/h1&gt; &lt;%= ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New

Other popular topics Top

skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30877 112
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 126479 1222
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement