Saya sedang membina tapak web menggunakan Laravel Echo Server, Socket IO dan Redis. Masalah yang saya hadapi ialah semuanya berfungsi secara tempatan tetapi tidak pada pelayan VPS saya.
Apabila pengguna memasukkan paparan yang memerlukan Soket IO, gelung 404 akan muncul https://example.com:6001/socket.io/?EIO=4&transport=polling&t=O0DofMO net::ERR_CONNECTION_CLOSED
Pada FireFox saya dapat melihat ralat ini, diterangkan dengan lebih terperinci
Saya tidak tahu apa yang sepatutnya dilakukan, tetapi saya rasa Socket IO cuba untuk menyambung selama-lamanya tetapi tidak boleh berjaya.
Menggunakan Laravel 6 pada Apache. Ini ialah konfigurasi saya:
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$ } }
Pelayan gema laravel ini dijalankan melalui penyelia:
[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
Saya mula-mula cuba untuk mengetahui sama ada port 6001 sedang didengari, nampaknya:
> netstat -tulnp | grep 6001 tcp6 0 0 :::6001 :::* LISTEN 1816/laravel-echo-server
Apl saya.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', });
Dan pandangan di mana pelanggan Socket IO berada:
<!-- 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 menyiarkan acara dengan betul apabila menyerahkan operasi kerana saya melihatnya melalui tail -f echoserver.log
Tetapi saya tidak pernah melihat mana-mana pengguna menyambung, jadi tiada siapa yang dapat menerima sebarang data dari bahagian hadapan.
Sila ambil perhatian bahawa VPS saya boleh diakses melalui domain dengan ubah hala DNS, tidak pasti sama ada ini akan menjadi isu.
Jika sesiapa mempunyai petunjuk, saya dengan senang hati akan mengetahui apa yang sedang berlaku...
Nampak bekerja sekarang.
Saya mengkonfigurasi laravel-echo-server.json untuk bekerja melalui HTTPS.
Ini menjadikan penyiaran acara berfungsi semula, tetapi pengesahan saluran tidak berfungsi.
Jadi saya menukar cara Socket.IO diimport:
kepada
Perubahan ini berjaya.
Sila ambil perhatian bahawa mengalih keluar awalan lalai saluran banyak membantu.