出现 502 Bad Gateway 错误时自动刷新页面

cur*_*çao 5 javascript http nginx

当我\xe2\x80\x99m 在我的站点上进行维护并重新启动服务器时,有时 NGINX 返回 502 Bad Gateway 错误。在重负载下有时也会发生同样的事情。这让我的访客感到困惑,他们没有意识到这个问题可能是暂时的。有什么方法可以让访问者在网站恢复时自动刷新页面吗?

\n

lub*_*tep 5

您可以通过使用 Javascript 检查当前页面的 HTTP 状态代码并在服务器备份时刷新页面(即返回状态代码200 OK)来实现此目的。502为了避免当许多用户同时遇到错误页面时对服务器造成影响,我\xe2\x80\x99d建议使用截断二进制指数退避算法。这意味着每次重试之间的时间都会加倍,直到达到预设的最大值,从而降低服务器的总体负载。

\n\n

下面的代码通过 AJAX 检查当前页面的 HTTP 状态,直到返回200 OK,在这种情况下,\xe2\x80\x99 将刷新页面以获取实时版本。502如果遇到a,它将尝试重试,从 8 秒间隔开始,然后是 16, 32, \xe2\x80\xa6, 4096 秒,然后以 4096 秒间隔(大约 68 分钟)进行无限制的后续重试。502如果遇到除或以外的任何代码200,重试过程将默默中止(尽管case如果需要,您可以使用更多语句更改此设置)。

\n\n
<!DOCTYPE html>\n<html lang="en">\n<head>\n  <meta charset="UTF-8">\n  <title>Currently unavailable</title>\n</head>\n<body>\n  <h1>Site currently unavailable (code 502)</h1>\n\n  <p>This page will refresh when the site is back.</p>\n\n  <noscript>Your browser doesn\xe2\x80\x99t support javascript. Please try refreshing the page manually every few minutes.</noscript>\n\n  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>\n  <script>\n  /* Set starting and maximum retry times in seconds */\n  var retry_current = 8, // first refresh at 8 seconds\n      retry_max = 4096, // refresh time truncated at about 68 minutes\n      check_response = function() {\n      $.ajax(\n          {\n              url: window.location.href,\n              type: "HEAD",\n              complete: function (jqXHR) {\n                  switch (jqXHR.status) {\n                      case 200:\n                          window.location.reload(true);\n                          break;\n                      case 502:\n                          if(retry_current < retry_max) {\n                              retry_current *= 2;\n                          }\n                          setTimeout(check_response, retry_current * 1000);\n                  }\n              }\n          });\n      };\n    setTimeout(check_response, retry_current * 1000);\n    </script>\n</body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您\xe2\x80\x99使用nginx,则可以将以下内容添加到配置文件中以使用该页面:

\n\n
error_page 502 /502.html;\nlocation = /502.html {\n  alias /path/to/502.html;\n}\n
Run Code Online (Sandbox Code Playgroud)\n