Как настроить веб-сокеты с помощью Phoenix за Nginx?

Я пытаюсь настроить веб-сокеты для перехода через Nginx в приложение Phoenix, но продолжаю получать ошибку 403. Может ли кто-нибудь посоветовать правильную конфигурацию, чтобы это работало в продакшене - среда разработки в порядке.

Моя конфа Nginx:

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;
  }
}

Моя конфигурация prod.exs:

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

Я могу предоставить любую дополнительную информацию по запросу, если это необходимо.

Приложение может быть доступно через доменное имя, последняя и единственная оставшаяся проблема — заставить работать веб-сокеты.

Большое спасибо всем, кто может указать мне в правильном направлении.


person paul h    schedule 06.07.2016    source источник


Ответы (1)


Я следовал руководству с сайта phoenix. Выпуски Exrm — Phoenix

В вашем 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"]

А затем попробуйте развернуть снова. Надеюсь, это поможет вам!

person TheAnh    schedule 06.07.2016
comment
Да, я пропустил заявление карты. Поэтому я добавил его в конфигурацию nginx для этого домена и перезапустил nginx, но все равно получаю ту же ошибку. У меня есть бродячий виртуальный компьютер, который соответствует конфигурации моего сервера, и я собираю на нем выпуск exrm, если бы возникла проблема со сборкой, я бы не смог получить к нему доступ, я думаю, что это не так. Точную проблему можно увидеть здесь [ссылка](phoenix.hollyer.me.uk), если вы перейдете на страницу контактов и проверите консоль браузера, вы увидите ошибку. - person paul h; 07.07.2016
comment
Это исправило это, спасибо, я принял ваш ответ как правильный. Для себя я установил для check_origin значение false, потому что я также буду подключаться к сокету из мобильных приложений. - person paul h; 07.07.2016
comment
Рад, что помог вам! - person TheAnh; 07.07.2016