2017-03-04 5 views
2

サイトでメンテナンスを行い、サーバーを再起動すると、NGINXが502の不正なゲートウェイエラーを返すことがあります。重い負荷のもとで同じことが起こることがあります。これはおそらく一時的な問題ではないとわかっている訪問者には混乱します。サイトが戻ったときに訪問者に自動的にページを更新させる方法はありますか?502ページの自動更新NGゲートウェイエラー

答えて

1

これは、Javascriptを使用して現在のページのHTTPステータスコードを確認し、サーバーがバックアップされたときにページを更新する(つまり、200 OKステータスコードを返す)ことで実現できます。多くのユーザーが502エラーページをすぐに見つけたときにサーバーを叩くのを避けるため、truncated binary exponential backoffアルゴリズムを使用することをおすすめします。これは、再試行の間隔が毎回倍になって、あらかじめ設定された最大値に達することを意味し、サーバーの全体的な負荷を低下させます。

以下のコードは、AJAXの現在のページのHTTPステータスが200 OKになるまでチェックします。この場合、ページを更新してライブバージョンを取得します。 502に遭遇した場合、8秒間隔で開始し、16,32、...、4096秒後に4096秒間隔(約68分間)で無制限に再試行して再試行を試みます。 502または200以外のコードが検出された場合、再試行プロセスは自動的に中止されます(ただし、必要に応じてcaseステートメントでこれを変更できます)。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Currently unavailable</title> 
</head> 
<body> 
    <h1>Site currently unavailable (code 502)</h1> 

    <p>This page will refresh when the site is back.</p> 

    <noscript>Your browser doesn’t support javascript. Please try refreshing the page manually every few minutes.</noscript> 

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script> 
    /* Set starting and maximum retry times in seconds */ 
    var retry_current = 8, // first refresh at 8 seconds 
     retry_max = 4096, // refresh time truncated at about 68 minutes 
     check_response = function() { 
     $.ajax(
      { 
       url: window.location.href, 
       type: "HEAD", 
       complete: function (jqXHR) { 
        switch (jqXHR.status) { 
         case 200: 
          window.location.reload(true); 
          break; 
         case 502: 
          if(retry_current < retry_max) { 
           retry_current *= 2; 
          } 
          setTimeout(check_response, retry_current * 1000); 
        } 
       } 
      }); 
     }; 
    setTimeout(check_response, retry_current * 1000); 
    </script> 
</body> 
</html> 

あなたはnginxのを使用している場合は、ページを使用するように設定ファイルに以下を追加することができます。

error_page 502 /502.html; 
location = /502.html { 
    alias /path/to/502.html; 
} 
関連する問題