PHPマシンの前にVarnishのセットアップがあります。ページの 98% で、単一の要求タイムアウト ( req.connect_timeout
VLC で) が機能します。ただし、タイムアウトするまでに最大 3 分かかると予想されるページがいくつかあります。Varnish で特定のリクエストに対して req.connection_timeout を設定する方法はありますか? もしそうなら、VCLで光を見せてください。すべてのページで同じに保ちたいのですreq.connect_timeout
が、これらのいくつかの特定のページではその数を増やします.
5 に答える
残念ながら、これはワニス> 3では機能しません
とても悲しい。v>3.0 でこれを実際に達成する方法はないようです。この問題について何時間も前から頭を悩ませています。
私は今解決策を持っています:
vcl_miss を使用してください。
以下に例を示します。
sub vcl_recv {
set req.backend = director_production;
if (req.request == "POST") {
return(pipe);
}
else {
return(lookup);
}
}
sub vcl_miss {
if (req.url ~ "/longrunning") {
set bereq.first_byte_timeout = 1h; # one hour!
set bereq.between_bytes_timeout = 10m;
} else {
set bereq.first_byte_timeout = 10s;
set bereq.between_bytes_timeout = 1s;
}
}
これは私にとってはうまくいきます。私が心配したのは、varnish のドキュメントに、am オブジェクトがキャッシュに見つからない場合は常に vcl_miss が呼び出されると記載されていることです。私の最初のバージョンでは、vcl_recv の if/else を省略しました。その後、(もう一度)ドキュメントが間違っていることを経験しなければなりませんでした。「return(lookup)」を明示的に述べる必要があります。それ以外の場合、vcl_miss は呼び出されません。:(
Varnish で複数のバックエンドをそれぞれ異なるタイムアウトで宣言することで解決しますが、おそらくまったく同じ IP とサーバーを参照しています。次に、特定の URL に新しいバックエンドを設定して、そこで宣言されたタイムアウトを強制的に使用することができます。
if (req.url ~ "[something]") {
set req.backend = backend_with_higher_timeout;
}
connection_timeout はバックエンドへの接続を設定する時間を制限し、first_byte_timeout と between_bytes_timeout は処理時間を制限すると思います。vcl_recv でプログラムで bereq.first_byte_timeout を設定しようとしましたか? たとえば、次のようなものがあります。
backend mybackend {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 100ms;
.first_byte_timeout = 5s;
.between_bytes_timeout = 5s;
}
sub vcl_recv {
set req.backend = mybackend;
if ( req.url ~ "/slowrequest" ) {
# set req.connect_timeout = 180s; # old naming convention?
set bereq.connect_timeout = 180s;
}
# .. do default stuff
}
それが機能するかどうか教えてください...