nginx/Passenger: Bereitstellung einer zwischengespeicherten Datei nur, wenn ein Parameter nicht in der Anforderung enthalten ist

nginx/Passenger: Bereitstellung einer zwischengespeicherten Datei nur, wenn ein Parameter nicht in der Anforderung enthalten ist

Für ein gegebenes URL-Muster ( /scripts/.*\.meta\.js) hätte ich gerne folgendes Verhalten:

  • Wenn die URL einen bestimmten Parameter ( version) enthält, geben Sie die Anfrage zur Bearbeitung an Passenger weiter.
  • Wenn die URL diesen spezifischen Parameter nicht enthält und eine zwischengespeicherte Datei vorhanden ist, stellen Sie diese bereit.
  • Wenn die URL diesen spezifischen Parameter nicht enthält und keine zwischengespeicherte Datei vorhanden ist, geben Sie die Anfrage an Passenger zur Bearbeitung weiter.

Ich mache das, um die Leistung zu verbessern, indem ich vermeide, dass Passenger und die dahinter stehende Rails-App den Großteil der Anfragen an diesen Pfad bearbeiten müssen.

Meine Nginx-Konfigurationsdatei lautet:

server {

  listen 80;
  server_name my.site;

  root /path/to/rails/public;
  passenger_enabled on;
  rails_env development;
  passenger_min_instances 1;

  client_max_body_size 5m;

  location ~* /scripts/.*\.meta\.js {

    error_page 418 = @noparams;

    if ( $arg_version = '' ) {
      return 418;
    }
  }

  location @passenger {
    root /path/to/rails/public;
    proxy_set_header X-Forwarded-Proto http;
    passenger_enabled on;
  }

  location @noparams {
    try_files  /a$uri @passenger =401;
  }

}

Ich habe Testdateien unter abgelegt /path/to/rails/public/a. Dies führt zu folgendem Verhalten:

  • ✓ Wenn die URL einen bestimmten Parameter ( version) enthält, geben Sie die Anfrage zur Bearbeitung an Passenger weiter.
  • ✓ Wenn die URL diesen spezifischen Parameter nicht enthält und eine zwischengespeicherte Datei vorhanden ist, stellen Sie diese bereit.
  • ❌ Wenn die URL diesen spezifischen Parameter nicht enthält und keine zwischengespeicherte Datei vorhanden ist, geben Sie die Anfrage an Passenger zur Bearbeitung weiter.Tatsächliches Verhalten: HTTP 401.

Es scheint, dass das, was ich habe, nicht die richtige Art ist, Passenger in zu referenzieren try_files. Was muss ich tun, damit das funktioniert?

Antwort1

Ich hatte den Eindruck, dass try_fileses sich um eine Liste von „Dingen“ handelt, die man ausprobieren kann, und dass man an jeder beliebigen Stelle einen benannten Ort angeben kann. Wie Michael Hampton in einem Kommentar anmerkt, ist das falsch. Benannte Orte und HTTP-Codes können nur an der letzten Stelle in stehen try_files; alles, was nicht an der letzten Stelle steht, muss ein Dateipfad sein. try_files /a$uri @passengerFunktioniert also so, wie ich es beabsichtige.

Es ist auch nicht notwendig, die Konfiguration darin zu wiederholen, @passengerda sie vom serverBlock übernommen wird. Eine funktionierende Konfiguration sieht also so aus:

server {

  listen 80;
  server_name my.site;

  root /path/to/rails/public;
  passenger_enabled on;
  rails_env development;
  passenger_min_instances 1;

  client_max_body_size 5m;

  location ~* /scripts/.*\.meta\.js {

    error_page 418 = @noparams;

    if ( $arg_version = '' ) {
      return 418;
    }
  }

  location @passenger { }

  location @noparams {
    try_files  /a$uri @passenger;
  }

}

verwandte Informationen