Thin + Nginx + Websockets 配置 |导轨

2023-12-28

我有一个带有 websocket-rails gem 的 Ruby on Rails 3.2 应用程序,在 nginx 反向代理后面的瘦网络服务器中运行。

除了 nginx 反向代理外,一切正常。通过删除 nginx 反向代理,websocket 通信就可以正常工作了。 (开发和生产)。使用 nginx 作为 websocket 的反向代理是问题的根源。

Nginx 版本1.3.13及以上版本应该能够支持 websocket 代理。基于文档here http://nginx.org/en/docs/http/websocket.html and here https://stackoverflow.com/questions/2419346/can-nginx-be-used-as-a-reverse-proxy-for-a-backend-websocket-server/14976998#14976998我创建了以下 nginx 配置:

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

upstream ravecy {
  server localhost:3000;
  server localhost:3001;
}

server {
  listen 80;
  server_name test.ravecy.com;

  root /var/www/ravecy.com/public;

  location / {
    try_files $uri @ravecy;
  }

  location @ravecy {
    proxy_pass http://ravecy;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    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_redirect off;
  }
}

然而遗憾的是,这不起作用。我不完全知道为什么,但在我看来,nginx 没有将我的 websocket 连接尝试作为 websocket 连接处理,而是将常规 HTTP 连接处理,如日志所示:

==> production.log <==
Started GET "/chat" for 82.170.121.62 at 2013-04-10 12:20:12 +0200
Processing by ApplicationController#chat as HTML
  Rendered application/chat.html.erb within layouts/frontend (0.2ms)
  Rendered layouts/frontend/_navbar.html.erb (6.3ms)
  Rendered layouts/shared/_alert.html.erb (0.0ms)
  Rendered layouts/frontend/_facebook_sdk.html.erb (0.0ms)
Completed 200 OK in 9ms (Views: 8.4ms | ActiveRecord: 0.4ms)
Started GET "/websocket" for 82.170.121.62 at 2013-04-10 12:20:12 +0200

==> websocket_rails.log <==
I [2013-04-10 12:20:12.744] [ConnectionManager] Connection opened: #<Connnection::47398780>

I [2013-04-10 12:20:12.745] [Dispatcher] Started Event: client_connected
I [2013-04-10 12:20:12.745] [Dispatcher] Name: client_connected
I [2013-04-10 12:20:12.745] [Dispatcher] Data: {"connection_id"=>47398780}
I [2013-04-10 12:20:12.745] [Dispatcher] Connection: #<Connnection::47398780>

I [2013-04-10 12:20:12.747] [Dispatcher] Event client_connected Finished in 0.001960819 seconds


==> /var/log/nginx/access.log <==
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /chat HTTP/1.1" 200 854 "http://test.ravecy.com/posts" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17"
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /assets/frontend-6ad91089203a6026624ce015c2800492.css HTTP/1.1" 304 0 "http://test.ravecy.com/chat" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17"
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /assets/frontend-98fa493fc9f482c0d44b31bda5a89135.js HTTP/1.1" 304 0 "http://test.ravecy.com/chat" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17"

==> websocket_rails.log <==
I [2013-04-10 12:20:12.832] [ConnectionManager] Connection closed: #<Connnection::47398780>

I [2013-04-10 12:20:12.832] [Dispatcher] Started Event: client_disconnected
I [2013-04-10 12:20:12.832] [Dispatcher] Name: client_disconnected
I [2013-04-10 12:20:12.832] [Dispatcher] Data: nil
I [2013-04-10 12:20:12.832] [Dispatcher] Connection: #<Connnection::47398780>

I [2013-04-10 12:20:12.833] [Dispatcher] Event client_disconnected Finished in 0.000293462 seconds


==> /var/log/nginx/access.log <==
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /websocket HTTP/1.1" 200 398 "-" "-"

请注意,连接会在 100 毫秒内关闭,即使它应该保持活动状态。

进一步配置: nginx.conf:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

瘦配置:

---
chdir: /var/www/ravecy.com
environment: production
address: 127.0.0.1
port: 3000
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100
require: []
wait: 30
servers: 2
daemonize: true

nginx 版本: nginx/1.3.15 实时示例网址:http://test.ravecy.com/chat http://test.ravecy.com/chat

另请注意:执行时new WebSocket("ws://test.ravecy.com/websocket")在JS控制台中, 浏览器提示“意外响应代码:200”。

我非常渴望完成这项工作,并且不再知道自己应该做什么。

NGINX 的 Telnet 结果:

GET /websocket HTTP/1.1
Host: test.ravecy.com
Connection: Upgrade
Upgrade: WebSocket

HTTP/1.1 200 OK
Server: nginx/1.3.15
Date: Sat, 13 Apr 2013 19:50:35 GMT
Content-Type: text/json
Transfer-Encoding: chunked
Connection: keep-alive

152
[["client_connected",{"id":null,"channel":null,"data":{"connection_id":37160040},"success":null,"result":null,"server_token":null}]][["users",{"id":null,"channel":null,"data":[],"success":null,"result":null,"server_token":null}]][["client_connected",{"id":null,"channel":null,"data":{},"success":false,"result":null,"server_token":null}]]

Telnet结果直接瘦:

GET /websocket HTTP/1.1
Host: test.ravecy.com
Connection: Upgrade
Upgrade: WebSocket

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: 
WebSocket-Location: ws://test.ravecy.com/websocket

[["client_connected",{"id":null,"channel":null,"data":{"connection_id":37489460},"success":null,"result":null,"server_token":null}]][["users",{"id":null,"channel":null,"data":[],"success":null,"result":null,"server_token":null}]][["client_connected",{"id":null,"channel":null,"data":{},"success":false,"result":null,"server_token":null}]]

显然,这是出了问题。但为什么?


根据 telnet 结果,我注意到我使用了带有大写“U”的“Upgrade”。使用“升级”而不是“升级”解决了我遇到的所有问题......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thin + Nginx + Websockets 配置 |导轨 的相关文章

  • NGINX 返回 405 不允许使用 POST 方法

    我有这个default conf server listen 443 ssl root etc nginx json server name myserver com ssl certificate etc ssl certs server
  • 如何全局忽略 UTF-8 字符串中的无效字节序列?

    我有一个 Rails 应用程序从 Rails 版本 1 以来的迁移中幸存下来 我想忽略all其上的无效字节序列 以保持向后兼容性 我不知道输入编码 示例 gt Men xFC split n ArgumentError invalid by
  • 使用 RSpec 测试导轨金属/机架?

    假设我有一个名为 Preview 的 Metal 类 如何使用 RSpec 进行测试 当我尝试时 require spec helper describe Preview do it should return the posted con
  • Spring WebSocket 简单示例 - java.lang.IllegalStateException:意外使用调度程序

    我正在尝试在 Spring 中实现一个不使用 STOMP 的 WebSocket 服务器 请参考这篇文章 http www devglan com spring boot spring websocket integration examp
  • 如何加载 UrlHelper 和 Rails 中的路线?

    我想包括路线和link toPORO 中的方法 在控制台中测试这个时 我遇到了这个 如果我在没有路由助手的情况下包含 UrlHelper 一切似乎都工作正常 ruby 1 9 3 rc1 001 gt Rails version gt 3
  • 使用设计宝石导轨注销用户

    在管理部分 我显示当前登录用户的列表 现在管理员可以选择一个或多个用户并销毁他们的会话 注销他们 我不知道从哪里开始 请帮助我 您可以使用sign out通过传入用户对象在控制器操作中的方法 Make sure only admins ca
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 通过 SSL 发布 UTF-8 时,HEROKU 上出现“EOFError:已到达文件结尾”

    我在 heroku 上遇到了奇怪的错误 为了重现它 我必须使用请求正文中的任何 UTF 8 字符制作大的 超过几 KB HTTPS POST 这是一个例子 require net https require uri Accutally I
  • 在 ruby​​ 中创建登录会话时理解“current_user”概念

    我正在阅读很棒的 Michael Hartl 教程来构建 ruby 应用程序here http ruby railstutorial org chapters sign in sign out sec 3acurrent user 我试图理
  • 是否可以在 Silverlight 中建立 WebSocket 连接?

    是否可以在 Silverlight 中建立 WebSocket 连接 或者如果没有 有谁知道这是否计划在未来版本中 表面上是的 事实上 它已被用来为不支持 WebSocket 的浏览器提供后备解决方案 请参阅以下内容以获取更多信息 但请注意
  • 有没有办法避免自动更新 Rails 时间戳字段?

    如果您有数据库列created at and updated at当您创建和更新模型对象时 Rails 将自动设置这些值 有没有办法在不接触这些列的情况下保存模型 我正在引入一些旧数据 我想根据 不同名称的 旧数据字段中的相应值设置这些值
  • 如果使用 jQuery 添加字段,Rails 嵌套表单属性不会保存

    我有一个带有嵌套表单的 Rails 表单 我使用 Ryan Bates 嵌套表单和 jquery 教程 并且就动态添加新字段而言 它工作得很好 但是当我提交表单时 它不会保存任何关联的属性 但是 如果在表单加载时构建部分 则它会很好地创建属
  • Rails 3 分页,will_paginate 与 Kaminari

    我的设置 Rails 3 0 9 Ruby 1 9 2 我正在为我的应用程序寻找分页解决方案 发现有一个新的宝石Kaminari与值得信赖的人相比will paginate 看起来像will paginate有一段时间没有更新了 但后来又以
  • 用于 S3 私有文件的 ActiveStorage

    到目前为止 我一直在使用 Paperclip 将一些文件上传到 S3 其中一些文件不是公开的 Paperclip 允许通过以下位将一些文件作为私有文件上传 has attached file image styles large 2000x
  • 为 Rails 上的 postgresql 创建用户

    我选择 postgresql 作为我的 Rails 数据库 但当我尝试运行 rake db create all 时 我遇到了一个明显常见的错误 即 致命 角色 app 不存在 我找到了两种解决方案 但我不确定哪一种是正确的 有一个网站说
  • 如何将 devise/omniauth 重定向到我登录的页面?

    我通过omniauth 进行了身份验证 并且该链接通过layout application html haml 在每个页面上都可用 然而 当他们完成omniauth身份验证后 他们都会进入root权限 我如何设置它 以便他们重定向到他们单击
  • 在生产环境中使用 Rails 设置 sunspot solr

    我尝试了各种链接 但我似乎找不到关于创建与生产中的 Rails 一起运行的 solr 实例的好资源 我知道您必须为生产设置 solr 服务器 我已经尝试使用 tomcat 设置 solr 但我似乎无法将其链接到 Rails 应用程序 有什么
  • node.js 本身还是 nginx 前端来提供静态文件?

    是否有更快的基准或比较 将 nginx 放在节点前面并让它直接提供静态文件或仅使用节点并使用它提供静态文件 nginx 解决方案似乎对我来说更易于管理 有什么想法吗 我不得不不同意这里的答案 虽然 Node 可以做得很好 但如果配置正确 n
  • 拒绝框架 '',因为它违反了以下内容安全策略指令

    我们使用 Confluence Companion 工具在本地编辑 Confluence 中的文件 https confluence atlassian com doc edit files 170494553 html https con
  • 查找 Rails 应用程序中未使用的代码

    如何查找正在运行和未运行的代码生产中 该应用程序经过充分测试 但还有很多测试unused代码 因此 他们在运行测试时得到覆盖 我想重构并清理这个烂摊子 它一直在浪费我的时间 我有很多后台工作 这就是为什么我希望生产环境来指导我 在 Hero

随机推荐

  • Wix性能评估

    如何使用FileSearch结果作为条件Component部分 我想要得到这样的东西
  • 从 Play 应用程序访问 SSL 安全网页

    我正在从 Play 应用程序访问 SSL 安全页面 当页面的证书不可信时 因为它已过期或自签名或 无论是什么其他原因 我想从我的通话中提取此信息并且 相应地采取一些行动 当我在浏览器中访问这样的页面时 它会警告我该页面有问题 证书 当我在游
  • 从 Angular 6 + Angular Material 中的日期计算年龄

    我试图根据使用 Angular Material 日期选择器选取的日期计算年龄 但出现错误 下面是我的代码 HTML div class input container div
  • 如何访问/ping 位于AWS 上的服务器?

    应使用什么地址访问位于 AWS 上的服务器 我创建了一个 AWS 实例并在其上安装了一个 Web 服务器 但是 无法通过以下任何方式访问服务器 ec2 174 129 24 92 compute 1 amazonaws com 来自实例的I
  • R:如何使用 data.table 的函数输入创建一个函数

    我在使用 data table 进行练习时遇到了问题 这是我的问题 我写了一个简单的减法函数 minus lt function a b return a b 我的数据集是一个简单的 data table dt lt as data tab
  • Android View Activity 之间的动画转换

    当活动之间发生转换时 如何保持动画活动 假设我有两个活动 A 和 B 活动 B 在活动 A 上有一个 滑入 过渡 我想在活动 B 发生过渡时保持按钮在活动 A 中旋转 当活动 B 开始在活动 A 上滑动时 我的按钮停止旋转动画 我猜这是因为
  • 无法加载文件或程序集 Microsoft.VisualStudio.Web.AzureAD.Contracts

    Was trying to follow the tutorial of MVC in ASP NET site Creating an Entity Framework Data Model for an ASP NET MVC Appl
  • 通过docker中的nginx和gunicorn服务flask

    玩弄 Flask 我想在 docker 中进行真正的设置并运行 这意味着 Flask 应通过 nginx 和 Gunicorn 提供服务 我设置了一个示例代码存储库https github com geoHeil pythonServing
  • 在构造函数外部的方法中使用构造函数中的变量

    如果我有一个像这样的构造函数 public Constructor int a int b int c a int d b 然后 我如何在与构造函数相同的类中的方法中使用变量 c 和 d 因为尝试仅使用方法中的变量名称似乎不起作用 事实上你
  • 使用 TcpClient 通过网络发送和接收数据

    我需要开发一个连接到 TCP 服务器的服务 主要任务是读取传入消息并在十分钟内向服务器发送命令 例如同步命令 例如 我使用了 TcpClient 对象 如下所示 TcpClient tcpClient new TcpClient tcpCl
  • 在AddValidation方法中访问模型数据asp.net core自定义验证

    我正在遵循这个例子 https learn microsoft com en us aspnet core mvc models validation https learn microsoft com en us aspnet core
  • 你知道 JavaScript 中哪些因素会导致内存泄漏吗?

    你知道 JavaScript 中哪些因素会导致内存泄漏吗 我感兴趣的浏览器 IE 7 FireFox 3 Safari 3 有一篇很好的文章是关于JavaScript 和内存泄漏 http www javascriptkit com jav
  • 从 iPhone 上的音频流获取 Hz 频率

    在 iOS 上从音频流 音乐 获取 Hz 频率值的最佳方法是什么 Apple 提供的最好 最简单的框架是什么 提前致谢 下面是我在 iOS 中使用 Accelerate Framework 执行 FFT 的一些代码 这使得速度相当快 kee
  • 为什么禁用的 NSButton(或 NSButtonCell)的文本是灰色的?

    当我将按钮 NSButton 设置为禁用时 其文本颜色变为灰色 我该如何修改这个属性 我希望文字保持黑色 如果不是问题的正文 则回答您的标题 这实际上是一种以这种方式表示禁用的屏幕元素的行业标准 并且可能是用户所期望的 做一些不同的事情可能
  • 从 .NET 调用 Java API - 最佳方法

    我需要从现有的 NET 代码库调用全部用 java 编写的 API 这里最好的方法是什么 用 java 编写一个 web 服务 基本上只是将调用转发到 API 或者使用类似的东西JNI4NET http jni4net sourceforg
  • 使用终端从 Mac OS X 钥匙串中删除私钥

    我已使用 安全 终端应用程序和命令将 iOS 开发的开发人员身份 证书 私钥 导入到钥匙串中 security import identity p12 k
  • 泛型树,自界泛型

    我要为我的一个项目添加通用性 我喜欢泛型 因为这使我的代码更加健壮 自我记录 并消除了所有那些丑陋的强制转换 然而 我遇到了一个棘手的情况 并且在尝试表达我的一个结构的 递归 约束时遇到了一些问题 这基本上是某种 通用 树 具有双重链接 到
  • 使用 javascript 检索文本字段值

    我想使用 javascript 检索文本字段值 假设我有这样的代码
  • 将图像保存在Android图库中

    我正在使用此代码来保存图像 URL url null try url new URL image catch MalformedURLException e1 e1 printStackTrace Bitmap bmp null try b
  • Thin + Nginx + Websockets 配置 |导轨

    我有一个带有 websocket rails gem 的 Ruby on Rails 3 2 应用程序 在 nginx 反向代理后面的瘦网络服务器中运行 除了 nginx 反向代理外 一切正常 通过删除 nginx 反向代理 websock