gpt4 book ai didi

ssl - 生产中的 Rails 5 action cable cable SSL - WebSocket 连接失败 : Error during WebSocket handshake: Unexpected response 301

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:07 24 4
gpt4 key购买 nike

我正在尝试使用 rails 5.0.0beta3 和 websockets 运行一个应用程序。我在本地进行了所有开发工作,但在生产中,我在浏览器的控制台中收到了此响应:

“WebSocket 连接失败:WebSocket 握手期间出错:意外响应 301”

这是我的 nginx 配置文件。

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;
}

我正在为我的应用程序服务器运行 thin 并为 websockets 服务器运行 puma 以及本地的 redis。我正在尝试在此处关注 Action 电缆示例应用程序:https://github.com/rails/actioncable-examples .

我正在这样启动我的 puma 服务器:bundle exec puma -p 28080 cable/config.ru

config 中使用此 puma.rb:

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"

这是我的 production.rb 配置的相关部分:

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

这是我的 development.rb 配置:

config.action_cable.url = "ws://localhost:28080"
config.action_cable.allowed_request_origins = ['http://localhost:3000']
config.action_cable.disable_request_forgery_protection = true

在我的应用中,我这样启动我的电缆:

@App = {}
App.cable = ActionCable.createConsumer()

任何建议都会很棒。我注意到这里有人:RoR 5.0.0 ActionCable wss WebSocket handshake: Unexpected response code: 301能够通过使用单独的域来解决这个问题。这就是我接下来可能会尝试的方法,但我希望它不会变成那样。

在此先感谢您的帮助!我真的很感激。

最佳答案

问题很可能是 Rails 强制您连接到 ssl。由于 nginx 终止了 ssl 连接,您需要设置 X-Forwarded-Proto header 让 Rails 知道一切正常。这是适合我的完整配置:

  location /cable {
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}

关于ssl - 生产中的 Rails 5 action cable cable SSL - WebSocket 连接失败 : Error during WebSocket handshake: Unexpected response 301,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35974592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com