如何在 Nginx 后面使用 Phoenix 设置 Websockets



我正在尝试设置Web套接字以通过Nginx进入Phoenix应用程序,但不断收到403错误。任何人都可以建议正确的配置以使这项工作在生产中工作 - 开发环境很好。

我的 Nginx conf:

upstream phoenix {
  server 127.0.0.1:4000 max_fails=5 fail_timeout=60s;
}
server {
  server_name <app-domain>;
  listen 80;
  location / {
    allow all;
    # Proxy Headers
    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;
    # The Important Websocket Bits!
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://phoenix;
  }
}

我的产品:

use Mix.Config
config :logger, level: :info
config :phoenix, :serve_endpoints, true
config :app, App.Endpoint,
  http: [port: 4000],
  url: [host: "127.0.0.1", port: 4000],
  root: '.',
  cache_static_manifest: "priv/static/manifest.json",
  server: true
config :app, App.Repo,
  username: System.get_env("MONGO_USERNAME"),
  password: System.get_env("MONGO_PASSWORD"),
  database: "template",
  hostname: "localhost",
  pool_size: 10

如有必要,我可以根据需要提供任何其他信息。

该应用程序

可以通过域名很好地访问,最后一个也是唯一剩下的问题是让 Web 套接字工作。

非常感谢任何能为我指明正确方向的人。

我遵循了凤凰城网站的指南。Exrm 发布 - 凤凰城

你的nginx.config缺少这个:

# The following map statement is required
# if you plan to support channels. See https://www.nginx.com/blog/websocket-nginx/
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
将版本

发送到我的服务器后,在本地机器中生成版本时,我也遇到了一些错误。

因此,我建议您在服务器环境中生成版本。

编辑:

浏览器控制台中的错误:

ws://phoenix.hollyer.me.uk/socket/websocket?token=&vsn=1.0.0' failed: Error during WebSocket handshake: Unexpected response code: 403

这可能是这个错误。您应该尝试在服务器中启动控制台:

[error] Could not check origin for Phoenix.Socket transport.
This happens when you are attempting a socket connection to
a different host than the one configured in your config/
files. For example, in development the host is configured
to "localhost" but you may be trying to access it from
"127.0.0.1". To fix this issue, you may either:
  1. update [url: [host: ...]] to your actual host in the
     config file for your current environment (recommended)
  2. pass the :check_origin option when configuring your
     endpoint or when configuring the transport in your
     UserSocket module, explicitly outlining which origins
     are allowed:
        check_origin: ["https://example.com",
                        "//another.com:888", "//other.com"]

因此,您可以像以下方式重新配置主机:

[url: [host: "http://www.phoenix.hollyer.me.uk"]]

将 :check_origin 选项传递给端点配置或 UserSocket 模块:

check_origin: ["http://www.phoenix.hollyer.me.uk"]

然后尝试再次部署。希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新