2015-05-11 22 views
11

Tôi là thương hiệu mới với những thứ như Meteor.JS và đã tự hỏi về lỗi này. Tôi bắt đầu dự án thử nghiệm (với nút bấm mét) và nó hoạt động, nhưng sau đó tôi đi vào giao diện điều khiển và xem WebSocket connection to 'ws://shibe.ninja/sockjs/243/5gtde_n9/websocket' failed: Error during WebSocket handshake: Unexpected response code: 400 Tôi không biết làm thế nào để sửa chữa nó. Cảm ơnKết nối Meteor WebSocket với 'ws: //.../websocket' không thành công: Lỗi trong quá trình bắt tay WebSocket: Mã phản hồi không mong muốn: 400

+0

Tôi nhấn nút này khi ở trong khách sạn và phải kết nối qua proxy của họ, giải pháp của tôi là [sử dụng điện thoại di động của tôi làm điểm truy cập WiFi] (https://stackoverflow.com/a/45334998/327074) – icc97

Trả lời

3

tôi tình cờ gặp vấn đề này bản thân mình, nhưng Tôi đã có tiêu đề proxy của tôi đặt đúng và nó vẫn không làm việc. Nhưng dường như Cloudflare đang gây ra sự cố. Đây là một bài viết tuyệt vời về đề tài này: https://meteorhacks.com/cloudflare-meets-meteor

Theo như tôi đã tìm thấy, có ba giải pháp:

Lựa chọn 1: Sử dụng CloudFlare doanh nghiệp, hỗ trợ ổ cắm.

Tùy chọn 2: Tắt Meteor WebSockets, điều này sẽ ảnh hưởng đến hiệu suất của bạn khi nó quay trở lại để sử dụng sock.js làm thay thế. Để làm điều này, chỉ cần thiết lập môi trường sao băng của bạn như thế này:

export DISABLE_WEBSOCKETS=1 

Lựa chọn 3: Trong CloudFlare, tạo một DDP subdomain cho WebSocket (ddp.yourdomain.com), sau đó vô hiệu hóa CloudFlare trên mới tên miền phụ. Sau đó thiết lập môi trường sao băng của bạn như thế này:

export DDP_DEFAULT_CONNECTION_URL=http://ddp.example.com 

Sau này cấu hình nginx của tôi cần một số điều chỉnh, vì điều này đã trở thành thiết lập gốc (CORS). Đây là cấu hình nginx mới của tôi:

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

server { 
    listen 80 proxy_protocol; 
    listen [::]:80 proxy_protocol; 

    server_name mydomain.com ddp.mydomain.com; 

    ## This allows the CORS setup to work 
    add_header Access-Control-Allow-Origin 'http://example.com'; 

    ## This hides the CORS setup from the Meteor server 
    ## Without this the header is added twice, not sure why? 
    proxy_hide_header Access-Control-Allow-Origin; 

    ## Idealy the two options above should be disabeled, 
    ## Then use this one instead, but that caused issues in my setup. 
    # proxy_set_header Access-Control-Allow-Origin 'http://example.com'; 

    location/{ 
    proxy_pass http://localhost:3000; 
    proxy_set_header Host $host; # pass the host header 
    proxy_set_header Upgrade $http_upgrade; # allow websockets 
    proxy_set_header Connection $connection_upgrade; 
    proxy_set_header X-Real-IP $remote_addr; # Preserve client IP 
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_http_version 1.1; 

    # Meteor browser cache settings (the root path should not be cached!) 
    if ($uri != '/') { 
     expires 30d; 
    } 
    } 
} 

Cuối cùng, hãy nhớ khởi động lại nginx.

6

Có thể hơi trễ nhưng trong trường hợp bạn vẫn bị mắc kẹt trong trường hợp này. Tôi gặp vấn đề tương tự khi triển khai ứng dụng và sử dụng nginx làm proxy.

location/{ 
    proxy_pass http://127.0.0.1:3000; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "Upgrade"; 
} 

Kiểm tra cũng các tài liệu nginx ở đây: http://nginx.com/blog/websocket-nginx/

Các vấn đề liên quan