将nginx配置为代理瘦和Rails ActionCable

问题描述:

我正在尝试使用ActionCable(主要是复制DHH example)并尝试使其在具有瘦(在端口8443上)和nginx的Ubuntu服务器上运行。这一切都在本地正常工作,但是,当我尝试将其代理服务器上的活动服务器时,我得到此错误响应:failed: Error during WebSocket handshake: Unexpected response code: 301将nginx配置为代理瘦和Rails ActionCable

这里是我的我的nginx的配置的相关位:

server { 
    listen 80; 

    server_name _not_; 
    root /home/ubuntu/www/; 
} 

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

upstream websocket { 
    server 127.0.0.1:8443; 
} 

server { 

    listen 80; 

    ... 

    location /websocket/ { 
    proxy_pass http://127.0.0.1:8443; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; 
    proxy_redirect off; 
    } 

    ... 

} 

我有点出我的联赛nginx的这里的 - 我错过什么或得到错误的?

+0

这是否会发生在60秒? – Anatoly

+0

@Anoly它在60秒内打开/关闭吗?它根本不连接到websocket。 – Michael

+0

我不确定,我不认为你的websockets服务器应该听80. Il NGINX文档,它听8020. https://www.nginx.com/blog/websocket-nginx/ –

我在一个月后回到了这里,发现这些问题与nginx配置不同,但与瘦相关。我做了三件事情:

(1)配置薄使用the Faye adapter

# config.ru 

require 'faye' 
Faye::WebSocket.load_adapter('thin') 

require ::File.expand_path('../config/environment', __FILE__) 

use Faye::RackAdapter, mount: '/faye', timeout: 25 

run Rails.application 

(2)切换到routes.rb安装ActionCable,而不是试图运行它as a standalone

#routes.rb 

MyAwesomeApp::Application.routes.draw do 

    ... 

    match "/websocket", to: ActionCable.server, via: [:get, :post] 

end 

(3)回到我正常的nginx的配置,WebSockets的上游化薄(如Web服务器的功能:

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

upstream thin { 
    server 127.0.0.1:3000; 
} 

server { 
    ... 

    location /websocket { 
    proxy_pass http://thin; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; } 

    ... 
} 

所以,我的道歉nginx的,我免除你 - 似乎问题被主要涉及薄


编辑:我已经添加了旧nginx的配置我在路由安装后回到另外值得注意的,对于那些使用SSL是。将打破安全wss WebSocket。相反,您应该在控制器级别as recommended here上执行force_ssl,并配置nginx以将任何HTTP路由重写为HTTPS。

+0

你能当你在routes.rb中挂载时,保持你的问题中列出的nginx.conf类型相同? (2) –

+1

@DavidKuhta编辑答案,包括我返回的nginx配置,并给出一个SSL提示,导致我的问题。 – Michael

此线程对我非常有帮助,但我选择将AC过程分隔成单独的puma实例,以便可以分别配置工作人员等。后来我从nginx添加了SSL代理,以确保使用最新的密码等。这可以避免rails/puma/AC不必担心SSL与非SSL;服务器实例内的所有内容都是非SSL的。

这里是我的服务器节AC:从这个github上issue

server { 
    listen 881 ssl; 


    ssl_certificate /etc/nginx/ssl/server.crt; 
    ssl_certificate_key /etc/nginx/ssl/server.key; 

    ssl_prefer_server_ciphers on; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; 


    server_name localhost; 
    location/{ 
     proxy_pass http://cable; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
    } 
} 

注意:您需要确保您的AC配置可以让你的域源:

#config/initializers/cable.rb 
ActionCable.server.config.allowed_request_origins = %w(http://my-domain.com )