循环中的Laravel Echo和Socket IO传输轮询404 ERR_CONNECTION_CLOSED
P粉029057928
P粉029057928 2024-03-26 16:36:46
0
1
493

我正在使用 Laravel Echo Server、Socket IO 和 Redis 构建一个网站。我面临的问题是一切都可以在本地运行,但不能在我的 VPS 服务器上运行。

当用户进入需要 Socket IO 的视图时,会出现 404 循环 https://example.com:6001/socket.io/?EIO=4&transport=polling&t=O0DofMO net::ERR_CONNECTION_CLOSED

在 FireFox 上,我可以看到此错误,描述更详细

我不知道它应该做什么,但我认为 Socket IO 正在尝试永远连接,但无法成功。

在 Apache 上使用 Laravel 6。这是我的配置:

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$
        }
}

这个 laravel echo 服务器通过主管运行:

[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

我首先尝试知道 6001 端口是否被监听,似乎:

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

我的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',
});

以及 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 正确广播事件,因为我看到它们通过 tail -f echoserver.log 传递

但我从未看到任何用户正在连接,因此没有人能够接收前台端的任何数据。

请注意,我的 VPS 可以通过具有 DNS 重定向的域访问,不知道这是否会成为问题。

如果有人有线索,我很乐意弄清楚发生了什么事......

P粉029057928
P粉029057928

全部回复(1)
P粉269530053

似乎现在可以工作。

我将 laravel-echo-server.json 配置为在 HTTPS 上工作

这使得事件广播再次工作,但通道身份验证不起作用。

所以我改变了 Socket.IO 的导入方式:

sssccc

sssccc

这些改变起到了作用。

请注意,删除频道默认前缀有很大帮助。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板