我正在设置一个带有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 Johnsonproxy_pass https://my_app;
更改为proxy_pass http://my_app;
,但没有任何变化。在 Phoenix 配置文件中,我设置了http
和https
,应该足以使用 WebSockets (ws
和wss
)。至于本地主机,我通过将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}
进行了测试。这也导致了相同的问题。 - kabebopproxy_pass http://my_app:4020
。 - Kevin Johnsonproxy_pass http://0.0.0.0:4020
,但这也没有起作用。我认为无论你在proxy_pass
中设置还是定义upstream my_app { server 0.0.0.0:4020 }
都没有关系。 - kabebop