Tôi đang cố gắng chạy một ứng dụng có đường ray 5.0.0beta3 và websockets. Tôi có tất cả mọi thứ làm việc tại địa phương về phát triển nhưng trong sản xuất, tôi nhận được phản ứng này trong giao diện điều khiển của trình duyệt của tôi:Rails 5 cáp hành động SSL trong sản xuất - Kết nối WebSocket không thành công: Lỗi trong quá trình bắt tay WebSocket: Phản hồi không mong muốn 301
"Kết nối WebSocket thất bại: Lỗi trong WebSocket handshake: phản ứng bất ngờ 301"
Đây là một conf nginx tôi.
upstream app {
server unix:/home/dev/workspace/my_app/tmp/sockets/thin.0.sock max_fails=1 fail_timeout=15s;
server unix:/home/dev/workspace/my_app/tmp/sockets/thin.1.sock max_fails=1 fail_timeout=15s;
}
server {
listen 443 ssl;
server_name www.my_app.co;
root /home/dev/workspace/my_app/public;
try_files $uri/index.html $uri @app;
location @app {
proxy_next_upstream error timeout http_502 http_503;
proxy_read_timeout 60s;
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-FORWARDED-PROTO $scheme;
proxy_redirect off;
}
location /websocket/ {
proxy_pass http://localhost:28080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
ssl on;
ssl_certificate /ssl/www.my_app.co.crt;
ssl_certificate_key /ssl/www.my_app.co.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
}
Tôi đang chạy mỏng cho máy chủ ứng dụng của mình và chạy puma cho máy chủ webs cùng với làm lại cục bộ. Tôi đang cố gắng làm theo ứng dụng ví dụ về cáp hành động tại đây: https://github.com/rails/actioncable-examples.
Tôi bắt đầu máy chủ của tôi puma như thế này: bundle exec puma -p 28080 cable/config.ru
Với điều này puma.rb
trong config
:
workers 1
threads 1, 10
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
Dưới đây là những phần liên quan của production.rb
cấu hình của tôi:
config.action_cable.allowed_request_origins = ['https://www.chatben.co', 'https://45.55.192.195']
config.action_cable.url = "wss://www.chatben.co/websocket"
config.force_ssl = false
Đây là cấu hình development.rb
của tôi:
config.action_cable.url = "ws://localhost:28080"
config.action_cable.allowed_request_origins = ['http://localhost:3000']
config.action_cable.disable_request_forgery_protection = true
Trong ứng dụng của tôi, tôi bắt đầu cáp của tôi như thế này:
@App = {}
App.cable = ActionCable.createConsumer()
Mọi góp ý sẽ được awesome. Tôi đã nhận thấy ai đó ở đây: RoR 5.0.0 ActionCable wss WebSocket handshake: Unexpected response code: 301 có thể giải quyết vấn đề này bằng cách sử dụng tên miền riêng biệt. Đó là những gì tôi có thể sẽ cố gắng tiếp theo nhưng tôi đã hy vọng nó sẽ không đến đó.
Cảm ơn bạn đã giúp đỡ! Tôi rất trân trọng điều này.
Bạn vẫn nhận được 301? –