Можно ли напрямую использовать предварительно скомпилированные активы с nginx? Динамическое обслуживание ресурсов с помощью Rails в 20 раз медленнее (4000 req/sec против 200 req/sec в моем виртуальном боксе).
Я думаю, это можно сделать с помощью некоторого правила перезаписи в nginx.conf. Однако проблема заключается в том, что эти имена файлов включают хеш-содержимое md5, поэтому я не понимаю, что с этим можно сделать.
Если это невозможно, я не понимаю всю идею с конвейерами Rails 3.1. Сокращение клиентской пропускной способности и времени загрузки страницы за счет загрузки сервера x20?
Любые идеи?
UPD: Итак, мне удалось настроить мои nginx и Rails в некотором смысле, когда все в моем приложении подано со скоростью ~ 3500-4000 запросов/сек.
Прежде всего, я добавил два виртуальных хоста, один из которых служил в качестве кэширующего прокси-сервера другому, и обнаружил, что активы обслуживаются с той скоростью, которую я хотел (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;
}
Все быстро, как кровавая молния:) Спасибо, ребята.