我正在使用 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 重定向的域访问,不知道这是否会成为问题。
如果有人有线索,我很乐意弄清楚发生了什么事......
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
似乎现在可以工作。
我将 laravel-echo-server.json 配置为在 HTTPS 上工作。
这使得事件广播再次工作,但通道身份验证不起作用。
所以我改变了 Socket.IO 的导入方式:
至
这些改变起到了作用。
请注意,删除频道默认前缀有很大帮助。