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_files
es 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 @passenger
Funktioniert also so, wie ich es beabsichtige.
Es ist auch nicht notwendig, die Konfiguration darin zu wiederholen, @passenger
da sie vom server
Block ü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;
}
}