【发布时间】:2011-09-18 03:20:26
【问题描述】:
是否可以直接使用 nginx 提供预编译资产?使用 Rails 动态地提供资源会慢 20 倍(4000 req/sec vs 200 req/sec in my virtualbox)。
我想这可以通过 nginx.conf 中的一些重写规则来完成。但是,问题是这些文件名包含内容的 md5 哈希,所以我真的不明白可以用它做什么。
如果不可能的话,我不明白 Rails 3.1 资产管道的全部想法。以 x20 服务器负载为代价减少客户端带宽和页面加载时间?
有什么想法吗?
UPD:所以,当我的应用程序中的一切以大约 3500-4000 个请求/秒的速度提供服务时,我设法设置了我的 nginx 和 Rails。
首先,我添加了两个虚拟主机,其中一个用作另一个的缓存代理,并发现资产以我想要的速度(4k)提供服务。然后我将我的 Rails 应用程序与 memcached 连接起来(目前没有什么特别的,在 application.rb 中只有一行:ActionController::Base.cache_store = :mem_cache_store, "localhost")
然后我在我的控制器中添加了expires_in 1.hour, :public => true if !signed_in?; 之类的东西,以更改 Rails 内容的默认缓存策略,并为我的动态页面获得了大约每秒 500 个请求的速度提升(在此之前它接近 200,它是 ~ 50 在我开始这一切之前)。
现在,当我的 nginx 配置文件看起来像这样时:
nginx.conf:
...
proxy_cache_path /tmp/blog keys_zone=one:8m max_size=1000m inactive=600m;
proxy_temp_path /tmp;
gzip off;
include /opt/nginx/conf/sites-enabled/*;
启用站点/博客:
server {
listen 8080;
server_name blindsight;
root /home/mike/rails/blog/public;
rails_env production;
# serve static content directly
location ~* \.(ico|jpg|gif|png|swf|html)$ {
if (-f $request_filename) {
expires max;
break;
}
}
passenger_enabled on;
location ~ /\.ht {
deny all;
}
}
启用站点/主要:
server {
listen 80;
server_name blindsight;
location /authorize
{
proxy_pass_header Cookie;
proxy_pass_header Set-Cookie;
proxy_pass http://127.0.0.1:8080;
}
location /admin
{
proxy_pass_header Set-Cookie;
proxy_pass_header Cookie;
proxy_pass http://127.0.0.1:8080;
}
location / {
root /home/mike/rails/blog/public;
# All POST requests go directly
if ($request_method = POST) {
proxy_pass http://127.0.0.1:8080;
break;
}
proxy_redirect off;
proxy_pass_header Cookie;
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache one;
proxy_cache_key blog$request_uri;
proxy_cache_valid 200 302 5s;
proxy_cache_valid 404 1m;
proxy_pass http://127.0.0.1:8080;
}
一切都像血腥的闪电一样快:) 谢谢各位。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 nginx