2017-03-04 7 views
2

Wenn ich Wartungsarbeiten an meiner Site durchführe und den Server neu starte, gibt NGINX manchmal einen 502 Bad Gateway-Fehler zurück. Das Gleiche passiert manchmal unter schwerer Belastung. Das ist verwirrend für meine Besucher, die nicht wissen, dass das Problem wahrscheinlich nur vorübergehend ist. Gibt es eine Möglichkeit, dass Besucher die Seite automatisch aktualisieren können, wenn die Website wieder verfügbar ist?Seite automatisch aktualisieren bei 502 Bad Gateway-Fehler

Antwort

1

Sie können dies erreichen, indem Sie Javascript verwenden, um den HTTP-Statuscode für die aktuelle Seite zu überprüfen, und die Seite aktualisieren, wenn der Server wieder aktiv ist (z. B. den Statuscode). Um zu vermeiden, den Server zu hämmern, wenn viele Benutzer die 502 Fehlerseite gleichzeitig erfahren, würde ich den Algorithmus truncated binary exponential backoff empfehlen. Dies bedeutet, dass sich die Zeit zwischen den Wiederholungen jedes Mal bis zu einem voreingestellten Maximum verdoppelt, was die Gesamtbelastung Ihres Servers verringert.

Der folgende Code prüft den HTTP-Status der aktuellen Seite über AJAX, bis er 200 OK zurückgibt. In diesem Fall wird die Seite aktualisiert, um die Live-Version zu erhalten. Es wird versuchen, es erneut zu versuchen, wenn eine 502 auftritt, beginnend mit einem Intervall von 8 Sekunden, dann 16, 32, ..., 4096 Sekunden, dann mit unbegrenzten nachfolgenden Wiederholungen in Intervallen von 4096 Sekunden (etwa 68 Minuten). Wenn ein anderer Code als 502 oder 200 auftritt, wird der Wiederholungsversuch automatisch abgebrochen (obwohl Sie dies bei Bedarf mit weiteren case Anweisungen ändern könnten).

<!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> 

Wenn Sie nginx verwenden, können Sie die folgende in der Konfigurationsdatei hinzufügen können, um die Seite zu verwenden:

error_page 502 /502.html; 
location = /502.html { 
    alias /path/to/502.html; 
} 
Verwandte Themen