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