gpt4 book ai didi

apache - 简单的 Rails 4 ActionController::Live 示例不适用于 Apache +Passenger

转载 作者:行者123 更新时间:2023-12-04 18:07:51 25 4
gpt4 key购买 nike

我正在尝试准备将我们的环境迁移到 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>

这是 Controller :
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 中发送到服务器,注意/feed 上的微调器:

Firebug Request notice the spinner

Apache/Passenger 配置有这个:
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 有效:
     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 中的东西,但我不确定。

最佳答案

好吧,我终于通过一堆谷歌搜索弄清楚了这一点,这让我发现 mod_deflate(用于压缩对浏览器的响应)会干扰非缓冲响应,如文本/事件流。

查看我的 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 页面。

现在一切都很好!以及我最初尝试使用的仪表板工具。

关于apache - 简单的 Rails 4 ActionController::Live 示例不适用于 Apache +Passenger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com