如何在服务器上配置Elixir、NGINX和Websockets。

4

我正在设置一个带有Phoenix应用的服务器,该应用将使用Websockets。在本地Websocket工作,但是我在我的测试服务器上设置时遇到了一些问题。有人能帮助我在服务器上设置Websockets吗?我的nginx配置如下:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream my_app {
  server 0.0.0.0:6443;
}

server {
  listen 80;
  listen 443;
  server_name example.com;
  ssl on;
  ssl_certificate /path/to/wildcard.crt;
  ssl_certificate_key /path/to/wildcard.key;
  ssl_prefer_server_ciphers on;

  if ($request_uri ~ "^[^?]*//") {
    rewrite "(.*)" $scheme://$host$1 permanent;
  }
  if ( $scheme = http ){
    rewrite ^ https://$host$request_uri permanent;
  }

  location / {
    allow all;

    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Cluster-Client-Ip $remote_addr;

    # WebSockets
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass https://my_app;
  }
}

我的phoenix配置如下:
use Mix.Config

config :my_app_core, MyAppCoreWeb.Endpoint,
  load_from_system_env: false,
  url: [host: "https://example.com", port: {:system, "PORT"}],
  http: [port: {:system, "PORT"}],
  https: [otp_app: :my_app_core, port: 6443, keyfile: "/path/to/wildcard.key", certfile: "/path/to/wildcard.crt"],
  server: true,
  root: ".",
  watchers: [],
  version: Mix.Project.config[:version],
  check_origin: false

config :logger, :console, format: "[$level] $message\n"

config :phoenix, :stacktrace_depth, 2

config :phoenix, :serve_endpoints, true

import_config "workspace.secret.exs"

我正在测试与http://phxsockets.io/的连接,但是我遇到了问题。
failed: Error during WebSocket handshake: Unexpected response code: 400

有人能帮忙吗?

这段内容与IT技术无关。

我期望 proxy_pass https://my_app; 必须指向本地某处,由于您正在处理nginx级别上的ssl,因此我不认为代理应用程序使用https有任何意义。尝试使用常规的http - Kevin Johnson
我尝试将 proxy_pass https://my_app; 更改为 proxy_pass http://my_app;,但没有任何变化。在 Phoenix 配置文件中,我设置了 httphttps,应该足以使用 WebSockets (wswss)。至于本地主机,我通过将 upstream my_app { server 0.0.0.0:6443;} 更改为 upstream my_app { server 0.0.0.0:4020;}(我的 HTTP 端口)或同时使用 upstream my_app { server 0.0.0.0:6443; server 0.0.0.0:4020} 进行了测试。这也导致了相同的问题。 - kabebop
我认为你还需要在proxy_pass中指定websocket端口,否则它将会侦听80或443端口。你可以尝试使用 proxy_pass http://my_app:4020 - Kevin Johnson
仍然是同样的问题:(我已经按照你说的添加了端口,我尝试过proxy_pass http://0.0.0.0:4020,但这也没有起作用。我认为无论你在proxy_pass中设置还是定义upstream my_app { server 0.0.0.0:4020 }都没有关系。 - kabebop
好的,这个配置已经生效了。问题在于更新了错误的nginx配置文件:P - kabebop
1个回答

2
上述配置是可行的。我这边的问题在于使用了错误的nginx配置文件,里面有旧的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接