как отдавать статику?

56 views
Skip to first unread message

Igor Kasyanchuk

unread,
May 6, 2010, 10:57:08 AM5/6/10
to RubyOnRails to russian
Привет
Есть вопрос как отдавать статику?
У меня есть один код, он будет обрабатывать 2 сайта.
И есть например такой код:

class SitemapController < ApplicationController
caches_page :sitemap
def sitemap
@businesses = Business.find(:all, :limit => 50, :conditions =>
{ :city_id => site_config.city_id} )
headers["Last-Modified"] = @businesses[0].updated_at.httpdate
end
end

Вопрос как мне отдавать 2 сайт-мапы и как их создать каждая для своего
домена ?

Смотрел http://api.rubyonrails.org/classes/ActionController/Caching/Pages/ClassMethods.html#M000452
но что-то я не смог передать туда параметр города (ну или домена).

И еще как настроить nginx на отдачу этой статики (для разных доменов -
своя отвельная статика (только html))?

Большое спасибо!

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ

Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru

cyberfox

unread,
May 6, 2010, 11:24:39 AM5/6/10
to ror...@googlegroups.com
ну можно хранить статику для разных городов (доменов) в разных папках, в
before_filter:

ActionController::Base.page_cache_directory
="#{RAILS_ROOT}/public/cache/#{@city}/"

А дальше настроить rewrite.


В Чтв, 06/05/2010 в 07:57 -0700, Igor Kasyanchuk пишет:

Yaroslav Markin

unread,
May 6, 2010, 11:29:13 AM5/6/10
to ror...@googlegroups.com
http://railstips.org/blog/archives/2010/01/22/multiple-domain-page-caching/

Только для sitemap отдача с кешированием это не лучшее решение, лучше по крону составлять sitemap с помощью одного из разумных плагинов [http://github.com/search?type=Repositories&language=ruby&q=sitemap&repo=&langOverride=&x=22&y=13&start_value=1] и отдавать статику примерно так, как показано по ссылке выше.

2010/5/6 Igor Kasyanchuk <igorkas...@gmail.com>

Привет
Есть вопрос как отдавать статику?
У меня есть один код, он будет обрабатывать 2 сайта.
И есть например такой код:

 
--
Yaroslav

Igor Kasyanchuk

unread,
May 6, 2010, 4:55:19 PM5/6/10
to RubyOnRails to russian
Спасибо, все так и сделал ... только вот с rewrite проблема
Я не знаю как настроить его для nginx. Раньше было так:

# if (-f $request_filename.html) {
# rewrite (.*) $1.html break;
# }

Пробовал писать что-то вроде - пе помогает

# if (-f $host/$request_filename.html) {
# rewrite (.*) $host/$1.html break;
# }

Все статика ложится в папки вроде: public/domain-name.com/index.html

Помогите пожалуйста советом, таск критичный. Спасибо

> before_filter:
>
> ActionController::Base.page_cache_directory
> ="#{RAILS_ROOT}/public/cache/#{@city}/"
>
> А дальше настроить rewrite.

cyberfox

unread,
May 6, 2010, 5:22:06 PM5/6/10
to ror...@googlegroups.com
К сожалению, не работал с nginx.
Использовал для этих целей rack_rewrite, был маленький сайт, там
оправдано.

В Чтв, 06/05/2010 в 13:55 -0700, Igor Kasyanchuk пишет:

Igor Kasyanchuk

unread,
May 6, 2010, 6:02:28 PM5/6/10
to RubyOnRails to russian
ну мне желательно отдавать через nginx, во всяком случае спасибо за
поддержку

последнее что я пробовал:
if (-f $document_root/$host/$request_filename.html) {
rewrite ^(.*)$ $1.html break;
}

# if (-f $document_root/$host/$request_filename.html) {
# rewrite (.*) $document_root/$host/$1.html
break;
#

перепробовал куча комбинаций, но дело в тому что знаний по nginx почти
нету.
Кстати я паралельно перерыл куча интернету, например тут
http://rubypond.com/blog/setting-up-nginx-ssl-and-virtual-hosts внизу
есть что-то похожее но оно мне не помогло.
Если есть у кого-то идеи насчет rewrite - буду рад услышать
Спасибо

On May 7, 12:22 am, cyberfox <cyberfox...@gmail.com> wrote:
> К сожалению, не работал с nginx.
> Использовал для этих целей rack_rewrite, был маленький сайт, там
> оправдано.
>

Akzhan Abdulin

unread,
May 7, 2010, 12:31:45 AM5/7/10
to ror...@googlegroups.com
Типичные правила, например, для Drupal:
        location / {
            root   /path/to/drupal;
            index  index.php index.html;

            if (!-f $request_filename) {
                rewrite  ^(.*)$  /index.php?q=$1  last;
                break;
            }

            if (!-d $request_filename) {
                rewrite  ^(.*)$  /index.php?q=$1  last;
                break;
            }

        }

Кстати, не забывайте, что можно использовать разные location, используя также регулярки и строгое совпадение.

Да и синтаксис конфигурации nginx очень простой, лучше бы выучить. Всегда может пригодится.

7 мая 2010 г. 0:55 пользователь Igor Kasyanchuk <igorkas...@gmail.com> написал:

Sergey Kuznetsov

unread,
May 7, 2010, 2:23:13 AM5/7/10
to ror...@googlegroups.com
Здравствуйте.

Попробуйте так. Допустим, всю статику расположить в отдельной папке example.com/s (ну или целиком - static), а в конфиге nginx'а примерно так:

server {
listen                 80;
server_name            example.com;
set $_application_root "/var/www/example.com/";

rewrite ^/s/(.*) /css/$1 last;
rewrite ^/(.*) /$1 last;

location /s/ {
root $_application_root;
}
location ~* ^.+\.(php)$ {
root    $_application_root;
fastcgi_index index.php;
set $_fastcgi_script_name $fastcgi_script_name;
include "/usr/local/nginx/conf/fcgi.conf";
}
}

(Конечно, пример, из мира PHP, но думаю, что идея с реврайтами относительно директории понятна)

2010/5/7 Igor Kasyanchuk <igorkas...@gmail.com>



--
С уважением,
Сергей Кузнецов.

Skype: kuznecov.sg
Homepage: http://www.summercode.ru/
E-mail: kuznecov.sg@gmail.com
Jabber: kuznecov.sg@gmail.com

Igor Kasyanchuk

unread,
May 7, 2010, 3:57:16 AM5/7/10
to RubyOnRails to russian
Спасибо за ответы, но это вроде не то.
Покажу больший кусок конфига:

server {
listen 80;
server_name site1.ua site2.ua; # для www*** редиректы
прописаны
root /wwwdata/site/public/;

if (-f $document_root/$host/$request_filename.html) {
rewrite ^(.*)$ $1.html break;
}

Как видно у меня один сервер на 2 сайта (site1.ua site2.ua)
Статика у мене лежит тут:
/wwwdata/site/public/site1.ua/hello.html
/wwwdata/site/public/site2.ua/hello.html

идет запрос http://site1.ua/hello
Мне надо проверить ести ли файл /$host/file.html и если есть - отдать
его. Все понятно, но я просто не знаю nginx и трудно написать
правильный конфиг. Метод проб и ошибок и гугл не помогли.
Если кто знает как написать условие проверки и rewrite - буду очень
признателен.
Спасибо


On May 7, 9:23 am, Sergey Kuznetsov <kuznecov...@gmail.com> wrote:
> Здравствуйте.
>
> Попробуйте так. Допустим, всю статику расположить в отдельной папке
> example.com/s (ну или целиком - static), а в конфиге nginx'а примерно так:
>
> server {
>  listen                 80;
>  server_name            example.com;
>  set $_application_root "/var/www/example.com/";
>
> rewrite ^/s/(.*) /css/$1 last;
>  rewrite ^/(.*) /$1 last;
>
> location /s/ {
>  root $_application_root;
>  }
>  location ~* ^.+\.(php)$ {
>  root    $_application_root;
>  fastcgi_index index.php;
>  set $_fastcgi_script_name $fastcgi_script_name;
>  include "/usr/local/nginx/conf/fcgi.conf";
>  }
>
> }
>
> (Конечно, пример, из мира PHP, но думаю, что идея с реврайтами относительно
> директории понятна)
>

> 2010/5/7 Igor Kasyanchuk <igorkasyanc...@gmail.com>

> E-mail: kuznecov...@gmail.com
> Jabber: kuznecov...@gmail.com

Akzhan Abdulin

unread,
May 7, 2010, 4:55:38 AM5/7/10
to ror...@googlegroups.com
Я думаю, наиболее просто всё-таки разнести конфиги для двух сайтов на два server, чтобы задать им разное расположение статики.

А приложение само, например, поднять, на localhost:8080, и туда форвардить все нестатичные запросы.


7 мая 2010 г. 11:57 пользователь Igor Kasyanchuk <igorkas...@gmail.com> написал:

Igor Kasyanchuk

unread,
May 7, 2010, 5:05:15 AM5/7/10
to RubyOnRails to russian
почему? на сервер 512 памяти, если будет 2 приложения по 2 воркера
пасижира то оно будет жрать в 2 раза больше памяти (может и не в 2 но
все равно больше). А когда будет 2 домена, 3, 4..... У меня нету 4гб
памяти что бы оно все работало так + как будет вести себя тот же
production.log ведь код лежит в одной папке.

поэтому и один сервер в конфиге.
кроме того есть переменная $host и папки со статикой которые как-раз
так и называются как домен.

вобщем надо написать правильно 2 строчки в конфиге .... но я не знаю
как ((


> Я думаю, наиболее просто всё-таки разнести конфиги для двух сайтов на два
> server, чтобы задать им разное расположение статики.
>
> А приложение само, например, поднять, на localhost:8080, и туда форвардить
> все нестатичные запросы.
>

Akzhan Abdulin

unread,
May 7, 2010, 5:18:33 AM5/7/10
to ror...@googlegroups.com
Приложение поднимите одно на 
server
{
  listen 8080;
  # your specifics
}

а на 
server
{
  server_name server1.ua;
  listen 80;
  location ~ /\.html$/ {
    root server1.ua.root;
  }
  location / {
    # Your rewrites
    proxy_pass localhost:8080;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
server
{
  server_name server2.ua;
  listen 80;
  location ~ /\.html$/ {
    root server2.ua.root;
  }
  location / {
    # Your rewrites
    proxy_pass localhost:8080;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Что-то в этом духе имею ввиду.

7 мая 2010 г. 13:05 пользователь Igor Kasyanchuk <igorkas...@gmail.com> написал:

Max Lapshin

unread,
May 7, 2010, 7:11:35 AM5/7/10
to ror...@googlegroups.com
server {
listen 80;
server_name msk.maxidoors.ru spb.maxidoors.ru;
location / {
set $fullpath /system/assets/$http_host$uri;
root /var/www/maxidoors/current/public;
try_files $uri $fullpath @maxidoors;
}

location @maxidoors {
root /var/www/maxidoors/current/public;
passenger_enabled on;
}
}

Об этом что ли речь?

Igor Kasyanchuk

unread,
May 8, 2010, 8:15:57 AM5/8/10
to RubyOnRails to russian
спасибо за ответ, но это не оно, все ресурсы(картинки,...) не
подтягиваются + не отдается статика.

вот мой теперешний конфиг:
вот так http://pastie.org/949894

папки статики тут:
/wwwdata/siteifua/public/site.if.ua/*.html
/wwwdata/siteifua/public/site.te.ua/*.html

картинки, css, js просто в папке
/wwwdata/siteifua/public/images
/wwwdata/siteifua/public/stylesheets
/wwwdata/siteifua/public/javascripts

Возможно кто-то приведет пример конфига который сработает для меня.
Спасибо!

Max Lapshin

unread,
May 8, 2010, 8:23:10 AM5/8/10
to ror...@googlegroups.com
Это почему не оно? У меня ситуация почти такая же и всё работает.
Сначала пробуем один путь, потом другой.

Igor Kasyanchuk

unread,
May 8, 2010, 8:57:22 AM5/8/10
to RubyOnRails to russian
у меня такая структура

папки статики тут (сюда ложится все что кешится через cache_pages):
/wwwdata/siteifua/public/site.if.ua/*.html
/wwwdata/siteifua/public/site.te.ua/*.html

картинки, css, js просто в папке
/wwwdata/siteifua/public/images
/wwwdata/siteifua/public/stylesheets
/wwwdata/siteifua/public/javascripts

атачменты для всех сайтов тут:
/wwwdata/siteifua/public/system/....

вобщем я попробовал то что вы написали но мне не отдавались ресурсы
из /wwwdata/siteifua/public/system/ и статика из /wwwdata/siteifua/
public/site.if.ua/*.html (тоесть запрос дайльше шел к рельсе, хотя
html-ка уже была)

возможно внести какие-то корективы можно? я по-этому и привожу конфиг
http://pastie.org/949894

Max Lapshin

unread,
May 8, 2010, 9:47:00 AM5/8/10
to ror...@googlegroups.com
Посмотрите на мой конфиг и обратите внимание на главную директиву: try

Igor Kasyanchuk

unread,
May 8, 2010, 10:21:03 AM5/8/10
to RubyOnRails to russian
вот тот конфиг что я использовал: http://pastie.org/951410

я вроде старался сделать все так-же, но оно не помогло. У меня есть
ошибка? Если можно объяснить как оно работает хочу знать как оно
работает а не переспрашивать по 100 раз.
Спасибо

Max Lapshin

unread,
May 8, 2010, 11:07:02 AM5/8/10
to ror...@googlegroups.com
2010/5/8 Igor Kasyanchuk <igorkas...@gmail.com>:

> вот тот конфиг что я использовал: http://pastie.org/951410
>
> я вроде старался сделать все так-же, но оно не помогло. У меня есть
> ошибка? Если можно объяснить как оно работает хочу знать как оно
> работает а не переспрашивать по 100 раз.
> Спасибо
>

Убери этот блок, пока делаешь тесты: # Add expires header for static content

включи отладку в nginx-е на полную и найдешь причину ошибки.

Igor Kasyanchuk

unread,
May 8, 2010, 11:44:53 AM5/8/10
to RubyOnRails to russian
> > я вроде старался сделать все так-же, но оно не помогло. У меня есть
> > ошибка? Если можно объяснить как оно работает хочу знать как оно
> > работает а не переспрашивать по 100 раз.
> > Спасибо
>
> Убери этот блок, пока делаешь тесты: # Add expires header for static content
>
> включи отладку в nginx-е на полную и найдешь причину ошибки.

как включить отладку? возможно вывести что-то в лог файл, значение
переменных?

Alexey Kovyrin

unread,
May 8, 2010, 11:48:24 AM5/8/10
to ror...@googlegroups.com
скомпилить (если еще не скомпилено) с --with-debug + сделать error_log
your/log/file/name.log debug; переменные оно само выведет

2010/5/8 Igor Kasyanchuk <igorkas...@gmail.com>:

--
Alexey Kovyrin
http://kovyrin.net/

arsen bagdasaryan

unread,
May 8, 2010, 3:24:57 PM5/8/10
to ror...@googlegroups.com
otmena

Igor Kasyanchuk

unread,
May 11, 2010, 3:36:35 PM5/11/10
to RubyOnRails to russian
вобщем все заработало, просто сел и решил разобраться со всем сам (ну
почти сам) .... взял за пример код Мах-а и вот что вышло - http://pastie.org/955858
(знаю там есть немного мусора в try_files, потом почищу) но зато оно
работает :)
Спасибо за помощь
Reply all
Reply to author
Forward
0 new messages