저는 플레이 프레임 워크 애플리케이션을 실행하고 있는데, 자바 스크립트 한 조각이 서버의 웹 소켓에 연결해야합니다. 서버는 다음 설정을 사용하여 Play 애플리케이션 앞에서 SSL을 사용하는 nginx 프록시를 실행하고 있습니다.
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=one:10m max_size=500m;
proxy_cache_methods GET HEAD;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
proxy_http_version 1.1;
upstream backend {
server 127.0.0.1:9001;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl on;
server_name www.studiecirkel.net;
gzip off;
ssl_certificate /home/sfr/certs/ssl-bundle.crt;
ssl_certificate_key /home/sfr/certs/server.key;
ssl_session_timeout 5m;
ssl_ciphers EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://backend;
auth_basic "Internt alpha-test";
auth_basic_user_file /home/sfr/studiecirkel/.htpasswd;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
tcp_nodelay on;
}
}
자바 스크립트는 다음과 같습니다.
var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)");
그리고 connectChat 메소드는 다음과 같습니다.
public LegacyWebSocket<JsonNode> connectChat() {
return new LegacyWebSocket<JsonNode>() {
public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out){
// Some internal code here
}
};
}
모든 것이 localhost에있을 때 제대로 작동했지만 이제 서버가 클라우드에 있으므로 Chromium에서 다음 오류가 발생합니다.
'wss : // backend / messages / socket /'에 대한 WebSocket 연결 실패 : 연결 설정 오류 : net :: ERR_NAME_NOT_RESOLVED
또한 proxy_pass 지시문 주소를 백엔드에서 127.0.0.1:9001로 전환하려고 시도한 다음 대신 ERR_CONNECTION_REFUSED를 얻습니다.
"proxy_pass http : // backend " 를 사용 하고 프록시 뒤에서 비 SSL로 전환하려고하면 브라우저에서 웹 소켓 연결이 안전하지 않고 연결되지 않는다고 말합니다.
여기서 무엇이 잘못 되었을까요? 웹 소켓이 프록시 된 URL에 직접 연결할 수 있어야합니까? SSL 사용 웹 소켓이이 방식으로 작동하지 않습니까?
문제는이 코드에 있습니다.
var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)")
서버에서 해결되어 ERR_NAME_NOT_RESOLVED 오류가 나타납니다. 클라이언트가 귀하의 케이스에서 백엔드 인 호스트를 확인 하지 못하고 브라우저가이를 해결할 수없는 경우 이는 DNS 오류 입니다.
이것을 아래 코드로 바꾸고 작동하는지 확인하십시오.
var chatSocket = new WS("messages/socket/");
최신 정보. 위의 코드로는 충분하지 않은 것 같습니다. 다음은 문서 객체에서 호스트를 얻는 방법입니다.
var webSocketURL = 'wss://' + window.location.host + '/messages/socket/';
var chatSocket = new (webSocketURL);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다