Ratchet+nginx+SSL/seguro websocket
(1)
Al revisar el historial de edición de la pregunta, queda claro que, la configuración en la pregunta era correcta, temuri estaba tratando de conectarse desde el cliente con el puerto configurado,
upstream websocketserver {
server localhost:8080;
}
pero este bloque de código le dice a Nginx que hay un servidor TCP que se ejecuta en el puerto 8080, lo representa como un alias de servidor web, pero el servidor en ejecución no es accesible al público.
Compruebe la siguiente configuración,
server {
server_name wss.myapp.mobi;
listen 443;
ssl on;
ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
ssl_certificate_key /etc/ssl/myapp-mobi.key;
access_log /var/log/wss-access-ssl.log;
error_log /var/log/wss-error-ssl.log;
location / {
proxy_pass http://websocketserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
proxy_redirect off;
}
}
esta configuración une el dominio wss.myapp.mobi
con el puerto 443 habilitando ssl y wss.myapp.mobi
las solicitudes al servidor websocket local a través de la directiva proxy_pass
;
Así se puede acceder al servidor websocket desde el cliente del navegador con
// connect through binded domain
// instead of wss.myapp.mobi:8080 which will not work
var url = ''wss://wss.myapp.mobi'';
He estado intentando ejecutar Ratchet.io sobre SSL (este problema: ¿ phs ratchet websocket SSL connect? ).
Mi servidor web se ejecuta en myhost.mobi, y he creado un host virtual separado para el servicio de websocket "wws.myhost.mobi".
Mi web socket:
$webSock = new React/Socket/Server($loop);
$webSock->listen(8080, ''0.0.0.0'');
$webServer = new Ratchet/Server/IoServer(
new Ratchet/Http/HttpServer(
new Ratchet/WebSocket/WsServer(
new Ratchet/Wamp/WampServer(
$pusher
)
)
),
$webSock
);
Mi configuración nginx (estoy en nginx 1.5.8):
upstream websocketserver {
server localhost:8080;
}
server {
server_name wss.myapp.mobi;
listen 443;
ssl on;
ssl_certificate /etc/ssl/myapp-mobi-ssl.crt;
ssl_certificate_key /etc/ssl/myapp-mobi.key;
access_log /var/log/wss-access-ssl.log;
error_log /var/log/wss-error-ssl.log;
location / {
proxy_pass http://websocketserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 86400; # neccessary to avoid websocket timeout disconnect
proxy_redirect off;
}
}
Mi script del lado del cliente:
var conn = new ab.Session(''wss://wss.myapp.mobi'', function(o) {
// ...
}, function() {
console.warn(''WebSocket connection closed'');
}, {
skipSubprotocolCheck: true
});
Entonces, cuando cargo la página en Firefox, veo una conexión saliente a wss: //wss.myapp.mobi: 8080 /, que está colgando (la ruleta) y nunca se completa o muere. No veo ningún rastro de solicitud que llegue al servidor en los registros.
¿Qué me estoy perdiendo allí?
¡Gracias!
EDITAR Me he dado cuenta de que debería conectarme a wss: //wss.myapp.mobi , pero ahora obtengo el estado de "101 Protocolos de conmutación".
EDIT 2 Todo está funcionando ahora con la configuración anterior. El estado de "101 Protocolos de conmutación" resulta ser un mensaje normal. ¡PROBLEMA RESUELTO!