2017-12-15 21 views
2

Websocketを使用するPhoenixアプリケーションを使用してサーバーを設定しています。ローカルでwebsocketの作業ができましたが、ステージングサーバーに設定する際に問題があります。誰かが自分のサーバー上でWebソケットを設定するのを助けることができますか?私はnginxの、このように構成されている:サーバー上でElixir、NGINX、Websocketsを設定する方法

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

と私の鳳凰の設定は次のとおりです。

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 

を取得します?

+0

私は 'proxy_pass https:// my_app;'はlocalhostのどこかを参照する必要があり、nginxレベルでsslを扱っているので、httpsであなたのアプリケーションをプロキシするという点はありません。代わりに通常の 'http'を試してください。 –

+0

私は 'proxy_pass https:// my_app;'から 'proxy_pass http:// my_app;'に変更しようとしましたが、何も変更されませんでした。 phoenixの設定ファイルでは、 'http'と' https'を設定しました。これはwebsocket( 'ws'と' wss')で動作するのに十分なはずです。 localhostについては、 'upstream my_app {server 0.0.0.0:6443;}'を 'upstream my_app {server 0.0.0.0:4020;}'(httpの私のポート)に変更するか、 'upstream my_app {サーバー0.0.0.0:6443;サーバー0.0.0.0:4020} '。これも同じ問題を引き起こしました。 – kabebop

+0

私はproxy_passにwebsocketポートも指定する必要があると思います。それ以外の場合は、ポート80またはポート443で待機します。あなたは 'proxy_pass http:// my_app:4020' –

答えて

0

上記の設定が機能します。私の側の問題は古い設定を持っていた間違ったnginx設定ファイルを使用していることでした。

関連する問題