Mojolicious websocket abnormal close connection

266 views
Skip to first unread message

ppro...@gmail.com

unread,
Oct 15, 2014, 2:45:23 AM10/15/14
to mojol...@googlegroups.com
I have nginx with following config:

map $http_upgrade $connection_upgrade {
   
default upgrade;
   
'' close;
}


server
{
    listen
80;
    server_name mydomain
.com;
    location
/ {
        proxy_pass http
://127.0.0.1:3000/;
        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   ssl              $ssl_protocol
;
        proxy_http_version
1.1;
        proxy_set_header    
Upgrade $http_upgrade;
        proxy_set_header    
Connection $connection_upgrade;
        proxy_read_timeout  
65s;
   
}
}


I have the following websocket server:

use Mojolicious::Lite;
use Mojo::Redis;
use Mojo::IOLoop;

websocket
'/' => sub {
   
my $self = shift;
    $self
->inactivity_timeout(65);
   
my $pub = Mojo::Redis->new;
   
my $sub = $pub->subscribe('test');
   
my $w = Mojo::IOLoop->recurring(60 => sub {
        $self
->send([1, 0, 0, 0, 9, 'PING']);
   
});

    $sub
->on(message => sub {
       
my ($sub, $message, $channel) = @_;
        $self
->send($message . ' ' . time);
   
});

    $self
->on(message => sub {
       
my ($conn, $msg) = @_;
        $conn
->send("echo: $msg");
   
});

    $self
->on(finish => sub {
       
undef $self;
       
undef $pub;
       
undef $sub;
       
Mojo::IOLoop->remove($w);
   
});
};
app
->start;

And i have following js code:

var socket = new WebSocket("ws://mydomain.com")

soket
.onopen = function() {
  console
.log("Connection established");
}

socket
.onclose = function(event) {
 
if (event.wasClean) {
   console
.log('Connection was closed cleanly');
 
}
 
else {
   console
.log('Connection reseted');
 
}
 console
.log('Code: ' + event.code + ' Reason: ' + event.reason);
};

socket
.onmessage = function(event) {
  console
.log('Recieved data: ' + event.data);
};

socket
.onerror = function(error) {
 console
.log('Error: ' + error.message);
}

And after 10 minutes i have reset connection with code 1006. This is the messages in browser console:
[ws://mydomain.com] Connection established
[ws://mydomain.com] Connection reseted
[ws://mydomain.com] Code: 1006 Reason:  

I tried to change inactivity_timeout in mojolicious and proxy_read_timeout in nginx and it didn't help.
Please help me to understand, what i doing wrong.
Thanks.

ppro...@gmail.com

unread,
Oct 17, 2014, 1:17:37 AM10/17/14
to mojol...@googlegroups.com
I found the problem. I start mojolicious in prefork mode with several workers. When Mojolicious reforks workers, he resets the connections of this worker. I start this in daemon single process mode, and everything is ok.
Is it normal then mojolicious reset connections of worker?

среда, 15 октября 2014 г., 10:45:23 UTC+4 пользователь ppro...@gmail.com написал:
Reply all
Reply to author
Forward
0 new messages