我有一个可以工作的websocket,它可以从我的客户端代码中访问,如下所示:(不使用Socket.io或任何库,只使用普通的html5 websocket)
ws://localhost:9000/socket/connectWebsocket在Java Play框架中的实现
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有人能给我解释一下这种情况下哪里出了问题吗?
发布于 2018-01-16 19:31:05
我为这个问题找到了一个小的解决方法,我打算把它留给将来的任何人。
所以我试着:
这个解决方案是使用stunnel,它允许我打开一个端口,加密任何传入的流量,并将其转发到另一个端口。因此,我现在使用ssl对端口9433上的流量进行加密,并将其转发到后端(未解密的ws Endpoint ),从而使其正常工作。
如果你不想在实际的生产环境中使用它,你应该对这种方法的可扩展性进行一些研究,特别是对stunnel。
https://stackoverflow.com/questions/48250064
复制相似问题