我在寻找一个简单的方法,以使在通过薄独立西纳特拉应用程序运行SSL,而不必通过--ssl,--ssl-key-file并--ssl-cert-file在通过薄命令行参数.
是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?
我花了几个小时寻找这个问题的答案,但到目前为止还没有找到任何有效的方法.
我正在尝试在我的应用程序中利用Server-Sent Events.我正在使用Sinatra和sinatra-sse宝石.这个宝石包裹着Sinatra的stream :keep_alive召唤.
在Thin上运行我的应用程序时,我绝对没有问题,我的事件流按预期工作.然而,当我切换我的应用程序与Puma一起运行时,一切正常,除了我sse_stream绝对没有!它只返回一个空白页面.
我的流设置如此
get "/logstream/:server" do
if rbcserver = MyApp.servers[params[:server]]
sse_stream do |stream|
rbcserver.add_web_logger(stream)
stream.callback { rbcserver.remove_web_logger(stream) }
end
else
error 404
end
end
Run Code Online (Sandbox Code Playgroud)
我这样开始瘦:
@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run
Run Code Online (Sandbox Code Playgroud)
知道发生了什么事吗?任何帮助,将不胜感激.
编辑:更多信息这是cURL在Puma上运行时提供的
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked
$
Run Code Online (Sandbox Code Playgroud)
而这就是Thin上发生的事情
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Connection: …Run Code Online (Sandbox Code Playgroud) 我已经在网上阅读了大量关于不同版本的ruby和rails中的线程安全性和性能的材料,我想我现在对这些事情了解得很清楚.
讨论中似乎奇怪的是如何实际部署异步Rails应用程序.在谈论应用程序中的线程和同步时,人们想要优化两件事:
第1点是人们(正确地)对JRuby感到兴奋的地方.对于这个问题,我只想优化第2点.
说这是我的应用程序中唯一的控制器:
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
Run Code Online (Sandbox Code Playgroud)
fast没有IO,每秒可以服务数百或数千个请求,并且slow必须通过网络发送请求,等待工作完成,然后通过网络接收答案,因此要慢得多fast.
因此,理想的部署将允许在请求等待IO时fast满足数百个请求slow.
围绕Web的讨论似乎缺少的是堆栈的哪一层负责实现这种并发.thin有一个--threaded标志,它将"在线程中调用机架应用程序[实验]" - 是否为每个传入请求启动一个新线程?在持久存在并等待传入请求的线程中假装机架应用程序实例?
瘦是唯一的方式还是其他人?ruby运行时是否对优化第2点很重要?
当我thin像这样加载:
thin start -e production
Run Code Online (Sandbox Code Playgroud)
并尝试访问我的一个页面,我在日志输出中得到这个:
cache: [GET /] miss
cache: [GET /assets/main-bd1ef4b153740fb69fd615304b87ad0d.css] miss
cache: [GET /assets/jqModal-8fa734bf4f58524b2799abd73ab7d34f.css] miss
cache: [GET /assets/jquery-544665ba1d5b4f793290421aafed85c9.js] miss
cache: [GET /assets/application-00b97aa2429046c0c43802f07b756b46.js] miss
Run Code Online (Sandbox Code Playgroud)
这些文件存在于我的assets目录下public.
我也运行这个命令:
RALS_ENV=production rake assets:precompile
Run Code Online (Sandbox Code Playgroud)
我试过/public/assets/application.js在浏览器中访问该文件,如下所示:
http://localhost:3000/application.js
Run Code Online (Sandbox Code Playgroud)
这给了我一个404错误(即使该文件存在/public/assets但是当我在服务器处于开发模式时向文件发出请求时可以读取该文件.
有人有主意吗?
在尝试启动工头后,我得到了这个错误(请注意,它似乎确实在heroku上工作,所以我猜这是一个严格的本地问题):
hrn039:textthechange jon$ foreman start
02:20:00 web.1 | started with pid 7363
02:20:01 web.1 | /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/commands/server.rb:33:in `parse!': missing argument: -e (OptionParser::MissingArgument)
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.4.1/lib/rack/server.rb:280:in `parse_options'
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.4.1/lib/rack/server.rb:180:in `options'
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/commands/server.rb:54:in `set_environment'
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/commands/server.rb:42:in `initialize'
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/commands.rb:50:in `new'
02:20:01 web.1 | from /Users/jon/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/commands.rb:50:in `<top (required)>'
02:20:01 web.1 | from script/rails:6:in `require'
02:20:01 web.1 | from script/rails:6:in `<main>'
02:20:01 web.1 | process terminated
02:20:01 system | sending SIGTERM …Run Code Online (Sandbox Code Playgroud) 在尝试运行我的config.ru时,我遇到一个奇怪的错误,我似乎无法调试称为"无接受者"错误.
完整的错误消息:
eventmachine.rb:572:in `start_tcp_server': no acceptor (RuntimeError)
Run Code Online (Sandbox Code Playgroud)
有谁知道这个错误意味着什么?谢谢.
我一直在玩并评估rails的默认WEBrick服务器的其他选项,而Thin是最无痛,最干净的东西,效果非常好!!
你会推荐哪一个Mongrel,Thin,WEBrick和Passenger以及为什么......?是否有任何可扩展性特权(集群友好或配置,可以处理某种规模),这些服务器随附任何这些服务器.或者在评估它们时,可扩展性甚至应该是一个参数?
我打算在Rails 3.2项目上用Thin替换WEBrick,因为WEBrick严重处理格式错误的非转义URI(错误的URI错误).我知道有一些配置hacks使WEBrick处理未转义的URI,但只是添加到我的Gemfile似乎很容易让我想知道:gem 'thin'
顺便说一句:我正在Heroku上部署.如果Heroku上有Thin的特定问题,那么我也想知道.
我目前正在开发一个网络应用程序,我为此在Windows和Mac dev机器之间进行了交替.
我的问题是Windows上的页面渲染速度非常慢,但不是我的Ruby代码运行缓慢,而是静态文件的缓慢提供.
一个典型的页面需要大约200毫秒来渲染并在开发中提供服务(Mac和Windows在这里类似),但它包含大约50个静态文件(在生产中它只有5到10个,一旦它们被缩小和组合,但在开发中它们'仍然分开).
这50个文件在Mac上服务大约需要1.5秒,但在Windows上大约需要10秒.这让测试事情变得非常曲折......
我尝试了Webrick和Thin,它们大致相同.
有没有人发现这个问题,知道如何改善这个问题?
我已经尝试将Webrick conf更改为":DoNotReverseLookup => true",正如本回答中所建议的那样,但它没有帮助.
任何帮助将不胜感激
谢谢!
丹尼尔
我得到它与Puma合作,但使用Thin我没有得到任何流输出,我必须杀死服务器来阻止它.我正在测试使用tenderlove的初始示例输出当前时间:
http://tenderlovemaking.com/2012/07/30/is-it-live.html
对我来说一个更普遍的问题是,这种类型的流媒体在具有任何重要流量的应用程序中是否实用?我想如果有数千名用户在这样的应用程序中同时连接到一个流,那么很容易就会出现问题.Puma将如何扩展?我读到Puma每个连接使用1个线程.这有效吗?那么Thin呢?所有连接都在同一个线程中吗?这会更有效吗?
我的另一个问题是,即使使用Puma,我只能在本地使用一个连接.当我从第二个终端卷曲时,我没有得到任何输出......有人知道为什么吗?