【发布时间】:2018-01-16 19:31:04
【问题描述】:
我有一个可用的 websocket,可以从我的客户端代码访问,如下所示:(不使用 Socket.io 或任何库,只是普通的 html5 websockets)
ws://localhost:9000/socket/connect
Websocket在Java Play Framework中实现
public WebSocket connect() {
return WebSocket.Text.accept(request -> ActorFlow.actorRef(out -> SocketActor.props(out, jsonWebToken),
actorSystem, materializer
)
);
}
无论如何,这工作正常,但是我现在想为网站设置 https 并在 nginx 上执行此操作。切换到 https 我还需要使用 wss 协议而不是 ws,因此我也想通过 nginx 代理 wss 调用,因此我遇到了问题。
我已经为 websocket 代理配置了我的 nginx,如此处所述https://www.nginx.com/blog/websocket-nginx/ 我的完整配置如下所示
upstream backend {
server backend:9000;
}
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name legato;
ssl_certificate /etc/nginx/ssl/legato.crt;
ssl_certificate_key /etc/nginx/ssl/legato.key;
location /api {
return 302 /api/;
}
location /api/ {
proxy_pass http://backend/;
}
location /statics {
root /var/www;
}
location /socket/connect {
proxy_pass http://backend/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location / {
root /var/www/frontend;
index index.html;
try_files $uri /index.html;
}
}
所以 /socket/connect 路由被转发到 websocket 后端路由。
从我的客户端 javascript 代码中,我现在像这样打开 websocket
socket = new WebSocket(wss://192.168.155.177/socket/connect);
这给了我错误
WebSocket connection to 'wss://192.168.155.177/socket/connect' failed: Error during WebSocket handshake: Unexpected response code: 200
有人可以向我解释一下这种情况有什么问题吗?
【问题讨论】:
-
所以您刚刚将 nginx 更改为在前端使用 HTTPS,但 nginx 代理仍然通过 HTTP 连接到 Play 后端?
-
没错,这就是我面临的问题
标签: javascript nginx playframework websocket