Laravel Echo et Socket IO transfert d'interrogation 404 ERR_CONNECTION_CLOSED en boucle
P粉029057928
P粉029057928 2024-03-26 16:36:46
0
1
497

Je crée un site Web en utilisant Laravel Echo Server, Socket IO et Redis. Le problème auquel je suis confronté est que tout fonctionne localement mais pas sur mon serveur VPS.

Lorsque l'utilisateur entre dans une vue qui nécessite Socket IO, une boucle 404 apparaîtra https://example.com:6001/socket.io/?EIO=4&transport=polling&t=O0DofMO net ::ERR_CONNECTION_CLOSED

Sur FireFox, je peux voir cette erreur, décrite plus en détail

Je ne sais pas ce qu'il est censé faire, mais je pense que Socket IO essaie de se connecter pour toujours mais n'y parvient pas.

Utilisation de Laravel 6 sur Apache. Voici ma configuration :

apache.conf :

<IfModule mod_ssl.c>
    <VirtualHost *:443>
            ServerName www.example.com
            ServerName example.com
            ServerAlias www.example.com
            ServerAlias example.com

            DocumentRoot /var/www/html/project/public
            <Directory /var/www/html/project/public>
                    AllowOverride All
                    Allow from All
            </Directory>

            ErrorLog ${APACHE_LOG_DIR}/project.error.log
            CustomLog ${APACHE_LOG_DIR}/project.access.log combined

            SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
            SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
            Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

laravel-echo-server.json :

{
        "authHost": "https://example.com",
        "authEndpoint": "/broadcasting/auth",
        "clients": [],
        "database": "redis",
        "databaseConfig": {
                "redis": {},
                "sqlite": {
                        "databasePath": "/database/laravel-echo-server.sqlite"
                }
        },
        "devMode": true,
        "host": null,
        "port": "6001",
        "protocol": "http",
        "socketio": {},
        "secureOptions": 67108864,
        "sslCertPath": "",
        "sslKeyPath": "",
        "sslCertChainPath": "",
        "sslPassphrase": "",
        "subscribers": {
                "http": true,
                "redis": true
        },
        "apiOriginAllow": {
                "allowCors" : true,
                "allowOrigin" : "https://example.com",
                "allowMethods" : "GET, POST",
                "allowHeaders" : "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authori$
        }
}

Ce serveur d'écho Laravel passe par le superviseur :

[program:echo-server]
directory=/var/www/html/project
command=laravel-echo-server start
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/html/project/storage/logs/echoserver.log

J'ai d'abord essayé de savoir si le port 6001 est écouté, il semblerait :

> netstat -tulnp | grep 6001
tcp6       0      0 :::6001                 :::*                    LISTEN      1816/laravel-echo-server

Mon app.js :

require('./bootstrap');
require('jquery');
require('jquery-ui');
require('uikit');

import UIkit from 'uikit';
import Icons from 'uikit/dist/js/uikit-icons';
import $ from 'jquery';
import 'jquery-ui/ui/widgets/sortable';

window.$ = window.jQuery = $;
window.UIkit = UIkit;
window.UIkit.use(Icons);

require('./workspace_list');
require('./workspace_add');

import Echo from 'laravel-echo';

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001',
});

Et la vue où se trouve le client Socket IO :

<!-- some code ... -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.min.js" integrity="sha512-eVL5Lb9al9FzgR63gDs1MxcDS2wFu3loYAgjIH0+Hg38tCS8Ag62dwKyH+wzDb+QauDpEZjXbMn11blw8cbTJQ==" crossorigin="anonymous"></script>
<script src="{{ mix('js/app.js') }}"></script>

Laravel Echo Server diffuse correctement les événements lors de la soumission d'une opération car je les vois être transmis via tail -f echoserver.log

Mais je ne vois aucun utilisateur se connecter, donc personne ne peut recevoir de données du côté frontend.

Veuillez noter que mon VPS est accessible via un domaine avec des redirections DNS, je ne sais pas si cela posera un problème.

Si quelqu'un a une idée, je serais heureux de comprendre ce qui se passe...

P粉029057928
P粉029057928

répondre à tous(1)
P粉269530053

Semble fonctionner maintenant.

J'ai configuré laravel-echo-server.json pour fonctionner via HTTPS.

Cela permet à la diffusion d'événements de fonctionner à nouveau, mais l'authentification des chaînes ne fonctionne pas.

J'ai donc changé la façon dont Socket.IO est importé :

sssccc

à

sssccc

Ces changements ont fonctionné.

Veuillez noter que la suppression du préfixe par défaut de la chaîne aide beaucoup.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal