Socket.io: Kesalahan selama jabat tangan WebSocket: Kode respons tak terduga: 400

Dibuat pada 14 Jan 2015  ·  129Komentar  ·  Sumber: socketio/socket.io

Tidak dapat menemukan solusi, saya mendapatkan kesalahan ini di konsol browser:
Koneksi WebSocket ke 'ws://.../socket.io/?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0' gagal: Kesalahan selama jabat tangan WebSocket: Kode respons tak terduga: 400.

Ada saran?

Komentar yang paling membantu

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Semua 129 komentar

Saya mengalami masalah yang sama persis saat ini, adakah bantuan?

Saya juga mengalami masalah ini karena saya memasang sertifikat SSL di domain saya.

Berikut adalah deskripsi masalah yang lebih baik: http://stackoverflow.com/questions/28025073/error-during-websocket-handshake-unexpected-response-code-400-with-nginx-proxy

Saya juga mengalami masalah serupa yang terhubung dengan salah satu perpustakaan Android. Soket web tidak akan terhubung ke https melalui HAproxy yang melakukan penghentian ssl atau membiarkan node melakukan ssl secara langsung. Namun polling panjang berfungsi dengan baik

Saya mengatasinya dengan mengubah domain ke alamat IP yang benar:

var socket = io.connect('http://182.92.79.215:3007');

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Masalah yang sama di sini di server produksi. Mesin pengembangan tidak menunjukkan kesalahan.

Yang aneh adalah bahwa koneksi berfungsi. Saya dapat mengirim pesan melalui WebSockets dari server dan klien mendapatkannya. Saya juga dapat melihat koneksi WebSocket dibuat di server.

Saya baru saja mendapatkan kesalahan ini di alat pengembang yang mengatakan:

Koneksi WebSocket ke ' wss://.../socket.io/?EIO=3&transport=websocket&sid=2b_v_BXtbwzl5z2yAAAI ' gagal: Kesalahan selama jabat tangan WebSocket: Kode respons tak terduga: 400

Saya menggunakan Apache ProxyPass untuk mengirim koneksi ke node.js.

Sama di sini - berfungsi penuh tetapi Pesan kesalahan di alat dev. Di tempat lain saya membacanya terkait dengan versi Apache - menggunakan 2.2.14 pada mesin ini.

Pastikan koneksi socket.io Anda tidak melalui Amazon Load Balancer. Atau jika demikian, lakukan ini: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

Masalah yang sama di sini, hanya di lingkungan produksi.
Soket web tampaknya berfungsi dengan benar, aplikasi berfungsi tanpa masalah. Tetapi pada log konsol saya dapat melihat kesalahan ini.

Saya menggunakan Nginx dan hanya satu server untuk node, jadi sepertinya ini bukan masalah penyeimbangan beban. Saya sudah menggunakan solusi yang disarankan oleh tylercb (dengan pengecualian "proxy_set_header Host $host;") dan itu tidak menyelesaikan masalah.

juga memiliki masalah, tetapi bekerja dengan baik ....

Saya memiliki masalah yang sama. Apakah Anda menggunakan CloudFlare? Saat ini, hanya paket Perusahaan mereka yang mendukung WebSockets.

Dipecahkan untuk saya. Itu karena alamat socket.io yang salah dalam konfigurasi nginx, yang tidak cocok dengan jalur menggunakan websocket.

Saya mencari di Google karena saya mendapat masalah yang sama dan saya juga menggunakan nginx. Solusinya adalah dengan menambahkan bagian ini

proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;

ke dalam file konfigurasi nginx seperti yang disebutkan tylercb.

Bekerja untuk saya. Terima kasih.

Mendapat kesalahan yang sama secara langsung menghubungkan ke aplikasi saya yang dihosting di Windows Server 2008R2 (tanpa proxy, tanpa IIS). Hanya perangkat keras perantara bodoh di antaranya.

Bekerja dengan baik setelah mengganti nama host ke alamat ip, yaitu 127.0.0.1:9000. mungkin disebabkan oleh httpd ProxyPassReverse

Dalam kasus saya, masalahnya adalah karena cloudfare tidak mendukung soket web pada paket gratis. Saya mematikan CloudFare untuk domain dan berhasil.

Saya hanya perlu menambahkan beberapa kondisi penulisan ulang Apache untuk menangani soket web, info lebih lanjut di sini:
http://stackoverflow.com/a/27534443/2044993

Saya tahu ini adalah masalah lama, tetapi karena ini tinggi di hasil pencarian Google, tetapi ini mungkin membantu orang:

Alasan koneksi masih berfungsi bahkan dengan kesalahan ini adalah karena socket.io kembali ke AJAX, yang tidak optimal dan Anda harus memperbaiki konfigurasi server Anda.

Btw, masalah ini harus tetap ditutup, ini bukan masalah socket.io.

@arosenfeld-mentel Saya terus membaca posting di atas komentar Anda bahwa "ini bukan masalah socket.io" tetapi saya tidak melihat di mana ada orang yang mengatakan APA masalahnya sebenarnya. Saya melihat ini sendiri meskipun, seperti yang Anda katakan, koneksi tampaknya masih berfungsi. Setiap tips akan sangat berterima kasih. Terima kasih!

Masalahnya bisa apa saja, Anda perlu men-debug seluruh pengaturan Anda. Bagi saya itu NGINX, yang sebagai proxy terbalik memerlukan pengaturan konfigurasi tambahan yang diposting di atas berkali-kali. Untuk Anda bisa menjadi sesuatu yang lain.

Mulailah dengan men-debug koneksi lokal, membuatnya bekerja tanpa peringatan, lalu pindah ke server produksi dan pastikan Anda mendapatkan firewall, server yang menghadap ke depan, dan proxy untuk bekerja sama dengan WebSockets.

Ini bukan masalah socket.io, tetapi ini adalah masalah WebSockets, jadi pastikan server dan klien bekerja dengan baik dengan WebSockets.

Terima kasih balasannya. Semuanya bekerja secara lokal atau melalui VPN kami, tetapi begitu firewall kami terlibat, pesan akan muncul. Saya kira firewall entah bagaimana mengganggu dan kita harus belajar cara men-debug masalah itu alih-alih menyalahkan socket.io. Terima kasih lagi.

Memiliki masalah yang sama persis. Saya telah membuat pertanyaan stackoverflow ( http://stackoverflow.com/questions/34439546/socket-io-with-Apache-proxy ) juga tetapi hal-hal yang disarankan di sana belum berhasil untuk saya juga.

saya telah meletakkan header ini di nginx tetapi masih mendapatkan yang sama, tetapi tidak di browser tetapi di https://toolbox.seositecheckup.com

Punya masalah ini juga, sepertinya Host virtual saya (melalui nginx) tidak diatur dengan benar untuk menerima header Upgrade. Perbaikan @tylercb dari sekitar setahun yang lalu memperbaikinya^

@tylercb bekerja untuk saya.

+1
Kesalahan ini terjadi pada lingkungan openshift

Saya pikir mungkin berguna jika saya mendokumentasikan dengan tepat apa yang saya lakukan untuk menyelesaikan masalah. Ini hanyalah kombinasi dari berbagai posting di atas yang dimasukkan ke dalam posting sederhana sehingga siapa pun yang menemukan masalah ini bisa mendapatkan solusi potensial dengan mudah. Saya tidak menghargai kerja keras.

Kami berlari

  1. Ubuntu 14.04 LTS Server,
  2. versi nginx: nginx/1.4.6 (Ubuntu) sebagai proxy terbalik dan gateway SSL.
  3. Kami TIDAK memiliki Apache sama sekali. Itu dihapus dari sistem.
  4. Kami memiliki server node.js yang berjalan di belakang nginx v0.10.25. Ini mendengarkan pada port 4001. Akses eksternal melalui port 4000.
  5. Kami menjalankan ufw di depan dan hanya mengizinkan port 4000 melalui.
  6. Kami mengelola server kami sendiri dan tidak menggunakan Cloudflare atau Openshift
  7. Kami tidak menggunakan penyeimbang beban (belum).

Kami memiliki masalah yang sama dengan orang lain

WebSocket connection to 'ws://XXXXXXXXXX?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0' failed: Error during WebSocket handshake: Unexpected response code: 400.

Kami memperbarui file nginx di /etc/nginx/sites-enabled/default untuk membaca sebagai berikut: (perhatikan kami telah mengeluarkan nama domain kami)

server {
        listen 4000;
        server_name XXXX.YYYY.ZZZZ;

        root html;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/ssl/certs/SSL.crt;
        ssl_certificate_key /etc/ssl/private/server.key;

        ssl_session_timeout 5m;

        # ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; # NOTE WE REMOVE SSLv3
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES1\
28-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD\
HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SH\
A256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SH\
A:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/private/dhparams.pem;

        location / {
                 proxy_set_header        Host $host;
                 proxy_set_header        X-Real-IP $remote_addr;
                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header        X-Forwarded-Proto $scheme;

                 # Fix the “It appears that your reverse proxy set up is broken" error.
                 proxy_pass          http://127.0.0.1:4001;
                 proxy_read_timeout  90;

                 proxy_redirect      http://127.0.0.1:4001 https://XXXXX.YYYYY.ZZZZZ;

                 # These three lines added as per https://github.com/socketio/socket.io/issues/1942 to remove the error
                 # WebSocket connection to 'wss://XXXXX.YYYYY.ZZZZZ:4000/socket.io/?EIO=3&transport=websocket&sid=0hsRiXu0q9p6RHQ8AAAC' failed:\
 Error during WebSocket handshake: Unexpected response code: 400 in console.log

                 proxy_http_version 1.1;
                 proxy_set_header   Upgrade $http_upgrade;
                 proxy_set_header   Connection "upgrade";
        }
}

Kami hanya perlu menambahkan

  1. proxy_http_version 1.1;
  2. proxy_set_header Tingkatkan $http_upgrade;
    3.proxy_set_header Koneksi "upgrade";

seperti yang sudah kita miliki

  1. proxy_set_header Host $host;
  2. proxy_pass http://127.0.0.1 :4001;

Semoga ini bisa membantu, ini berhasil untuk kami.

Terima kasih untuk bantuannya,

rampok

Saya memiliki masalah yang sama ketika saya mengautentikasi dengan CAS (bukan dengan formulir klasik), dan saya menggunakan Apache dengan LetEncrypt SSL sebagai proxy, apakah ada konfigurasi khusus yang harus diatur?

Mencoba menerapkan aplikasi Node.js di AWS Elastic BeanStalk.
Saya telah menambahkan folder .ebextensions ke root server, dan di dalamnya saya telah menambahkan file nginx.config yang terlihat seperti ini:

server:
  location /:
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;

Saya masih mendapatkan Kesalahan 400, tetapi setidaknya semua soket lainnya berfungsi.

Untuk Referensi: Ini adalah satu-satunya solusi konfigurasi yang saya temukan untuk socket.io 1.x dan Apache 2.4: https://github.com/meteor/meteor/issues/3339#issuecomment -165188938

ProxyPass / http://localhost:3999/
ProxyPassReverse / http://localhost:3999/

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3999%{REQUEST_URI} [P]

menggunakan port lain, Ini mungkin berhasil

@BlaM terima kasih atas konfigurasi yang berfungsi!

Bagi siapa pun yang mengalami masalah ini di AWS Elastic Beanstalk, file .ebextension ini berfungsi untuk saya:

files:
    "/etc/nginx/conf.d/01_websockets.conf" :
        mode: "000644"
        owner: root
        group: root
        content : |
            upstream nodejs {
                server 127.0.0.1:8081;
                keepalive 256;
            }

            server {
                listen 8080;

                location / {
                    proxy_pass  http://nodejs;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_http_version 1.1;
                    proxy_set_header        Host            $host;
                    proxy_set_header        X-Real-IP       $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                }
            }

    "/opt/elasticbeanstalk/hooks/appdeploy/enact/41_remove_eb_nginx_confg.sh":
        mode: "000755"
        owner: root
        group: root
        content : |
            mv /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.old

Sesuai petunjuk di thread ini.

@BlaM - Saya menggunakan server Apache dan ELB dengan Elastic Bean
Di mana saya harus meletakkan kode yang Anda berikan?
Terima kasih!

Saya tidak tahu tentang Elastic Bean, tetapi potongan kode yang saya posting masuk ke file host Apache.

@tylercb Terima kasih! itu berhasil untuk saya ~

Adakah yang tidak menggunakan nginx menghadapi masalah yang sama?

Ya, saya menghadapi masalah yang sama menggunakan Elastic Beanstalk dengan satu server (node ​​dan nginx) tanpa Elastic Load Balancer.
Saya tidak tahu cara mengubah dari http/https ke ssl/tls

Masalah yang sama dengan HAProxy di sini

Bekerja untuk saya. Terima kasih. Dan Anda harus memperhatikan pesanan

proxy_set_header   Upgrade $http_upgrade;
proxy_set_header   Connection "upgrade";

ya ini melakukannya untuk saya juga.

Saya juga menghadapi masalah ini. Bahkan dengan 400 kesalahan, komunikasi websocket antara klien dan server baik-baik saja. Ini di lingkungan pengembangan kami.

Adakah yang bisa memberi tahu saya apakah ini akan menjadi masalah di lingkungan produksi.

FYI: menghubungkan ke backend layar menggunakan socket.io yang dihosting di Heroku menggunakan addon postgres akan memunculkan kesalahan ini di browser Anda jika io.sails.url Anda bukan https. Kasus yang sangat spesifik tetapi mudah-mudahan ini membantu siapa saja dengan tumpukan yang sama mencari ini di google

Hei Semuanya,

Saya juga menghadapi masalah yang sama pada mesin localhost saya. Kami menggunakan python-flask sebagai server dan HTML/CSS/JS sebagai frontend.

Di Frontend untuk terhubung dengan Server Websocket kami telah menggunakan
var socket = io.connect('ws://url/namespace', { 'transports': ['websocket'] });

Ketika saya menjalankan aplikasi itu menimbulkan kesalahan
WebSocket connection to 'ws://url/namespace/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

Beri tahu kami jika Anda membutuhkan informasi lebih lanjut.

Bantuan apa pun dihargai.
Terima kasih telah Membacanya.

Salam
Ajay

Saya mendapat kesalahan yang sama pada aplikasi sampel webrtc. Di sisi server, kodenya adalah

var server = membutuhkan('http').Server(aplikasi);
var io = membutuhkan('socket.io')(server);
var WebRTC = membutuhkan('../../');
app.use(express.static(__dirname));
var io = membutuhkan('socket.io')(server);

Setelah mengomentari "require('socket.io')" kedua, pesan kesalahan 400 hilang.

Perlu menggali lebih jauh mengapa...tetapi Anda dapat memeriksa apakah aplikasi Anda mencoba membuat koneksi yang sama dua kali.

Hai teman-teman, saya tahu diskusi ini telah berlangsung lama dan ingin memposting sumber daya yang memecahkan masalah ini untuk saya menggunakan AWS EBS dengan Application Load Balancer.

https://mixmax.com/blog/deploying-meteor-to-elastic-beanstalk-1

Semoga ini membantu.

Travis

Saya memiliki masalah yang sama ketika saya menggunakan etherpad-lite.
Saya menemukan pendekatan untuk memperbaiki masalah Apache ProxyPass.
Saya menggunakan Apache http 2.2 menggunakan backprot dari modul wstunnel http 2.4 jadi saya pikir itu dapat memperbaiki v.2.4 juga.

Pertama saya telah memodifikasi socket.io-client/socket.io.js
cari WS.prototype.uri = function()
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
lalu ubah menjadi:

return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path +'ws/'+ query;
simpan dan mulai ulang simpul.

Kedua, ubah vhost.conf atau ssl.conf
tambahkan berikut ini ke VirtualHost:

        ProxyPass "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"

        ProxyPass "/etherpad/socket.io/" "http://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/" "http://localhost:9001/socket.io/"


        ProxyPass /etherpad/ http://localhost:9001/
        ProxyPassReverse /etherpad/ http://localhost:9001/
        CacheDisable *

        ProxyPreserveHost on
        <Proxy *>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Proxy>

`

Mulai ulang Apache httpd, selamat menikmati~

Untuk Apache, ikuti jawaban @cpres , ini berfungsi. conf saya

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName reservation.tinker.press

    DocumentRoot /var/www/html/node-js-order-socket-demo
    <Directory />
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule .* ws://127.0.0.1:3001%{REQUEST_URI} [P]

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    <Proxy *>
        Require all granted
    </Proxy>

    ProxyPass / "http://127.0.0.1:3001/"
    ProxyPassReverse / "http://127.0.0.1:3001/"

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

apache-websocket-use-mode-rewrite

Saya juga harus menyesuaikan penyeimbang beban elastis saya untuk menggunakan TCP melalui port 80 daripada HTTP melalui port 80.

Apakah mungkin menggunakan direktif ProxyPass dengan beberapa node? Saya akhirnya menggunakan RewriteRule untuk https://github.com/socketio/socket.io/pull/2819 :

Header add Set-Cookie "SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy "balancer://nodes_polling">
    BalancerMember "http://server-john:3000"    route=john
    BalancerMember "http://server-paul:3000"    route=paul
    BalancerMember "http://server-george:3000"  route=george
    BalancerMember "http://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

<Proxy "balancer://nodes_ws">
    BalancerMember "ws://server-john:3000"    route=john
    BalancerMember "ws://server-paul:3000"    route=paul
    BalancerMember "ws://server-george:3000"  route=george
    BalancerMember "ws://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) balancer://nodes_ws/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) balancer://nodes_polling/$1 [P,L]

@darrachequesne Itu bekerja dengan baik! Terima kasih

Terima kasih!

Bagi siapa pun yang masih mengalami masalah dengan AWS Application Load Balancer, coba perbarui Kebijakan Keamanan Anda, saya mengalami masalah yang sama meskipun itu berfungsi dengan baik dalam pengaturan yang tepat untuk situs web lain, tetapi perhatikan bahwa kebijakan keamanan tertinggal sekitar 1 tahun. Memperbarui ke yang lebih baru tampaknya telah memecahkan masalah.

Setelah mengonfigurasi nginx dan klien saya masih berjuang untuk menemukan solusi yang tepat.
Tapi @visibleajay membuat komentar itu dan saya menyadari bahwa saya tidak menggunakan bagian { 'transports': ['websocket'] } ke dalam perintah io.connect.

Jadi bagi siapa saja yang mungkin mengalami masalah yang sama,
var socket = io.connect('https://server.com/socket.io-path-here', { 'transports': ['websocket'] });

melakukan pekerjaan, bersama dengan konfigurasi nginx yang benar.

@fott1 perlu diketahui bahwa menggunakan { 'transports': ['websocket'] } berarti tidak ada fallback ke long-polling ketika koneksi websocket tidak dapat dibuat.

Contoh lengkap dengan nginx: https://github.com/socketio/socket.io/tree/master/examples/cluster-nginx

@darrachequesne saya yakin Anda benar, bagaimana jika saya memasukkan dalam array bersama dengan 'websocket' 'polling', atau 'xhr-polling'? Terima kasih atas contoh yang diberikan.

@fott1 defaultnya memang ['polling', 'websocket'] ( ref ).

Tetapi Anda harus menggunakan konfigurasi nginx yang benar, karena transportasi polling (tidak seperti websocket ) mengharuskan setiap permintaan dirutekan ke server socket.io yang sama.

@darrachequesne dengan kata lain. jika saya memiliki beberapa instance server, setiap permintaan harus dialihkan ke instance yang sama? Koreksi saya jika saya salah. Terima kasih atas tipnya.

@ fott1 ya, itu benar. Penjelasannya ada di sini: https://socket.io/docs/using-multiple-nodes/

FWIW - Saya mendapatkan ini di lokal saya (tanpa nginx, tanpa proxy). Ternyata dengan socket.io Anda harus secara eksplisit menentukan transport sebagai soket web pertama, lalu polling - di klien dan server. Tidak tahu mengapa itu tidak hanya menjadi default. Atau mungkin aku salah melakukannya.

Masalah awal kami adalah kami melakukan polling sebelum websocket, tidak menyadari bahwa urutan itu penting.

Pengaturan asli:
server:
io.set('transports', ['polling', 'websocket']);
klien:
var socket = io.connect(server, { reconnect: true });

Kami menyadari klien kami melakukan polling, jadi kami menghapusnya sebagai opsi. Kemudian semuanya mulai gagal dan kami mendapat 400 permintaan buruk.

Jadi akhirnya kami menemukan bahwa Anda harus menentukan urutan di klien dan server, dan jika tidak, klien akan langsung pergi ke polling, yang tidak masuk akal bagi saya. Anda akan berpikir itu akan default ke websocket terlebih dahulu.

Memperbaiki:
server:
io.set('transports', ['websocket', 'polling']);
klien:
var socket = io.connect(server, { reconnect: true, transports: ['websocket', 'polling'] });

Sekali lagi, perlu diketahui bahwa menggunakan { 'transports': ['websocket', 'polling'] } berarti tidak ada fallback ke long-polling ketika koneksi websocket tidak dapat dibuat.

Mari kita tutup masalah itu, silakan buka kembali jika perlu.

Saya mengambil pendekatan "memperluas" konfigurasi nginx default Elastic Beanstalk dengan pengaturan lokasi yang mirip dengan beberapa saran sebelumnya. Buat struktur direktori seperti ini:

 ~/ruang kerja/aplikasi-saya/
 |-- .ebextensions
 | `-- nginx
 | `-- conf.d
 | `-- myconf.conf
 `-- web.jar

di mana myconf.conf , yang namanya arbitrer asalkan diakhiri dengan .conf berisi yang berikut:

 server {
 lokasi / {
 proxy_pass http://127.0.0.1:5000;
 proxy_http_version 1.1;
 proxy_set_header Tingkatkan $http_upgrade;
 proxy_set_header Koneksi "upgrade";
 proxy_set_header Host $host;
 }
 }

Pastikan untuk menyesuaikan nomor port dengan kebutuhan Anda.

Saya memecahkan masalah ini dengan menambahkan hanya { transports: ['polling'] } .

_

var socket = io.connect(server, {transports: ['polling']});

_

@hyewon330 Tampaknya jika Anda tidak benar-benar _menyelesaikannya_ Anda cukup mengonfigurasi socket.io untuk tidak mencoba menggunakan soket web sejak awal. Tentu, pesan kesalahan hilang, tetapi sekarang Anda memaksa socket.io untuk menggunakan polling meskipun koneksi antara klien dan server _would_ mendukung soket web. Tidak yakin apakah itu penting untuk aplikasi Anda, hanya ingin memastikan Anda tahu

Bagi siapa pun yang menggunakan Nginx , solusi @tylercb bekerja dengan sempurna.

Solusi ini memperbaiki masalah saya dengan aplikasi mengkilap. prefek.

@tylercb @rudolfschmidt @juanjoLenero @rwillett @cpres halo, saya menggunakan metode Anda tetapi tidak berhasil untuk saya. Saya ragu apakah karena saya menggunakan port lain daripada 8080. Misalnya, aplikasi saya diletakkan di mesin A dengan IP 170.8.8.8 pemantauan port 5000, dan saya menempatkan nginx di mesin B dengan IP 170.8.8.2 juga memantau port 5000. Jadi saya ingin mengunjungi IP:5000 di B yang melompat ke IP:5000 di A. Di bawah ini adalah konfigurasi nginx saya di mesin B:

upstream cuitccol.com{ #the name of server cluster
        server 170.8.8.8:5000 max_fails=5 fail_timeout=50s; #for the first web server
        }

    server {
        listen       5000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://cuitccol.com;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        } 

Saya tidak tahu di mana salahnya. Bisakah Anda memberikan beberapa saran?
terima kasih banyak~
menunggu balasanmu

Saya menghadapi masalah ini untuk sementara waktu sekarang di setiap env, termasuk lokal. @darrachequesne Beri tahu saya jika saya perlu memberikan info lebih lanjut:

Saya memiliki node js dengan express dan kode di bawah ini, yang persis mengikuti bagian "Cara menggunakan" socket.io:

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ /* … */ });
server.listen(3000);

Dan saya telah menyiapkan klien yang sangat sederhana, hanya dengan kode di bawah ini, yang persis mengikuti bagian "Cara menggunakan" socket.io-client:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost:3000');
  socket.on('connect', function(){});
  socket.on('event', function(data){});
  socket.on('disconnect', function(){});
</script>

Meskipun berhasil terhubung, saya terus mendapatkan kesalahan yang sama:

Koneksi WebSocket ke 'ws:// localhost:3000/socket.io/?EIO=3&transport=websocket&sid=EWl2jAgb5dOGXwScAAAB ' gagal: Kesalahan selama jabat tangan WebSocket: Kode respons tak terduga: 400

Saat melihat konsol browser, kesalahan mengarah ke baris 112 dari websocket.js, yang menyatakan:

try {
    this.ws = this.usingBrowserWebSocket ? (protocols ? new WebSocket(uri, protocols) : new WebSocket(uri)) : new WebSocket(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }

Hargailah setiap ide...

@rafapetter Periksa apakah Anda belum memerlukan socket.io dua kali, saya memindahkan pengaturan socket.io di www/bin ke app.js dan secara tidak sengaja meninggalkan require socket.io di tempat sampah yang menyebabkan kesalahan ini.

Cukup tambahkan opsi {transports: ['websocket']} ke klien Socket.io.

terlihat seperti ini.

import io from 'socket.io-client'
const socket = io('http://localhost:5000', {transports: ['websocket']})

@spookyUnknownUser di server socket.io hanya diperlukan sekali.

@prapansak klien adalah file javascript sederhana, di dalam fungsi window.onload , impor ES6 tidak diizinkan. Tapi saya mengikuti bagian Cara Menggunakan:
<script src="/socket.io/socket.io.js"></script>

Dan saat memanggil soket seperti yang Anda sarankan:
const socket = io('http://localhost:5000', {transports: ['websocket']})

Saya mendapatkan kesalahan ini: Koneksi WebSocket ke 'ws:// localhost:1337/socket.io/?EIO=3&transport=websocket ' gagal: Header bingkai tidak valid

Terima kasih teman-teman, jika Anda punya ide lain, beri tahu saya dan saya akan mencobanya di sini.

Oke, akhirnya terpecahkan!

@spookyUnknownUser ide Anda mendorong saya untuk melihat lebih jauh untuk duplikasi. Dan ternyata, di server tepat setelah server.listen saya melakukan ini:

io.attach(server, {
  pingInterval: 40000,
  pingTimeout: 25000,
});

Yang menurut saya adalah memasang server untuk kedua kalinya. Jadi saya menghapusnya dan tepat di awal, ketika membutuhkan socket.io saya telah berubah menjadi:

var io = require('socket.io')(server, {
    'pingInterval': 40000,
    'pingTimeout': 25000
});

Sekarang, tidak ada masalah yang ditampilkan, dan semuanya berfungsi dengan baik.

Terima kasih sekali lagi atas wawasannya guys

Saya memiliki server soket saya di EBS (AWS Elastic beanstalk). Saya menghadapi masalah serupa di lingkungan produksi, tetapi dapat memperbaiki masalah tanpa bermigrasi ke penyeimbang beban aplikasi dan tanpa mengubah konfigurasi ngnix atau Apache.

Perubahan yang saya buat untuk mengatasi masalah ini: Alih-alih https, saya mengizinkan ssl di 443 ke port aplikasi saya dan membuka port 443 di grup keamanan saya

ebs_lb
ebs_sg

Bagi mereka yang menggunakan AWS: Gunakan Application Load Balancer dan pastikan Anda mengaktifkan kelengketan di Grup Target.

Ternyata ini terjadi sebentar -sebentar di server kami saat kelebihan beban dan dalam waktu penggunaan puncak.

Mengizinkan pengaturan default saat io.connect diaktifkan akan membuat permintaan XHR dan permintaan WS segera setelahnya (seperti yang disebutkan di atas). Semua permintaan XHR ini membebani server dan dengan demikian mengembalikan 400 kesalahan. Dengan menggunakan saran di atas untuk menambahkan transports: ['websocket']} ke kode klien, masalah telah teratasi. Akan memposting pembaruan jika 400 kesalahan tetap ada tetapi tampaknya solid untuk saat ini.

memiliki masalah yang sama, tidak ada perubahan sisi server yang disarankan di atas yang menyelesaikannya. Di sisi klien saya memiliki socket = io.connect(); dalam modul reaksi dan dapat mengetahui server apa yang saya sambungkan.
Memberikan parameter server untuk terhubung agak merepotkan tetapi tanpanya bagaimana saya bisa menentukan { reconnect: true, transports: ['websocket', 'polling'] } ? Kedengarannya seperti parameter opsional adalah #1 tetapi yang terpenting adalah #2

saya menambahkan ini di bawah, dan itu berhasil untuk saya.
lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}
https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Sayangnya saya memiliki masalah yang sama, bahkan dengan set header yang bagus .. Saya membuat stackoverflow dengan konfigurasi saya..

https://stackoverflow.com/questions/50431587/proxy-socket-io-fails-to-connect-with-nginx-node-on-docker

Perhatikan tanda kutip ganda di sini:

proxy_set_header Koneksi "upgrade";

Saya menerima pesan ini menggunakan tanda kutip tunggal tetapi menggunakan tanda kutip ganda menyelesaikannya.

Setelah sekitar satu jam pemecahan masalah, sepertinya ada beberapa konfigurasi tambahan yang diperlukan jika Anda menjalankan titik akhir sebagai kluster.

lihat disini

solusi tylercb bekerja untuk saya (NgInx). Terima kasih!

Kuncinya bagi kami adalah proxy_http_version 1.1; dalam solusi @tylercb

Saya telah mengedit konfigurasi NginX di server saya sesuai dengan banyak komentar itu.
Tapi itu bekerja sebagian. Pada awalnya, setelah server restart, itu bekerja dengan buruk. Sebagian besar dengan hard-refresh. Nanti berfungsi lebih baik, hanya terkadang perlu hard refresh.
Lokal dengan sails lift berfungsi
Tetapi jika saya menggunakan sails lift --prod secara lokal maka saya mendapatkan hal yang sama, soket itu tidak dapat terhubung dan 400 respons buruk. Tapi setelah beberapa kali mencoba kembali stabil.

Ini sepertinya masih belum terpecahkan - tidak ada solusi akhir yang ditemukan mengapa kami memiliki ini..

Saya menambahkan berbagai konfigurasi dalam dokumentasi: https://socket.io/docs/using-multiple-nodes/

Setiap saran untuk perbaikan dipersilahkan! => https://github.com/socketio/socket.io-website

Saya baru saja menghadapi masalah ini dan masih mendapatkan kesalahan bahkan menonaktifkan nginx saya. Akhirnya masalah karena express-status-monitor middleware pada express, ini membuat panggilan HTTP pada jabat tangan pertama (permintaan) WebSocket gagal.

Saya mencoba menonaktifkan middleware itu dan WebSocket berfungsi dengan baik

Ada beberapa alasan mengapa Anda akan mendapatkan 400 selama jabat tangan. Berikut ini adalah beberapa hal yang bisa dicoba

  1. Aktifkan firewall 443 di (ufw/Lainnya) serta pengaturan konsol (AWS/Google cloud/Lainnya)
  2. Jangan aktifkan TLS di server nodejs. Lakukan melalui nginx.
  3. Gunakan konfigurasi nginx berikut
    Catatan: Ini hanya berfungsi jika koneksi socket.io Anda sudah berfungsi tetapi menggunakan polling panjang alih-alih soket web. Tambahkan kode di bawah ini dan itu akan mulai menggunakan websocket.
        location /{
            proxy_pass http://127.0.0.1:5000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }

Mungkin itu akan membantu seseorang. Saya mendapatkan kesalahan ini ketika membuat dua instance socket.io di aplikasi saya. Saya menelepon io = socketio(server) twise dan mendapat error 400. Itu semacam kesalahan bodoh tapi... itu punya saya.

Pastikan Anda mengaktifkan sesi Sticky di penyeimbang beban aplikasi Anda (jangan gunakan penyeimbang beban klasik). Jika Anda tidak menggunakan sesi lengket, Anda mungkin akan mendapatkan 400 kesalahan secara acak.

Ini karena ketika upgrade dari polling ke websocket dicoba, mungkin saja load balancer menyeimbangkan permintaan upgrade ke server yang tidak pernah menemukan id socket ini dan memunculkan error 400. Lebih detail di sini: https://socket.io/docs/using-multiple-nodes/

Juga, jika Anda menggunakan pohon kacang elastis, tambahkan file websocket.config berikut di folder .ebextensions untuk mendukung peningkatan Nginx ke Websockets:

container_commands:
  enable_websockets:
    command: |
     sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
      ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

Saya mencari di Google karena saya mendapat masalah yang sama dan saya juga menggunakan nginx. Solusinya adalah dengan menambahkan bagian ini

proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;

ke dalam file konfigurasi nginx seperti yang disebutkan tylercb.

Jadi setidaknya ini berfungsi ketika Anda menggunakan nginx sebagai proxy terbalik, berikut penjelasannya

WebSocket proxying
To turn a connection between a client and server from HTTP/1.1 into WebSocket, the protocol switch mechanism available in HTTP/1.1 is used.

There is one subtlety however: since the “Upgrade” is a hop-by-hop header, it is not passed from a client to proxied server. With forward proxying, clients may use the CONNECT method to circumvent this issue. This does not work with reverse proxying however, since clients are not aware of any proxy servers, and special processing on a proxy server is required.

Since version 1.3.13, nginx implements special mode of operation that allows setting up a tunnel between a client and proxied server if the proxied server returned a response with the code 101 (Switching Protocols), and the client asked for a protocol switch via the “Upgrade” header in a request.

As noted above, hop-by-hop headers including “Upgrade” and “Connection” are not passed from a client to proxied server, therefore in order for the proxied server to know about the client’s intention to switch a protocol to WebSocket, these headers have to be passed explicitly:

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
A more sophisticated example in which a value of the “Connection” header field in a request to the proxied server depends on the presence of the “Upgrade” field in the client request header:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds. This timeout can be increased with the proxy_read_timeout directive. Alternatively, the proxied server can be configured to periodically send WebSocket ping frames to reset the timeout and check if the connection is still alive.

Ada berita tentang masalah ini? Saya mereferensikannya di sini https://stackoverflow.com/questions/49575350/websocket-connection-to-wss-error-during-websocket-handshake-unexpected-re

Banyak pengguna memiliki masalah ini karena konfigurasi nginx dan saat berada di server khusus Anda dapat memperbaikinya menggunakan ide di atas (konfigurasi nginx, dll) banyak pengguna tidak memiliki akses ke pengaturan ini, jadi akan sangat bagus untuk memiliki semacam perbaiki dari sockets.io tentang ini ...

Bukan siapa-siapa?

@deemeetree
Jika Anda menggunakan beberapa node yang menurut saya mungkin karena pesan kesalahan di situs Anda "ID sesi tidak diketahui", Anda harus melihat jawaban saya di StackOverflow (https://stackoverflow.com/a/53163917/6271092) .

Singkatnya, socket.io seperti yang mereka katakan di situs mereka (https://socket.io/docs/using-multiple-nodes/) ,

Jika Anda berencana untuk mendistribusikan beban koneksi di antara proses atau mesin yang berbeda, Anda harus memastikan bahwa permintaan yang terkait dengan id sesi tertentu terhubung ke proses yang membuatnya.

Ini karena transportasi tertentu seperti XHR Polling atau JSONP Polling yang mengandalkan penembakan beberapa permintaan selama masa pakai "soket". Gagal mengaktifkan penyeimbangan lengket akan menghasilkan yang ditakuti:

Error during WebSocket handshake: Unexpected response code: 400

Jadi Anda tidak dapat memiliki banyak soket yang berfungsi pada node yang berbeda. Konfigurasi ulang server Anda seperti yang tertulis. Dan untuk Express Anda, konfigurasikan port Anda seperti ini,
parseInt(your_port) + parseInt(process.env.NODE_APP_INSTANCE);

Semoga membantu.

Mendapat kesalahan yang sama secara langsung menghubungkan ke aplikasi saya yang dihosting di Windows Server 2008R2 (tanpa proxy, tanpa IIS). Hanya perangkat keras perantara bodoh di antaranya.

Saya menghadapi masalah yang sama di server Window 2016 tolong sebutkan perbaikan Anda. Terima kasih

Saya telah menghadapi masalah ini cukup lama. Jika ada yang punya informasi mohon bantuannya. Saya menggunakan server apache.

Ada petunjuk? Berfungsi dengan baik di dev tetapi masalah yang sama di SSL.

Menggunakan mode Cluster Node PM2: 4 x 1

Menggunakan proxy Apache, masih belum ada petunjuk

Bagi mereka yang menggunakan httpd2/Apache2, saya punya solusi yang tampaknya berfungsi:

    ProxyRequests Off
    <Location />
        ProxyPass http://127.0.0.1:1337/
        ProxyPassReverse http://127.0.0.1:1337/

        RewriteEngine On
        RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
        RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
        RewriteRule /socket.io/(.*) ws://127.0.0.1:1337/socket.io/$1 [P]
    </Location>

Hai @ZeldaZach apakah itu untuk file .htaccess? Terima kasih!

Konfigurasi ini ada di file sites-enabled/site.conf saya, tetapi seharusnya berfungsi di htaccess juga afaik

Yang bisa saya katakan, SSL adalah biang keladinya di sini :) nonaktifkan, mode SSL fleksibel cloudflare dan pindah ke mode LENGKAP (KETAT). Tentu ini akan memperbaiki masalah,
Jika tidak,

Gunakan localhost:port dalam konfigurasi proxy terbalik.

Bagi siapa pun di sini yang menggunakan Nginx dan React Express (MERN). Saya memiliki masalah yang sama karena saya hanya baris proxy_pass http://localhost:3000; . Saya menambahkan baris berikut berdasarkan jawaban @tylercb dari atas di utas ini:

"Memiliki masalah yang sama, aplikasi saya berada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}

Ini aslinya dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/ "

Jika ada yang masih mengalami masalah dalam menggunakan Nodejs + Express, mungkin masalah Anda adalah express-status-monitor , seperti yang disebutkan @slaveofcode . Sebagaimana tercantum dalam dokumentasi NPM -nya, modul ini menelurkan instance socket.io-nya sendiri, jadi Anda harus mengisi parameter websocket dengan instance socket.io utama Anda, serta parameter port:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

Ini adalah konfigurasi Apache saya, perhatikan bahwa ini menggunakan awalan jalur /ws/ , tetapi selain itu berfungsi dengan baik.

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/ws/socket.io         [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /ws/(.*)           ws://localhost:6001/$1 [P,L]
    ProxyPass /ws http://127.0.0.1:6001
    ProxyPassReverse /ws http://127.0.0.1:6001

Saat ini menghadapi masalah ini dengan mengekspos dasbor Linkerd (jala ​​layanan) untuk klaster EKS kami. kami menggunakan nginx, jadi tidak yakin bagaimana cara keluar dari yang itu saat ini.

@andrzj OMG man, Anda baru saja menyelamatkan saya.

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

berhasil.

Terima kasih atas bantuannya geng! Jika ada yang mencoba membuatnya berfungsi di sebelah lalu lintas HTTPS normal, sekarang ini berfungsi di Elastic Beanstalk untuk saya dengan pengaturan berikut:

  • Di Elastic Beanstalk: nginx dimatikan (untuk saat ini, belum sempat mencoba konfigurasi di atas).
  • Pada Pohon Kacang Elastis: Penyeimbang beban sebagai berikut:
  • Pada Node/Ekspres: const io = require('socket.io')(3030)
  • Pada klien cukup menamai let connection = io(https://www.myurl.com:3030)

Jika kalian masih mengalami masalah ini dan Anda telah menetapkan Asal yang diizinkan di server soket sebagai larik atau Asal alih-alih fungsi panggilan balik untuk memfilter asal akan menimbulkan kesalahan ini

Error during WebSocket handshake: Unexpected response code: 400

Dalam kasus saya memperbarui logika ini

io.origins(['https://foo.example.com:443']);

untuk ini

io.origins((origin, callback) => {  
     if (origin !== 'https://foo.example.com') {    
         return callback('origin not allowed', false);  
     }  
    callback(null, true);
});

Bekerja tanpa kesalahan yang dilemparkan.

Mendapatkan kesalahan yang sama, tetapi saya menambahkan konfigurasi untuk NGINX dan saya masih menerima 400 kesalahan jabat tangan yang sama. Namun saya, menggunakan Application Load Balancer di AWS dan saya mengaturnya ke Grup Target :80 dan pendengar 443 yang meneruskan ke Grup Target.

File konfigurasi NGINX:

`server {

listen [::]:80;
listen 80;

server_name <domain_name>;
access_log  /var/log/nginx/access.log;

location / {
    proxy_pass http://127.0.0.1:8000;
    include proxy_params;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

location /socket.io {
    include proxy_params;
    proxy_http_version 1.1;
    proxy_cache_bypass $http_upgrade;
    proxy_buffering off;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://127.0.0.1:8000;
}

}`

Dan di dalam file js saya, saya memiliki koneksi untuk socket.io yang terlihat seperti ini:
var socket = io()

Buat instans manual (tanpa instans app ekspres) dan tetapkan port yang berbeda

const io = require('socket.io')(3001, {
  path: '/',
  serveClient: false,
  // below are engine.IO options
  pingInterval: 10000,
  pingTimeout: 5000,
  cookie: false
})

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Saya kehilangan proxy_set_header Connection "upgrade";

Saya telah menghabiskan sepanjang malam untuk memecahkan masalah ini ketika saya mulai menggunakan https atau wss atau ssl . Itu selalu mengatakan connection stopped before establish dengan kode kesalahan 400 .

Beberapa menit yang lalu, saya menemukan solusi untuk itu:

0. Cloudflare

Di tab SSL/TLS:

  • Jika Anda memiliki cert atau SSL atau HTTPS Anda sendiri : setel ke Full . (123 langkah berikut mengasumsikan Anda memiliki sertifikasi https Anda sendiri)

  • Jika Anda hanya memiliki http server : set ke Flexible . (Cloudflare akan menambahkan https atau ssl ke situs web Anda secara otomatis.)

  • Setelah itu, buka tab DNS, setel Proxied .

Jika Anda tidak yakin dengan apa yang Anda lakukan, buka saja tab DNS, setel DNS only

1. Pastikan Anda memiliki konfigurasi proxy yang benar.

server {
    listen 80;
    server_name ai-tools-online.xyz;
    return 301 https://ai-tools-online.xyz$request_uri;
}

server {
    listen 443 ssl http2;

    ssl_certificate       /data/v2ray.crt;
    ssl_certificate_key   /data/v2ray.key;
    ssl_protocols         TLSv1.2 TLSv1.3;
    #ssl_ciphers           3DES:RSA+3DES:!MD5;
    server_name ai-tools-online.xyz;

    location / {
        proxy_pass http://127.0.0.1:5000;
    }

    location /socket.io {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:5000/socket.io;
    }
}

ai-tools-online.xyz adalah domain Anda, http://127.0.0.1:5000 adalah server soket Anda.

2. Pastikan server Anda Cross-Origin Controls disetel ke '*' untuk mengizinkan Cross-Origin Access

Untuk flask-socketio , adalah menggunakan flask_socketio.SocketIO(app, cors_allowed_origins = '*')

3. Anda harus memulai ulang nginx agar konfigurasi baru berfungsi

systemctl restart nginx

4. Untuk lebih jelasnya tentang cara mengatur caddy , lihat tautan berikut:

https://github.com/yingshaoxo/Web-Math-Chat#reverse -proxy-configuration-for-https
https://caddy.community/t/using-caddy-0-9-1-with-socket-io-and-flask-socket-io/508/6
https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/

Saya mencari di Google karena saya mendapat masalah yang sama dan saya juga menggunakan nginx. Solusinya adalah dengan menambahkan bagian ini

proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;

ke dalam file konfigurasi nginx seperti yang disebutkan tylercb.

bekerja untuk saya dengan baik terima kasih!

Jika Anda menggunakan Elastic Beanstalk seperti saya untuk membuat node-server,
Saat membuat lingkungan, kami diminta dalam konfigurasi untuk menggunakan Server Proksi mana. Di mana nginx sudah diisi sebelumnya atau disetel default.
Saya menyetel server proxy itu ke none dan kemudian melanjutkan membuat server saya. Saya menggunakan Elastic Beanstalk untuk membuat server node di mana server proxy saya secara default disetel ke nginx.
Karena ini adalah kesalahan dalam mengkonfigurasi server proxy. Setelah menghapus server proxy apa pun, kesalahannya hilang.

Telah googling selama berjam-jam dan tidak ada solusi di atas yang diterapkan pada kami karena kami baru saja memiliki aplikasi nodejs dan tidak ada nginx.

Cara kami menyelesaikan ini hanya dengan menonaktifkan nginx dari wadah -> pengaturan penyeimbang beban untuk meneruskan semua lalu lintas langsung ke node.js.

Telah googling selama berjam-jam dan tidak ada solusi di atas yang diterapkan pada kami karena kami baru saja memiliki aplikasi nodejs dan tidak ada nginx.

Cara kami menyelesaikan ini hanya dengan menonaktifkan nginx dari wadah -> pengaturan penyeimbang beban untuk meneruskan semua lalu lintas langsung ke node.js.

bagaimana Anda melakukannya?

Jika Anda pergi ke Configuration > Load balancer Anda dapat menemukan drop-down untuk server proxy, Anda dapat menggunakan nginx, Apache atau mengaturnya ke "none" untuk melewati semua koneksi ke aplikasi node.

Ini hanya muncul jika Anda membuat lingkungan dengan penyeimbang beban, tidak berfungsi untuk satu instance

Sunting: komentar asli saya dirujuk ke Elastic Beanstalk

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Jadi terima kasih.

Dokumen ini untuk mereka yang menggunakan server laravel-echo & Nginx & socket.io & Redis-server dengan server terpisah antara proyek klien dan Redis-server.

Silakan ikuti tautan di sini .

Terima kasih

Saya memiliki masalah ini. Memperbarui konfigurasi nginx saya tidak membantu, tetapi solusi @santhosh77h memperbaikinya untuk saya. Untuk beberapa alasan melewatkan array asal yang diizinkan tidak berfungsi, tetapi menggunakan panggilan balik berfungsi.

Saya menggunakan soket web Nest.js (hanya pembungkus di sekitar Socket.io) dan menambahkan yang berikut ke gateway saya:

afterInit(server: Server): any {
    const origins = getOrigins(); // returns an array of origin strings
    server.origins((origin, cb) => {
      if (origins.includes(origin)) {
        cb(null, true)
      } else {
        cb('Invalid origin', false);
      }
    });
  }

Saya memiliki masalah yang sama dengan NUXT.js dengan Node.js / Express yang berjalan di AWS Elastic Beanstalk (proksi Nginx) . Butuh beberapa hari bagi saya untuk memahami hal ini. Saya akan membagikan poin bacaan saya. Mungkin seseorang akan merasa berguna.

Lingkungan saya menggunakan Application Load Balancer dengan dua port 80 untuk https dan 443 untuk https dengan SSL.

Dalam kombinasi jawaban dari atas, terima kasih banyak kepada @tylercb dan dokumentasi resmi dari AWS dan dokumentasi socket.io Saya membuat file konfigurasi Nginx yang tampaknya memperbaiki masalah.

Saya akan segera menguraikan langkah-langkahnya:

Dalam file Node index.js saya:

const express = require('express')
const app = express()
const server = http.createServer(app)
const io = require('socket.io')(server)
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 8081

Di front-end (salah satu komponen saya):
import io from 'socket.io-client';
di data Vue saya():
socket: io()

Akhirnya, Di root aplikasi, saya membuat folder .ebextensions
Tepat di dalam saya membuat file 01-proxy.config dengan konten berikut:

files:
  /etc/nginx/conf.d/01-proxy.conf:
     mode: "000644"
     owner: root
     group: root
     content: |
        upstream nodejs {
          server 127.0.0.1:8081;
          keepalive 256;
        }
        server {
          listen 8080;
          server_name yourdomain.com;

          if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
          }
          access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
          access_log  /var/log/nginx/access.log  main;

          location / {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;

              proxy_pass http://nodejs;

              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
          }

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          location /static {
              alias /var/app/current/static;
          }

        }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

Bacaan tambahan:
konfigurasi nginx

Itu dia. Cukup panjang. Saya minta maaf dan semoga berhasil.

bekerja untuk saya di bawah ini, perubahan di ubuntu dan server ngnix untuk angular .net core

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Jika ada yang masih mengalami masalah dalam menggunakan Nodejs + Express, mungkin masalah Anda adalah express-status-monitor , seperti yang disebutkan @slaveofcode . Sebagaimana tercantum dalam dokumentasi NPM -nya, modul ini menelurkan instance socket.io-nya sendiri, jadi Anda harus mengisi parameter websocket dengan instance socket.io utama Anda, serta parameter port:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

Info ini membantu saya

Pastikan koneksi socket.io Anda tidak melalui Amazon Load Balancer. Atau jika demikian, lakukan ini: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

Jika orang lain mengalami masalah ini menggunakan penyeimbang beban AWS, Artikel yang disebutkan tidak mengatakan bahwa mungkin juga untuk menggunakan SSL sebagai protokol penyeimbang beban dan tetap menggunakan sertifikat Anda pada konfigurasi ini, di luar tingkat server aplikasi Anda.

Beginilah penampilan pendengar LB saya

image

Bekerja dengan baik untuk saya!

Punya masalah yang sama, aplikasi saya ada di belakang nginx. Membuat perubahan ini pada konfigurasi Nginx saya menghapus kesalahan.

lokasi / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header Tingkatkan $http_upgrade;
proxy_set_header Koneksi "upgrade";
proxy_set_header Host $host;
}

Ini berasal dari https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

Ya. Ini membantu dan bekerja untuk saya juga.

Pastikan koneksi socket.io Anda tidak melalui Amazon Load Balancer. Atau jika demikian, lakukan ini: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

Jika orang lain mengalami masalah ini menggunakan penyeimbang beban AWS, Artikel yang disebutkan tidak mengatakan bahwa mungkin juga untuk menggunakan SSL sebagai protokol penyeimbang beban dan tetap menggunakan sertifikat Anda pada konfigurasi ini, di luar tingkat server aplikasi Anda.

Beginilah penampilan pendengar LB saya

image

Bekerja dengan baik untuk saya!

Bagus, itu berhasil.

Pastikan koneksi socket.io Anda tidak melalui Amazon Load Balancer. Atau jika demikian, lakukan ini: http://blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

Jika orang lain mengalami masalah ini menggunakan penyeimbang beban AWS, Artikel yang disebutkan tidak mengatakan bahwa mungkin juga untuk menggunakan SSL sebagai protokol penyeimbang beban dan tetap menggunakan sertifikat Anda pada konfigurasi ini, di luar tingkat server aplikasi Anda.

Beginilah penampilan pendengar LB saya

image

Bekerja dengan baik untuk saya!

dalam hal ini aplikasi Anda berjalan pada 80?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat