我想为公共资产和HTTP响应启用GZIP压缩以提高性能.我的网站有很多移动访问权限.
据我所知,Play Framework中没有任何内置支持这一点,而Heroku似乎也没有解决方案.
在我的应用上开始获得压缩的最佳方法是什么?
我一直在撞墙试图在heroku雪松上部署redmine 2.0.3.
使用sqlite gem部署时遇到了很多问题,所以我从Gemefile中删除了所有sqlite引用,删除了Gemfile.lock,运行了bundle install,并愉快地推送到了heroku.
我跑了heroku run rake db:migrate,我浏览了我的应用程序(http://blooming-river-8784.herokuapp.com/),我看到以下内容:
UPDATE!- >当我跑步时,heroku run rake db:migrate我收到以下警告信息:
Running rake db:migrate attached to terminal... up, run.1
DEPRECATION WARNING: You have Rails 2.3-style plugins in vendor/plugins! Support for these plugins will be removed in Rails 4.0. Move them out and bundle them in your Gemfile, or fold them in to your app as lib/myplugin/* and config/initializers/myplugin.rb. See the release notes for more on this: http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released. (called from <top (required)> …Run Code Online (Sandbox Code Playgroud) 我在Heroku Cedar堆栈上使用Rails并且在编译资产时没有抛出任何问题,但后来我得到了500个内部服务器错误:
2012-06-25T23:22:59+00:00 app[web.1]: ActionView::Template::Error (bootstrap-datepicker.js isn't precompiled):
Run Code Online (Sandbox Code Playgroud)
知道可能导致这种情况的原因吗?这是我包含的javascript文件(除了我在本地下载)https://github.com/eternicode/bootstrap-datepicker/blob/master/js/bootstrap-datepicker.js
我将它包含在我的application.html.erb中,如下所示:
<%= javascript_include_tag "bootstrap-datepicker" %>
Run Code Online (Sandbox Code Playgroud)
是因为它不是coffeescript文件吗?任何帮助表示赞赏!
根据接受的答案中的评论Rails如何Gzip Javascript?(Heroku)和官方雪松文档(http://devcenter.heroku.com/articles/http-routing#the_herokuappcom_http_stack):
由于对Cedar应用程序的请求直接发送到应用程序服务器 - 不通过像nginx这样的HTTP服务器代理 - 因此必须在应用程序中完成任何响应压缩.对于Rack应用程序,可以使用Rack :: Deflater中间件来完成.对于gzip压缩静态资源,请确保在中间件堆栈中的ActionDispatch :: Static之前加载Rack :: Deflater.
但是,据我所知,我的应用程序在herokuapp.com(雪松)上运行,并且根据heroku日志,使用nginx来提供数据(这很棒).我还通过Content-Encoding HTTP标头确认它正在向浏览器gzipping数据.根据文件,这不应该发生在雪松上.我在这里错过了什么吗?
我尝试按照这里的说明在Heroku的Cedar堆栈上创建一个静态网站.
我把网站放在这里.
当我尝试推送应用程序(使用"git push heroku master")时,我收到以下错误:
Kushs-MacBook-Air:hgtr kushpatel$ git push heroku master
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 1.29 KiB, done.
Total 7 (delta 1), reused 0 (delta 0)
-----> Heroku receiving push
-----> Removing .DS_Store files
! Heroku push rejected, no Cedar-supported app detected
To git@heroku.com:gentle-warrior-1301.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs …Run Code Online (Sandbox Code Playgroud) 我们需要从运行在Heroku上的Django管理员导出包含模型数据的csv文件.因此,我们创建了一个操作,我们在其中创建了csv并在响应中返回了它.这工作正常,直到我们的客户端开始导出大量数据,我们遇到了Web worker的30秒超时.
为了避免这个问题,我们考虑将csv流式传输到客户端,而不是先在内存中构建它并将其一起发送.Trigger是这条信息:
Cedar支持长轮询和流式响应.您的应用程序有一个最初的30秒窗口,以单个字节响应客户端.发送每个字节后(从客户端收到或由您的应用程序发送),您重置一个滚动的55秒窗口.如果在55秒窗口期间没有发送数据,则终止连接.
因此,我们实现了一些看起来像这样的东西来测试它:
import cStringIO as StringIO
import csv, time
def csv(request):
csvfile = StringIO.StringIO()
csvwriter = csv.writer(csvfile)
def read_and_flush():
csvfile.seek(0)
data = csvfile.read()
csvfile.seek(0)
csvfile.truncate()
return data
def data():
for i in xrange(100000):
csvwriter.writerow([i,"a","b","c"])
time.sleep(1)
data = read_and_flush()
yield data
response = HttpResponse(data(), mimetype="text/csv")
response["Content-Disposition"] = "attachment; filename=test.csv"
return response
Run Code Online (Sandbox Code Playgroud)
下载的HTTP标头如下所示(来自FireBug):
HTTP/1.1 200 OK
Cache-Control: max-age=0
Content-Disposition: attachment; filename=jobentity-job2.csv
Content-Type: text/csv
Date: Tue, 27 Nov 2012 13:56:42 GMT
Expires: Tue, 27 Nov 2012 13:56:41 GMT
Last-Modified: Tue, …Run Code Online (Sandbox Code Playgroud) 鉴于Heroku Cedar没有Varnish提供的http缓存我想使用Rack::Cache.我被告知rails 3.1.1 Rack::Cache默认处于活动状态,我只需要确保在配置中:
config.action_controller.perform_caching = true
Run Code Online (Sandbox Code Playgroud)
我需要选择一个缓存存储,对于我正在使用的这个实验:
config.cache_store = :memory_store
Run Code Online (Sandbox Code Playgroud)
在我要缓存的页面的操作中,我添加了以下行:
response.header['Cache-Control'] = 'public, max-age=300'
response.header['Expires'] = CGI.rfc1123_date(Time.now + 300)
Run Code Online (Sandbox Code Playgroud)
此代码用于与Varnish一起使用,第一个请求将返回200,随后(5分钟)将返回a 304.
Rails 3.1和Heroku Cedar Stack不会发生这种情况.我确实在响应中获得了这些标头,但后续请求返回200而不是304.
我究竟做错了什么?谢谢.
当我运行Heroku Bamboo时,这从来都不是问题.现在,在Cedar上,每当我尝试从服务器上的rake任务中访问我的模型时,我都会收到错误.这种情况发生rake db:seed在标准的rake任务中,以及我自己定制的任务中明确包含:environment.我甚至多余地这样做:
namespace :db do
desc "Update db"
task :new_seed => :environment do
require './Scraped_Data/Games/code/column-headers.rb'
require 'csv'
require 'net/http'
require './config/environment.rb'
# code here...
end
end
Run Code Online (Sandbox Code Playgroud)
我在其他地方找不到任何关于这个问题的提及,所有这些任务都在开发中完美运行.感谢您的任何见解,这里是完整的错误消息,一旦他们在Heroku上遇到我的模型,就会吐出rake任务:
rake aborted!
uninitialized constant Object::Movie
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing'
/app/lib/tasks/new_seed.rake:187:in `block in load_scraped_data'
/app/vendor/bundle/ruby/1.9.1/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:37:in `open'
/app/vendor/bundle/ruby/1.9.1/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:37:in `open'
/app/lib/tasks/new_seed.rake:148:in `load_scraped_data'
/app/lib/tasks/new_seed.rake:550:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/usr/local/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) …Run Code Online (Sandbox Code Playgroud) 我按照他们的指示将一个Heroku应用程序从Aspen移植到Heroku的Cedar堆栈.
我正处于最后的部署阶段.我收到此错误:
2012-10-22T11:23:53+00:00 heroku[web.1]: Starting process with command `bundle exec thin start -p 40310 -e production`
2012-10-22T11:23:54+00:00 app[web.1]: bash: bundle: command not found
Run Code Online (Sandbox Code Playgroud)
我无法看到我如何负责告诉Heroku堆栈捆绑包或提供捆绑包,因为捆绑包被它用于这个工作.此命令在应用程序的Procfile中指定:
web: bundle exec thin start -p $PORT -e $RACK_ENV
Run Code Online (Sandbox Code Playgroud)
stackoverflow上的另一个类似问题表明,如果最初没有Procfile将应用程序推送到Heroku,就会发生这种情况,因此Heroku对于它是什么类型的应用程序有错误的想法.那张海报删除了他的应用并创建了一个新的并报告了成功.但是,删除和重新创建移植的应用程序所需的工作量很大.有什么方法可以解决这个问题而不是重新开始吗?
我想我的Heroku应用程序(Play/Scala,在Heroku Cedar上运行)的运行时能够向我报告它是从哪个git提交的.Heroku应用程序通常由Heroku基础架构上的slug编译器构建 - 不幸的是,slug编译器将此作为此构建过程的早期部分:
删除未使用的文件,包括.git目录,.gitmodules文件,log和tmp中的任何内容,以及顶级.slugignore文件中指定的任何内容.
...所以Git信息不再可用于sbt-buildinfo我用于记录Git提交的插件.
如何在slug中记录HEAD提交?这些信息是否有可用的环境变量?