2016-01-27 21 views
6

Xin chào. Tôi đang cố gắng phân phối một cuộc trò chuyện đơn giản bằng cách sử dụng phiên bản beta 5.0.0 (với puma) làm việc trên chế độ sản xuất (trong localhost không có vấn đề gì) .RoR 5.0.0 ActionCable wss WebSocket handshake: Mã phản hồi không mong muốn: 301

Đây là Nginx cấu hình của tôi:

upstream websocket { 
    server 127.0.0.1:28080; 
} 


server { 

    listen 443; 
    server_name mydomain; 
    ssl_certificate ***/server.crt; 
    ssl_certificate_key ***/server.key; 
    ssl on; 
    ssl_session_cache builtin:1000 shared:SSL:10m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 
HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
    ssl_prefer_server_ciphers on; 
    access_log /var/log/nginx/jenkins.access.log; 

    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; 
     proxy_pass http://localhost:3000; 
     proxy_read_timeout 90; 

     proxy_redirect http://localhost:3000 https://mydomain; 


    location /cable/{ 
     proxy_pass   http://websocket/; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
     break; 
    } 

    } 

Đây là config/redis/cable.yml

sản xuất: url: redis: // localhost: 6379/1

phát triển: url: redis: // localhost: 6379/2

kiểm tra: url: redis: // localhost: 6379/3

config/môi trường/production.rb

# Action Cable endpoint configuration 
    config.action_cable.url = 'wss://mydomain/cable' 
    # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] 

    # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
    config.force_ssl = false 

Và đây là lỗi tôi nhận:

ứng dụng - [...]. Js: 27 Kết nối WebSocket với 'wss: // mydomain/cable' không thành công: Lỗi trong khi bắt tay WebSocket: Mã phản hồi không mong muốn: 301

Bất kỳ mẹo nào? :) Cảm ơn

Trả lời

2

Tôi giải quyết thêm thêm hành khách phusion.

nginx cấu hình bây giờ là:

server{ 
listen 80; 
passenger_enabled on; 
passenger_app_env production; 
passenger_ruby /../ruby-2.3.0/ruby; 
root /path to application/public; 
client_max_body_size 4G; 
keepalive_timeout 10; 
[...] 

    location /cable{ 
     passenger_app_group_name websocket; 
     passenger_force_max_concurrent_requests_per_process 0; 
    } 
} 

Bạn phải loại bỏ thư mục mặc định config/redis/cable.yml và di chuyển file đó vào/config chỉ.

Đối với SSL chỉ cần kích hoạt tùy chọn ssl mặc định và nó sẽ hoạt động .-)

Cảm ơn tất cả mọi người đã giúp đỡ

0

URI websocket của bạn là /cable/ và không phải /cable, vì vậy sau này sẽ nhấn khối location /. Hãy thử:

location /cable { 
    rewrite ^/cable$/break; 
    rewrite ^/cable(.*)$ $1 break; 
    proxy_pass   http://websocket; 
    ... 
} 

Ngoài ra, không chắc chắn bạn cần break; trong đó. Tôi cho rằng thiếu } giữa hai khối location chỉ là lỗi đánh máy trong câu hỏi.

EDIT1: Đã thêm rewrite để khôi phục bản đồ ngược dòng chính xác.

EDIT2: Alternative giải pháp là phải viết lại một cách rõ ràng /cable để /cable/ như thế này:

location = /cable { rewrite^/cable/ last; } 
location /cable/ { 
    proxy_pass http://websocket/; 
    ... 
} 
+0

thay đổi địa điểm/cáp/{...} để/cáp trả lại cho tôi "kết nối WebSocket để ' wss: // mydomain/cable 'không thành công: Lỗi khi bắt tay WebSocket: Mã phản hồi không mong muốn: 502 " –

+0

Cổng lỗi - đảm bảo bạn có dịch vụ đang chạy trên cổng 28080 –

+0

Tường lửa đang chặn cổng đó, bây giờ tôi đã chuyển đổi màu đỏ trên 4443 và "upstream websocket" {127.0.0.1:4443} -> Lỗi trong quá trình bắt tay WebSocket: Mã phản hồi không mong muốn: 404 Ít nhất mã lỗi của tôi đang thay đổi xd –

0

tôi dành gần 5 giờ ngày hôm qua cố gắng giải quyết vấn đề cụ thể này. Tôi đã kết thúc bằng cách sử dụng một tên miền riêng biệt cho các kết nối websocket gọi là ws.example.com như tất cả mọi thứ khác dẫn đến một 301 redirect.

Đây là tệp nginx.conf của tôi. Tôi đã xóa các phần SSL nhưng bạn chỉ có thể chèn phần của riêng mình. Lưu ý rằng bạn cần nginx 1.4+ vì mọi thứ trước phiên bản này không hỗ trợ proxy websocket.

upstream socket { 
    server unix:/mysocket fail_timeout=0; 
} 

upstream websocket { 
    server 127.0.0.1:28080; 
} 

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

server { 
    listen  443 ssl; 
    server_name ws.example.com; 
    access_log off; 

    # SSL configs here 

    location/{ 
     proxy_pass http://websocket/; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

server { 
    listen  443 ssl; 
    server_name example.com; 

    # SSL configs here 

    location @app { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://socket; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

Tôi đọc ở đâu đó rằng allowed_request_origins đã không làm việc như mong đợi vì vậy tôi đã đi con đường an toàn (cho đến khi lỗi được cố định) và bật kiểm tra của hoàn toàn sử dụng ActionCable.server.config.disable_request_forgery_protection = true.

Đây là tệp cable.ru của tôi để bắt đầu cáp hành động.

require ::File.expand_path('../../config/environment', __FILE__) 
Rails.application.eager_load! 

require 'action_cable/process/logging' 

Rails.logger.level = 0 
ActionCable.server.config.disable_request_forgery_protection = true 

run ActionCable.server 

Tôi cũng đang sử dụng phiên bản đường ray mới nhất từ ​​Github.

gem "rails", github: "rails/rails" 
Các vấn đề liên quan