Simple Rails 4 ActionController ::实例不使用Apache + Passenger

时间:2014-03-17 03:26:39

标签: apache ruby-on-rails-4 passenger

我正准备将我们的环境转移到Rails 4并解决所有问题。遗憾的是,我们目前使用的是Centos 5.5,因此只需要一些障碍就可以让Rails启动并运行。这包括安装python 2.6和node.js以使extjs正常工作。

现在我被卡住了。使用全新的rails 4.0.2应用程序,我有简单的ActionController :: Live示例在Puma的开发中正常运行。但是在Apache + Passenger的制作中,它根本不会将数据发送回浏览器(Firefox)

production.rb有

config.allow_concurrency = true

这是index.html中的HTML / JS。

<script>
jQuery(document).ready(function(){
   var source = new EventSource("/feed");
   source.addEventListener('update', function(e){
     console.log(e.data);
   });

});
</script>

这是控制器:

class LiveController < ApplicationController
  include ActionController::Live
  respond_to :html
  def feed
    response.headers['Content-Type']      = 'text/event-stream'
    response.headers['X-Accel-Buffering'] = 'no'

    while true do 
      response.stream.write "id: 0\n"
      response.stream.write "event: update\n"
      data = {time: Time.now.to_s}.to_json
      response.stream.write "data: #{data}\n\n"
      sleep 2
    end
  end
end

我可以看到请求在Firebug中发送到服务器,注意spinner on / feed:

Firebug Request notice the spinner

Apache / Passenger Config有这个:

LoadModule passenger_module /usr/local/ordernow/lib/ruby/gems/2.0.0/gems/passenger-4.0.27/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/ordernow/lib/ruby/gems/2.0.0/gems/passenger-4.0.27
PassengerDefaultRuby /usr/local/ordernow/bin/ruby
RailsAppSpawnerIdleTime 0
PassengerMinInstances 1

Apache日志不会显示任何内容。就像它永远不会连接到服务器。另一个奇怪的事情是命令行的卷曲起作用:

     curl -k -i -H "Accept: text/event-stream" https://10.47.47.44:8446/feed
HTTP/1.1 200 OK
Date: Thu, 27 Mar 2014 16:52:52 GMT
Server: Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/1.0.0e Phusion_Passenger/4.0.27
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
X-Accel-Buffering: no
Cache-Control: no-cache
X-Request-Id: 46fca6bb-4c6a-49f4-b0d6-2cbc5f0a63a5
X-Runtime: 0.002065
X-Powered-By: Phusion Passenger 4.0.27
Set-Cookie: request_method=GET; path=/
Status: 200 OK
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/event-stream

id: 0
event: update
data: {"time":"2014-03-27 10:52:52 -0600"}

id: 0
event: update
data: {"time":"2014-03-27 10:52:54 -0600"}

我认为它必须是Apache的东西,但我不确定。

2 个答案:

答案 0 :(得分:5)

好吧,我终于通过一堆谷歌搜索来解决这个问题,这导致我指出mod_deflate(用于压缩对浏览器的响应)将干扰非缓冲响应,如text / event-stream。

看着我的httpd.conf,我发现了这个:

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpg|png|ico|zip|gz)$ no-gzip

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9

SetOutputFilter DEFLATE 打开所有响应的压缩,使得 AddOutputFilterByType 指令的其余部分变得不必要。这显然是httpd.conf中的一个错误。我删除了这一行,并确认压缩仍适用于html页面。

现在一切都很棒!以及我试图在第一时间开始使用的仪表板工具。

答案 1 :(得分:2)

当我们想要使用Rails Action :: LiveController推送一些通知时,我们遇到了一些类似的问题,因为这个功能是用Rails 4.0发布的 - 在使用Puma进行开发时一切正常,但在生产中我们和# 39;不要关闭。这导致流程数量稳步增加。 那时我们回到了另一个解决方案。

但就在今天,我开始对这个话题进行了一些研究(非常有趣的答案,其中一位乘客作者:https://stackoverflow.com/a/4113570)并最终在这里 - 就在我读到Phusion Passenger支持并发之后和多线程仅与企业版(Phusion Passenger Enterprise Features)。

具有Apache2 Web服务器集成Phusion Passenger开源版的生产环境是否可能不适合Rails直播流?

老实说,我不知道 - 但是想让你知道我对此的看法。