Estoy usando Nginx 0.7.64, Passenger 2.2.9, Rails 2.3.5. Tengo el directorio de almacenamiento en caché de mi página configurado en /public/cache y me gustaría poder servir páginas en caché cuando se solicitan a través de HTTP, pero siempre accedo a la aplicación Rails cuando se solicita a través de HTTPS.
La mayor parte de mi configuración se ve así:
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;
}
Anticipo que cuando solicito website.com/about, debería recibir /public/cache/about.html, pero en lugar de eso accedo al servidor Rails (el seguimiento del registro lo muestra).
Pensando que podría tener una barra diagonal inapropiada (y no la veo $document_root
en la mayoría de los ejemplos), también probé todas las siguientes variaciones, ninguna de las cuales funciona:
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 incluido las reglas root
, passenger_enabled
y reescritura en un location /
bloque separado, pero eso tampoco funciona. También reordené las declaraciones para que passenger_enabled
aparecieran al final. También intenté usar $uri
. ¡Claramente estoy entendiendo mal algo!
Esto está un poco simplificado, ya que también tengo una API XML que se almacena en caché en algunos lugares (presumiblemente, la regla de reescritura será la misma excepto por las .html
partes), y también tendré que servir cuando se solicite public/cache/index.html
la raíz . website.com
Solo quiero que funcione cualquier pieza. :)
¡Cualquier ayuda es apreciada!
Actualizar
El condicional
if (-f $document_root/cache$request_uri.html)
¡Parece funcionar! Sin embargo, lo que creo que sería la reescritura no funciona. Intentando
if (-f $document_root/cache$request_uri.html) {
rewrite (.*) /cache$1.html break;
break;
}
Reescribe la URL /cache/cache/about.html.html
y la envía a Rails, que rápidamente vomita. Parece duplicado, ¡sí! Pero si reescribo solo /cache$1
lo envía /cache/cache/about
a Rails, y $1.html
lo envía /about.html.html
a Rails, y simplemente $1
envía /about
lo que va a Rails y no llega al caché. Obviamente, este no es un comportamiento correcto. ¿Nginx lo está reescribiendo y luego Passenger también lo está reescribiendo?
Respuesta1
La respuesta se encontró aquí: https://stackoverflow.com/questions/1177979/nginx-rewrite-rules-with-passenger
La configuración 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;
}
Respuesta2
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 podría funcionar o no con el pasajero. Sin embargo, estoy seguro de que funciona con unicornios, mestizos, etc.