0

Apache2 + PHP 5.3 サーバーの前で Varnish 3.0 を実行しています。私の問題は、Varnish が多くの 503 Service Unavailable エラーをスローしたことだったので、次のような回避策を追加しました。

if http_code = 503 and cookie(REDIRECTED) = false
  set-cookie REDIRECTED=true
  header 307 redirect to same page // try again, maybe this time it doesn't fail
else if http_code = 503 and cookie(REDIRECTED) = true
  header 503 // we tried, but the server doesn't want to

これは、私が行ったことの主なアイデアの疑似コードのスケッチです。ただし、307 リダイレクトが行われている場合、Set-Cookieヘッダーで apache によって送信された Cookie は送信されません。私の主な懸念は、PHPSESSIDCookie が送信されていないことです。503 エラーが発生せず、Varnish がリダイレクトを行う必要がない場合、すべて正常に動作します。何か案は?

4

3 に答える 3

1

うまくいけば、私はあなたの質問を正しく理解しました。PHPSESSID が 503 エラーの処理にどのように関連しているかはよくわかりませんが、リクエストを再試行するために Cookie を使用する必要はまったくありません。

Varnish で再起動を使用して、やろうとしていることを達成できます。たとえば、リクエストを 2 回試行するには、次のようにします。

sub vcl_error {
    if (obj.status == 503 && req.restarts < 2) {
        return (restart);
    }
}

これにより、Cookie に触れることなく、探している機能が提供されるはずです。

これは明らかですが、とにかく言います。本当にすべきことは、503 エラーの原因を突き止めることです。バックエンドから送信されていない場合は、タイムアウトまたは Varnish 構成の問題が原因です。「TxStatus c 503」行の Varnish ログを監視し、リクエストで何が起こっているかを確認してください。

503 エラーの考えられる原因に関する更新:

どうやら、POST リクエスト (ユーザーがログインしようとしたとき) で 503 エラーを受け取っているようです。これは、投稿が低速リンクで行われた場合、または POST 本文が完全に転送される前に何らかの理由でクライアントによって接続が終了された場合に発生する可能性があります。ただし、これはno error recordedvarnishlog のようには表示されません。問題が解決するかどうかを確認するために、いずれにしても次のことを試してみてください。

Varnish はデフォルトで POST リクエストに対して return(pass) を返しますが、これはすべての場合で期待どおりに機能しません (詳細については、Varnish チケット #849を参照してください)。

すべての POST リクエストをパイプし、X-Forwarded-For をリクエストに追加することも選択しました。関連する VCL は次のとおりです。

# PIPE all POST requests

sub vcl_recv {
 if (req.request == "POST") {
   return (pipe);
 }
}

# Set XFF for piped requests

sub vcl_pipe {
  set bereq.http.Connection = "close";
  set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
  if (bereq.http.x-forwarded-for) {
    set bereq.http.X-Forwarded-For = bereq.http.X-Forwarded-For + ", " + client.ip;
  } else {
    set bereq.http.X-Forwarded-For = client.ip;
  }
  return (pipe);
}
于 2012-08-30T07:31:13.427 に答える
0

これを修正できる唯一の方法は、vmod-headersと呼ばれるニスモジュールをインストールすることでした。これにより、ヘッダーを他のヘッダーに追加できます。

その後、設定したいCookieを、バックエンドから送信された既存のCookieに追加しました。

于 2012-08-30T12:48:56.207 に答える
-1

デフォルトのvclは、Cookieを削除したり、キャッシュヘッダーのないページをキャッシュしたりしないでください。

ニスから503を取得する理由は、apacheが時間内に応答しないためです。より寛容にしたい場合は、バックエンドの次の設定(下の非常に高い)を変更できます。

backend www {
    .host = "www.example.com";
    .port = "http";
    .connect_timeout = 500s;    
    .first_byte_timeout = 500s;
    .between_bytes_timeout =500s;
}
于 2012-08-24T21:44:40.863 に答える