标签: eventmachine

如何使用SSL客户端证书获取HTTPS请求以使用Ruby EventMachine?

我试图访问使用Ruby EventMachine使用SSL证书身份验证的HTTPS Web服务,但我没有让它工作.

我编写了以下简单的代码块来端到端地测试它:

require 'rubygems'
require 'em-http'

EventMachine.run do
  url = 'https://foobar.com/'
  ssl_opts = {:private_key_file => '/tmp/private.key',
    :cert_chain_file => '/tmp/ca.pem',
    :verify_peer => false}
  http = EventMachine::HttpRequest.new(url).get :ssl => ssl_opts

  http.callback do
    p http.response_header.status
    p http.response_header
    p http.response
    EventMachine.stop
  end

  http.errback do
    EventMachine.stop
    fail "Request failed"
  end
end
Run Code Online (Sandbox Code Playgroud)

运行上面的输出,<SSL_incomp>然后是引发的RuntimeError消息.我尝试使用:verify_peerset 运行true和false,它给了我同样的错误.EventMachine::HttpRequest#get没有:ssl选项的运行也是如此.

我也尝试将请求发送到GMail(https://mail.google.com),没有:ssl选项(即没有证书的普通HTTPS),并且可以正常工作,输出状态代码200,标题和正文.

我尝试使用curl对Web服务执行相同的请求,并且可以正常工作:

curl --silent --cert /tmp/private.key --cacert /tmp/ca.pem https://foobar.com/
Run Code Online (Sandbox Code Playgroud)

我想我要么错误地使用em-http-request gem或者EventMachine,要么SSL文件的格式是使用curl而不是EventMachine.

我有人知道如何解决上面的例子或直接使用EventMachine提供类似的例子将非常感激!

ruby ssl-certificate eventmachine

6
推荐指数
1
解决办法
4300
查看次数

如何使用Ruby和eventmachine登录?

我正在使用Ruby和Eventmachine库编写应用程序.我非常喜欢非阻塞I/O和事件驱动系统的想法,我遇到的问题是日志记录.我正在使用Ruby的标准记录器库.它不是永远记录日志,但似乎不应该阻止它,它确实.那里有一个库,它将Ruby的标准记录器实现扩展为非阻塞,或者我应该为我的日志调用调用EM :: defer吗?有没有办法让eventmachine为我做这个呢?

ruby logging eventmachine

6
推荐指数
1
解决办法
2206
查看次数

为什么EventMachine比Node慢得多?

在我的具体情况下,至少.不试图在这里做一般性陈述.

我在Node.js中编写了这个Web爬虫.我喜欢使用Ruby,所以我在EventMachine中重写了它.由于原版是在CoffeeScript中,它实际上非常容易,并且代码非常相似,除了在EventMachine中我实际上可以捕获并从异常中恢复(因为我使用的是光纤).

问题是在Node.js代码上运行不到20秒的测试在EventMachine上占用的时间超过5分钟.当我观察连接计数时,它几乎看起来甚至没有并行运行(它们排队成数百个,然后非常缓慢地向下运行),尽管日志记录显示代码点并行命中的.

我意识到没有代码就无法确切地知道到底发生了什么,但我只是想知道是否存在某种潜在的差异,我应该放弃,或者他们是否应该能够以更快的速度运行(a小的减速是好的)我应该继续试图找出问题所在.

我做了以下,但它似乎没有任何影响:

puts "Running with ulimit: " + EM.set_descriptor_table_size(60000).to_s
EM.set_effective_user('nobody')
EM.kqueue
Run Code Online (Sandbox Code Playgroud)

哦,我非常确定我在EventMachine中没有任何阻塞调用.我已经梳理了大约10次每一行,寻找任何可能阻塞的东西.我的所有网络调用都是EM :: HttpRequest.

javascript ruby eventmachine node.js

6
推荐指数
1
解决办法
1719
查看次数

异步读取EventMachine中的文件

我正在玩Ruby EventMachines已有一段时间了,我想我理解它的基础知识.

但是,我不确定如何在大文件(120 MB)中进行性能读取.我的目标是逐行读取文件并将每一行写入Cassandra数据库(同样应该使用MySQL,PostgreSQL,MongoDB等,因为Cassandra客户端显式支持EM).简单的片段阻挡了反应堆,对吗?

require 'rubygems'
require 'cassandra'
require 'thrift_client/event_machine'

EM.run do
  Fiber.new do
    rm = Cassandra.new('RankMetrics', "127.0.0.1:9160", :transport => Thrift::EventMachineTransport, :transport_wrapper => nil)
    rm.clear_keyspace!
    begin
      file = File.new("us_100000.txt", "r")
    while (line = file.gets)
      rm.insert(:Domains, "#{line.downcase}", {'domain' => "#{line}"})
    end
      file.close
    rescue => err
      puts "Exception: #{err}"
      err
    end
    EM.stop
  end.resume
end
Run Code Online (Sandbox Code Playgroud)

但是什么是异步读取文件的正确方法?

ruby asynchronous file cassandra eventmachine

6
推荐指数
1
解决办法
2311
查看次数

EventMachine和Ruby Threads - 这里到底发生了什么?

我们一起使用Rails和EventMachine,当与Passenger一起使用时,有一些非常具体的设置需要完成.经过大量的试验和错误,我使EventMachine初始化运行良好,但我想更好地理解代码.正如您在下面的代码片段中所看到的,我们的初始化程序检查Passenger,然后在重新启动EventMachine之前检查它是否是分叉进程.

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
  # for passenger, we need to avoid orphaned threads
    if forked && EM.reactor_running?
      EM.stop
    end
    Thread.new {
      EM.run do
Run Code Online (Sandbox Code Playgroud)

我的问题与EM.reactor_running有关?和EM.stop命令.如果Passenger已分叉我们的进程,为什么我需要在新线程中重新启动EM引用?如果EM.reactor_running?返回true,我引用的EM实例是什么?

您可以在我们的博客上查看完整的初始化代码http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

ruby ruby-on-rails eventmachine

6
推荐指数
1
解决办法
3506
查看次数

如何在EventMachine实现中捕获异常?

我对这个帖子有类似的问题,我尝试了给定的解决方案,但无济于事.

我的项目是一个Ruby bot,它使用Blather库连接到Jabber服务器.问题是,当服务器出现问题并且Blather生成异常时,整个程序退出,我没有机会捕获异常.

这是一些显示问题的简单代码.在localhost上没有运行Jabber服务器,因此Blather客户端会抛出异常.我的印象是EM.error_handler {}能够拦截它,但我从未看到**** ERROR消息,程序就停止了.:(

#!/usr/bin/env ruby
require 'rubygems'
require 'blather/client/client'

EM.run do
  EM.error_handler { puts " **** ERROR " }

  Blather::Stream::Client.start(
    Class.new {
    }.new, 'echo@127.0.0.1', 'echo')
end
Run Code Online (Sandbox Code Playgroud)

我认为问题是Blather也使用EventMachine并且可能正在调用EM.stop,这会导致外部EM实例停止.

ruby xmpp eventmachine

6
推荐指数
1
解决办法
1888
查看次数

为什么EventMachine出站数据缓冲区可能会停止发送并且只是永远填满(而其他连接仍然可以发送)

我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.

当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.

是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).

cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket

6
推荐指数
1
解决办法
388
查看次数

无法启动sinatra进程 - eventmachine"no acceptor"

我有一个Sinatra应用程序,我作为守护程序运行,使用Apache端口转发在端口80和端口7655之间进行调解.这在过去一直运行良好.今天不太好.我无法弄清楚为什么.

问题:sudo ruby my_process.rb退货:

/var/lib/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Run Code Online (Sandbox Code Playgroud)

尝试:更新所有系统包,更新所有宝石.没有帮助(来自eventmachine的更明确的错误消息除外).

当我跑步时,sudo lsof -i :7655我什么也得不回来.当我运行时,sudo ps aux我根本看不到任何 Ruby进程.鉴于错误消息的性质,我发现这是非常不规则的!

那么在找出端口不可用的原因时我有什么遗漏?


也:

尝试更换端口,没有.我想知道它是否与"localhost"有关?当我ping localhost时,我得到所有丢弃的数据包.这似乎不正常.

ruby apache sinatra eventmachine

6
推荐指数
1
解决办法
2572
查看次数

创建数据库时出现Rails/Ruby错误:无法加载EventMachine C扩展

更新:

eventmachine gem已安装在我的gemfile中:

 eventmachine (1.0.0, 0.12.10)
Run Code Online (Sandbox Code Playgroud)

请帮忙!尝试使用以下内容创建数据库:

Fitzs-MacBook-Pro:twilio_insanity Fitz$ rake db:create'
Run Code Online (Sandbox Code Playgroud)

返回以下错误:

无法加载EventMachine C扩展; 要使用纯红宝石反应器,需要'em/pure_ruby'耙子中止!无法加载这样的文件 - ruby​​eventmachine /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@rails3tutorial2ndEd/gems/eventmachine-1.0.0/lib/eventmachine.rb:8:in'/ require' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@rails3tutorial2ndEd/gems/eventmachine-1.0.0/lib/eventmachine.rb:8:in Users/Fitz/.rvm/gems/ruby​​-1.9.3-p327 @ rails3tutorial2ndEd/gems/thin-1.5.0/lib/thin.rb:7:in require' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@rails3tutorial2ndEd/gems/thin-1.5.0/lib/thin.rb:7:in ' /Users/Fitz/.rvm/gems/ruby-1.9.3- p327 @ global/gems/bundler-1.2.3/lib/bundler/runtime.rb:68:in require' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/gems/bundler-1.2.3/lib/bundler/runtime.rb:68:in block(2 levels)in require'/Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/ gems/bundler-1.2.3/lib/bundler/runtime.rb:66:在each' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/gems/bundler-1.2.3/lib/bundler/runtime.rb:66:in require'/Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/gems/bundler-1.2.3 中的 块中/lib/bundler/runtime.rb:55:in each' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/gems/bundler-1.2.3/lib/bundler/runtime.rb:55:in require'/Users/Fitz/.rvm/gems/ruby-1.9.3-p327@global/gems/bundler-1.2.3/lib/bundler.rb:128:在 require' /Users/Fitz/Desktop/twilio_insanity/config/application.rb:7:in'/用户/菲茨/桌面/ twilio_insanity/Rake文件:5: require' /Users/Fitz/Desktop/twilio_insanity/Rakefile:5:in' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@rails3tutorial2ndEd/bin/ruby_noexec_wrapper:14:in eval' /Users/Fitz/.rvm/gems/ruby-1.9.3-p327@rails3tutorial2ndEd/bin/ruby_noexec_wrapper:14:in "(见完整跟踪使用--trace运行任务

```

ruby gem rubygems ruby-on-rails eventmachine

6
推荐指数
2
解决办法
1万
查看次数

Rails,Windows和HTTPS

我的目标是从标准HTTP服务器传递到更安全的HTTPS服务器.

我的设置是: Ruby 2.0.0p598,Rails 4.2.0,Thin 1.6.3,Windows 7-Pro-x64-SP1

我做了什么:使用自签名证书我尝试使用以下命令启动服务器:

thin start --ssl --ssl-key-file ssl/server.key --ssl-cert-file ssl/server.crt
Run Code Online (Sandbox Code Playgroud)

问题:我收到以下错误:

terminate called after throwing an instance of 'std::runtime_error'
  what():  Encryption not available on this event-machine

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Run Code Online (Sandbox Code Playgroud)

我向你提出的问题:你知道它是否是Windows上的一般问题(因此我甚至无法想到成功)或者是否有办法在Windows上轻松使用ssl?

windows https ruby-on-rails eventmachine

6
推荐指数
1
解决办法
1050
查看次数