Ich erstelle eine Website mit Laravel Echo Server, Socket IO und Redis. Das Problem, mit dem ich konfrontiert bin, ist, dass alles lokal funktioniert, aber nicht auf meinem VPS-Server.
Wenn der Benutzer eine Ansicht betritt, die Socket IO erfordert, wird eine 404-Schleife angezeigt https://example.com:6001/socket.io/?EIO=4&transport=polling&t=O0DofMO net::ERR_CONNECTION_CLOSED
Auf Firefox kann ich diesen Fehler sehen, der detaillierter beschrieben wird
Ich weiß nicht, was es tun soll, aber ich denke, Socket IO versucht, ewig eine Verbindung herzustellen, aber es gelingt ihm nicht.
Verwendung von Laravel 6 auf Apache. Das ist meine Konfiguration:
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$ } }
Dieser Laravel-Echo-Server läuft über Supervisor:
[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
Ich habe zuerst versucht herauszufinden, ob Port 6001 abgehört wird, es scheint:
> netstat -tulnp | grep 6001 tcp6 0 0 :::6001 :::* LISTEN 1816/laravel-echo-server
Mein 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', });
Und die Ansicht, wo sich der Socket IO-Client befindet:
<!-- 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 überträgt Ereignisse beim Senden eines Vorgangs korrekt, da ich sehe, dass sie über tail -f echoserver.log weitergeleitet werden
Aber ich sehe nie, dass sich ein Benutzer verbindet, sodass niemand Daten von der Frontend-Seite empfangen kann.
Bitte beachten Sie, dass auf meinen VPS über eine Domain mit DNS-Weiterleitungen zugegriffen werden kann. Ich bin mir nicht sicher, ob dies ein Problem darstellt.
Wenn jemand eine Ahnung hat, würde ich gerne herausfinden, was los ist...
似乎现在可以工作。
我将 laravel-echo-server.json 配置为在 HTTPS 上工作。
这使得事件广播再次工作,但通道身份验证不起作用。
所以我改变了 Socket.IO 的导入方式:
至
这些改变起到了作用。
请注意,删除频道默认前缀有很大帮助。