6 votos

¿Qué le debería decir a mi Nginx reglas de reescritura de ser para los Raíles de los Pasajeros de la página almacenamiento en caché en un subdirectorio?

Estoy usando el Nginx 0.7.64, Pasajero 2.2.9, Rails 2.3.5. Yo tengo mi página de almacenamiento en caché conjunto de directorios en /public/cache, y me gustaría ser capaz de servir páginas en caché cuando se solicita a través de HTTP, pero siempre golpear la aplicación Rails cuando se solicita a través de HTTPS.

La mayor parte de mi config se parece a esto:

server {
  listen 80;
  server_name website.com www.website.com;
  proxy_set_header X-Forwarded-Proto http;
  root /home/deploy/website/current/public;
  passenger_enabled on;

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

server {
  listen       443;
  server_name website.com www.website.com;
  root /home/deploy/website/current/public;
  passenger_enabled on;
  proxy_set_header X-Forwarded-Proto https;

  ssl                  on;
  ssl_certificate      /home/deploy/website/shared/ssl/www.website.com.combined.crt;
  ssl_certificate_key  /home/deploy/website/shared/ssl/www.website.com.key;
}

Espero que cuando yo solicitud website.com/about yo debería estar servida /public/cache/about.html pero en lugar de chocar con el servidor Rails (tras la de registro de la muestra).

Pensar que yo podría tener una inadecuada slash (y no ver $document_root en la mayoría de los ejemplos), también he probado todas las siguientes variaciones, ninguno de los cuales trabajar:

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

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

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

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

También he tirado de la root, passenger_enabled, y las reglas de reescritura en un location / bloque, pero que también no funciona. También he reordenado las declaraciones de modo que passenger_enabled llegaría al final. También he intentado usar $uri. Claramente yo estoy entendiendo algo!

Esto es un poco simplificado, ya que también tiene una api XML que se almacena en lugares (es de suponer que la regla de reescritura será el mismo a excepción de la .html partes), así como que voy a necesitar para servir a public/cache/index.html cuando la root de website.com es requerido. Sólo quiero conseguir cualquier pieza de trabajo. :)

Cualquier ayuda es muy apreciada.

Actualización

El condicional

if (-f $document_root/cache$request_uri.html)

Parece que funciona! Sin embargo, lo que yo creo que sería la reescritura no funciona! Tratando de

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

Vuelve a escribir la URL de la /cache/cache/about.html.html y la envía a los Rieles, que rápidamente se barfs. Se ve duplicado, sí! Pero si debo escribir a sólo /cache$1 envía /cache/cache/about a los Rieles, y $1.html envía /about.html.html a los Rieles, y sólo $1 envía simplemente /about que va a Rails y no de aciertos de la caché. Obviamente este no es el comportamiento correcto Es Nginx escribirlo y luego de Pasajeros es la reescritura, también?

4voto

Ben Puntos 31

try_files versión:

server {
  listen 80;
  server_name website.com www.website.com;
  location / {
    root /home/deploy/website/current/public;
    try_files $uri /cache/$uri/index.html /cache/$uri.html /cache/$uri @passenger;
  }
  location @passenger {
    root /home/deploy/website/current/public;
    proxy_set_header X-Forwarded-Proto http;
    passenger_enabled on;
  }
}

tenga en cuenta que puede o no funcionar con el pasajero. Estoy seguro de que funciona con el unicornio, mestizos, etc, aunque.

1voto

Ian Terrell Puntos 141

La respuesta fue encontrada aquí: http://stackoverflow.com/questions/1177979/nginx-rewrite-rules-with-passenger

La config que terminó siendo:

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

# pages like /about, cached with .html but accessed without
if (-f $document_root/cache/$uri.html) {
  rewrite (.*) /cache/$1.html break;
}

# pages like /api/v1/something.xml, cached as xml
if (-f $document_root/cache/$uri) {
  rewrite (.*) /cache/$1 break;
}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: