2009-07-24 2 views
3

Я пытаюсь перейти на nginx из Apache, используя Passenger в обоих случаях для размещения приложения Rails. Приложение принимает запрос, который предназначен для изображения, если изображение существует в/system/logos/$ requestimage, тогда оно должно быть обслужено, или ему должно быть позволено попасть в приложение Rails, чтобы сгенерировать его, если это необходимо (где оно тогда cached to/system/logos).nginx переписывать правила с помощью Passenger

В Apache я использовал следующее:

RewriteCond %{DOCUMENT_ROOT}/system/logos/%{REQUEST_FILENAME} -f 
RewriteRule ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 

Это работало отлично. Активы. subdomain - это еще один поддомен, но с одним и тем же корнем, просто отключенный Пассажир, специально настроенный для размещения статических файлов (по истечении срока действия).

В Nginx Я использую следующие:

server { 
    listen 80; 
    passenger_enabled on; 
    server_name clg.eve-metrics.com www.clg.eve-metrics.com; 
    root /opt/www/clg/current/public; 
    gzip    on; 
    gzip_min_length 1000; 
    gzip_proxied  expired no-cache no-store private auth; 
    gzip_types  text/plain application/xml text/css application/javascript; 
    gzip_disable  msie6; 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
    } 
    if (-f $document_root/system/logos$request_filename) { 
    rewrite ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 break; 
    } 
} 

Это не работает так хорошо. На самом деле. Он никогда не перенаправляется на кешированный путь, и он никогда не попадает в приложение Rails. Это похоже на то, что nginx предполагает, что это статический актив, поэтому он не передает его пассажиру. Есть ли способ остановить это поведение, чтобы он попадал в приложение?

ответ

4

Приложение для рельсов работает на nginx и на пассажирском. Я переместил директорию кеша рельсов по умолчанию /public в /public/system/cache/. Для того, чтобы заставить его работать, я должен был вставить это в мой конфигурационный файл ВХост:

if (-f $document_root/system/cache/$uri/index.html) { 
    rewrite (.*) /system/cache/$1/index.html break; 
} 

if (-f $document_root/system/cache/$uri.html) { 
    rewrite (.*) /system/cache/$1.html break; 
} 

Я помню, что я тоже пытался заставить его работать с $request_filename, но не получил его на работу. Попробуйте с $uri вместо и посмотреть, если он работает :-)

+0

У меня была такая же проблема, и я новичок в Nginx, так что это сработало отлично. Благодарю. – jspooner

+0

Какая директива была внутри nginx.conf? – Nick

0

Джеймс, пожалуйста, попробуйте этот файл конфигурации https://gist.github.com/711913 и обратить внимание на этом месте конфигурации:

location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ { 
     access_log off; 
     expires max; 
     add_header Cache-Control public; 
    } 

пассажир не позволит Rails управлять своими если у вас есть права доступа (пользовательский запуск nginx должен иметь права доступа к файлу напрямую)

 Смежные вопросы

  • Нет связанных вопросов^_^