laravel-websockets icon indicating copy to clipboard operation
laravel-websockets copied to clipboard

Connection id {id} message {"event":"pusher:connection_established","data":"{\"socket_id\":\"{id}\",\"activity_timeout\":30}"} Error

Open iamafasha opened this issue 3 years ago • 3 comments
trafficstars

Discussed in https://github.com/beyondcode/laravel-websockets/discussions/991

Originally posted by iamafasha May 30, 2022 Hi, I set up a Laravel WebSocket server, and it works fine, but sometimes I this error especially when I have many connections to the WebSocket server at almost the same time (for example if I refresh the dashboard several times and try to connect to the WebSocket) the issue seems to be happening only in production.

Connection id 479386461.347846647 sending message {"event":"pusher:connection_established","data":"
{\"socket_id\":\"479386461.347846647\",\"activity_timeout\":40}"}

here is what my Nginx config looks like

map $httP_upgrade $type{
	default "web";
	websocket "websocket";
}

server {
	root  ......./webscoket-server/public/;
	add_header X-XSS-Protection             "1; mode=block";
        add_header X-Content-Type-Options       "nosniff";
	index index.html index.htm index.nginx-debian.html index.php;
	charset utf-8;
        location ~* ^/storage/(.*)\.(jpg|jpeg|gif|bmp|png|ico)$ {
                access_log off;
        }
	server_name websocketserver.domain;
	client_max_body_size 200M;
	location / {
		 try_files /nonexistent @$type;
	}

	location @web {
		 try_files $uri $uri/ /index.php$is_args$args;
	} 
	location @websocket {
	    proxy_pass http://127.0.0.1:6001;
	    proxy_read_timeout     60;
            proxy_connect_timeout  60;
            proxy_redirect         off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;        
            proxy_cache_bypass $http_upgrade;
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	}

	location ~ /\.ht {
		deny all;
	}

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/websocketserver.domain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/websocketserver.domain/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}


server{
    	server_name socketonly.domain;
	error_log /var/log/nginx/error_websocket_port.log;
        access_log /var/log/nginx/access_websocket_port.log;

    location / {
        proxy_pass http://127.0.0.1:6001;
 	proxy_read_timeout     60;
        proxy_connect_timeout  60;
        proxy_redirect         off;
    
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $http_upgrade;
    	proxy_set_header Connection 'upgrade';
    	proxy_set_header Host $host;
    	proxy_cache_bypass $http_upgrade;
    }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/socketonly.domain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/socketonly.domainprivkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = websocketserver.domain) {
        return 301 https://$host$request_uri;
    } # managed by Certbot



	server_name websocketserver.domain;
    listen 80;
    return 404; # managed by Certbot


}


server{
    if ($host = socketonly.domain) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name socketonly.domain;
    listen 80;
    return 404; # managed by Certbot
}

// And this my config/websockets.php

    /*
     * Set a custom dashboard configuration
     */
    'dashboard' => [
        'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001),
    ],

    /*
     * This package comes with multi tenancy out of the box. Here you can
     * configure the different apps that can use the webSockets server.
     *
     * Optionally you specify capacity so you can limit the maximum
     * concurrent connections for a specific app.
     *
     * Optionally you can disable client events so clients cannot send
     * messages to each other via the webSockets.
     */
    'apps' => [
        [
            'id' => env('PUSHER_APP_ID'),
            'name' => env('APP_NAME'),
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'path' => env('PUSHER_APP_PATH'),
            'capacity' => null,
            'host' => env('PUSHER_APP_HOST', null),
            'enable_client_messages' => false,
            'enable_statistics' => true,
        ],
    ],

    /*
     * This class is responsible for finding the apps. The default provider
     * will use the apps defined in this config file.
     *
     * You can create a custom provider by implementing the
     * `AppProvider` interface.
     */
    'app_provider' => BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class,

    /*
     * This array contains the hosts of which you want to allow incoming requests.
     * Leave this empty if you want to accept requests from all hosts.
     */
    'allowed_origins' => [
        //
    ],

    /*
     * The maximum request size in kilobytes that is allowed for an incoming WebSocket request.
     */
    'max_request_size_in_kb' => 250,

    /*
     * This path will be used to register the necessary routes for the package.
     */
    'path' => 'laravel-websockets',

    /*
     * Dashboard Routes Middleware
     *
     * These middleware will be assigned to every dashboard route, giving you
     * the chance to add your own middleware to this list or change any of
     * the existing middleware. Or, you can simply stick with this list.
     */
    'middleware' => [
        'web',
        Authorize::class,
    ],

    'statistics' => [
        /*
         * This model will be used to store the statistics of the WebSocketsServer.
         * The only requirement is that the model should extend
         * `WebSocketsStatisticsEntry` provided by this package.
         */
        'model' => \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class,

        /**
         * The Statistics Logger will, by default, handle the incoming statistics, store them
         * and then release them into the database on each interval defined below.
         */
        'logger' => BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger::class,

        /*
         * Here you can specify the interval in seconds at which statistics should be logged.
         */
        'interval_in_seconds' => 60,

        /*
         * When the clean-command is executed, all recorded statistics older than
         * the number of days specified here will be deleted.
         */
        'delete_statistics_older_than_days' => 60,

        /*
         * Use an DNS resolver to make the requests to the statistics logger
         * default is to resolve everything to 127.0.0.1.
         */
        'perform_dns_lookup' => '1.1.1.1',
    ],

    /*
     * Define the optional SSL context for your WebSocket connections.
     * You can see all available options at: http://php.net/manual/en/context.ssl.php
     */
    'ssl' => [
        /*
         * Path to local certificate file on filesystem. It must be a PEM encoded file which
         * contains your certificate and private key. It can optionally contain the
         * certificate chain of issuers. The private key also may be contained
         * in a separate file specified by local_pk.
         */
        'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),

        /*
         * Path to local private key file on filesystem in case of separate files for
         * certificate (local_cert) and private key.
         */
        'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),

        /*
         * Passphrase for your local_cert file.
         */
        'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),
    ],

    /*
     * Channel Manager
     * This class handles how channel persistence is handled.
     * By default, persistence is stored in an array by the running webserver.
     * The only requirement is that the class should implement
     * `ChannelManager` interface provided by this package.
     */
    'channel_manager' => \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class,
];

iamafasha avatar May 31 '22 19:05 iamafasha

Anyone to help me out?

iamafasha avatar Jun 07 '22 07:06 iamafasha

Duplicate of #991 Hard to read if you don't use markdown correctly

PaolaRuby avatar Jun 10 '22 14:06 PaolaRuby

It was a discussion which I tried to turn into an issue. But basically what's happening is If I make like 5 connections almost simultaneously. The WebSocket server stops responding.

iamafasha avatar Jul 15 '22 15:07 iamafasha