yokila
yokila
Published on 2024-03-28 / 19 Visits
0
0

Nginx “正在维护中”页面

本文介绍 Linux环境 通过 Nginx配置,使得在Web网站维护过程中,可以自动返回一个维护中的页面,以提高用户体验。

系统维护中会怎样

现在假设,我们用Nginx给一个Web服务端做了反向代理。

如果一切正常,那么浏览器访问时,出来的会是正常的页面。

但是,如果我们现在要对服务端进行更新升级,那么,就可能会需要把服务进行停止。

如果服务停止了,通过浏览器访问就会出现这种画面:

“系统正在维护中"页面示例

既然是要显示一个页面,那么我们就需要先写一个这样的页面,本节就是一个简单示例。

浏览器中显示内容如图:

源码(请自行修改保存到一个 xxx.html 文件中,文件命名可自定义,这里假设是 maintenance.html):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>网站维护中</title>
  <style>
    /* 基础样式 */
    body, html {
      margin: 0;
      padding: 0;
      height: 100%;
      font-family: Arial, sans-serif;
    }
    .container {
      position: relative;
      height: 100vh;
      background-color: #f2f3f5;
      color: #030000;
      text-align: center;
    }
    /* 垂直居中内容 */
    .content {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
    h1 {
      font-size: 3em;
      margin-bottom: 10px;
    }
    p {
      font-size: 1.5em;
    }
    /* 闪烁动画 */
    .content span {
      animation: blink 1.5s linear infinite;
    }
    @keyframes blink {
      0%, 100% { opacity: 1; }
      50% { opacity: 0; }
    }
  </style>
  <meta charset="UTF-8">
</head>
<body>

  <div class="container">
    <div class="content">
      <h1><span>xxx网站正在维护中</span></h1>
      <p>感谢您的访问!网站当前正在例行维护。</p>
      <p><font color='orange'><b>请稍后再来访问</b></font></span></p>
    </div>
  </div>

</body>
</html>

Nginx 配置

注:如果服务有区分网关服务器、应用服务器,则本文的示例适用于配置在应用服务器上。

注:不管是放在哪个服务器上,都要注意 Nginx的用户(通常是叫 nginx) 是否有访问 maintenance.html 文件的权限。(如果你弄不来,或者怎么弄都有问题,就把这个文件放置到 /usr/share/nginx/html/ 这个目录底下,然后保持权限信息和原来的 50x.html 和 index.html 一致就好,因为这个就是 Nginx 默认的报错和首页目录,你如果没有乱搞的话,正常就是能读取里面的文件)

先把前文生成的 maintenance.html 文件上传到服务器上(依据个人喜好放置在某个位置,记住放置目录即可)

例如这里假设路径是:

然后进入你的Nginx的配置文件里(默认Nginx的各个配置文件所在目录:/etc/nginx/conf.d/):

比如这是一个服务代理配置(HTTP):

在原有基础上,加上对 特定错误码 的情况进行处理后:

server {
  # HTTP默认访问80端口
  listen 80;
  # IPv6地址格式,这里忽略
  # listen [::]:80;
  server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址
  
  # on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
  underscores_in_headers on; 

  charset utf-8;

  # 设置客户端请求body的最大允许大小,默认1m
  client_max_body_size 100m;

  # 内部进行转发
  location / {
    proxy_pass http://127.0.0.1:8080; # 转发到服务器内部真正处理业务的服务监听的端口
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    error_page 502 503 /maintenance.html; # 如果出现的是 502、503 错误码,则重定向到对应页面
  }

  # 定义维护中的页面的访问路径
  location = /maintenance.html { # maintenance.html 是文件名,请依据实际情况修改
    root /apps/temp/maintenance; # 维护中文件所在的目录路径
    internal; # 表示这个访问路径的定义只针对内部请求,外部请求无效
  }
}

其实就只是增加了这些内容:

注:

  • 记得修改完先保存,然后执行 nginx -t nginx -s reload 更新Nginx加载的配置信息。

  • Nginx 的 error_page 更详细的内容,请阅读官方文档。

  • Nginx的 internal 更详细的内容,请阅读官方文档。

  • 关于服务端出错的HTTP状态码,可参考文档:服务端错误响应

  • 这里仅针对易出现的502、503状态码进行处理,实际可以自行增加其他的错误码。其实也可以仿照这个例子,自定义更多错误码情况下的重定向页面。

再访问停止了的服务

现在就是我们自定义的”维护中“页面了。

image-pthu.png


Comment