将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的这里的 - 我错过什么或得到错误的?
我在一个月后回到了这里,发现这些问题与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。
你能当你在routes.rb中挂载时,保持你的问题中列出的nginx.conf类型相同? (2) –
@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 )
这是否会发生在60秒? – Anatoly
@Anoly它在60秒内打开/关闭吗?它根本不连接到websocket。 – Michael
我不确定,我不认为你的websockets服务器应该听80. Il NGINX文档,它听8020. https://www.nginx.com/blog/websocket-nginx/ –