特定の URL パターン ( /scripts/.*\.meta\.js
) に対して、次のような動作を実現したいと思います。
- URL に特定のパラメータ (
version
) が含まれている場合は、Passenger にリクエストを渡して処理させます。 - URL に特定のパラメータが含まれず、キャッシュされたファイルが存在する場合は、それを提供します。
- URL に特定のパラメータが含まれず、キャッシュされたファイルが存在しない場合は、Passenger に処理を要求します。
これを実行するのは、Passenger とその背後にある Rails アプリがこのパスへのリクエストの大部分を処理する必要がないようにして、パフォーマンスを向上させるためです。
私の nginx conf ファイルは次のとおりです:
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;
}
}
テスト ファイルを の下に配置しました/path/to/rails/public/a
。これにより、次の動作が行われます。
- ✓ URL に特定のパラメータ (
version
) が含まれている場合は、Passenger にリクエストを渡して処理させます。 - ✓ URL に特定のパラメータが含まれず、キャッシュされたファイルが存在する場合は、それを提供します。
- ❌ URL に特定のパラメータが含まれず、キャッシュされたファイルが存在しない場合は、Passenger に処理を要求します。実際の動作: HTTP 401。
私が持っている方法は、 で Passenger を参照する正しい方法ではないようですtry_files
。これを機能させるには何をする必要がありますか?
答え1
try_files
私は、 は試すべき「もの」のリストであり、任意の位置に名前付き場所を配置できるという印象を持っていました。Michael Hampton がコメントで指摘しているように、これは誤りです。名前付き場所と HTTP コードは、 の最後の位置にのみ配置できますtry_files
。最後の位置にないものは、ファイル パスである必要があります。したがって、try_files /a$uri @passenger
意図したとおりに動作します。
@passenger
ブロックから継承された構成を内部で繰り返す必要もありませんserver
。したがって、動作する構成は次のようになります。
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;
}
}