2016-05-15 9 views
1

私は1つのドメインに複数のサイトをプロキシングするためにngingの背後にワニス3を使用しています。 基本的な設定はうまくいきますが、ファイル名が既にキャッシュに存在する場合は、間違ったファイルを処理するニスに問題があります。 は基本的に私は私のdefault.vclで行うすべてはこれです:私は今/foo1/index.htmlを呼び出す場合ワニスは間違ったファイルを提供します

if(req.url ~ "^/foo1") { 
     set req.backend = foo1; 
     set req.url = regsub(req.url, "^/foo1/", "/"); 
    } 
    else if(req.url ~ "^/foo2") { 
     set req.backend = foo2; 
     set req.url = regsub(req.url, "^/foo2/", "/"); 
    } 

、/foo2/index.htmlは、同じファイルを提供します。ワニスの再起動と/foo2/index.htmlの呼び出し後、/foo1/index.htmlはfoo2のindex.htmlを提供します。

11 VCL_call  c hash 
    11 Hash   c /index.html 
    11 Hash   c mydomain 

私はこの問題を解決:私の知る限り、これは使用したバックエンドを尊重するだけで(短縮後の)URLやドメインいないハッシュの作成に問題があるがわかったとして

より良い、より便利な方法がなければならない、私は確信しているだけでなく、バ​​ックエンドを使用するために私のvcl_hashを変更することによって、今のところ:

sub vcl_hash { 
     hash_data(req.url); 
     hash_data(req.backend); 
    } 

どれヒントをいただければ幸いです、どうもありがとうございました!

答えて

1

これには2通りの方法があります。最初に、などの余計な値をvcl_hashに追加して、提案したことを行うことです。

sub vcl_hash { 
    hash_data(req.url); 
    hash_data(req.backend); 
} 

第二の方法は、ないvcl_recvreqが、vcl_miss/passでのみbereqを更新することです。

sub vcl_urlrewrite { 
    if(req.url ~ "^/foo1") { 
     set bereq.url = regsub(req.url, "^/foo1/", "/"); 
    } 
    else if(req.url ~ "^/foo2") { 
     set bereq.url = regsub(req.url, "^/foo2/", "/"); 
    } 
} 
sub vcl_miss { 
    call vcl_urlrewrite; 
} 
sub vcl_pass { 
    call vcl_urlrewrite; 
} 
sub vcl_pipe { 
    call vcl_urlrewrite; 
} 

この第2のアプローチでは、より多くのVCLが必要ですが、利点もあります。たとえば、ログをvarnishlogで分析すると、バニラリクエスト(cカラム)と更新されたバックエンドリクエスト(bカラム)が表示されます。

$ varnishlog /any-options-here/ 
(..) 
    xx RxURL  c /foo1/index.html 
(..) 
    xx TxURL  c /index.html 
(..) 
$ 
+0

ありがとうございます! 2番目のアプローチは見た目が良く、うまく動作し、テストされました! – deveth0

関連する問題