包含内容问题的nginx维护页面

Wil*_* E. 17 maintenance nginx

要在部署期间显示维护页面,我总是在nginx中使用下一个配置:

if (-f /home/shared/system/maintenance.html) {
    return 503;
}

error_page 503 @maintenance;

location @maintenance {
    root /home/shared/errors;
    rewrite ^(.*)$ /maintenance.html break;
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我需要将静态内容添加到维护页面(图像,样式表等)

在error.log中,静态内容的数量不适用于此类日志:

2011/05/05 02:47:20 [notice] 13760#0: *6 "^(.*)$" matches "/some.jpg", client: x.x.x.x, server: server.com, request: "GET /some.jpg HTTP/1.1", host: "server.com"
2011/05/05 02:47:20 [notice] 13760#0: *6 rewritten data: "/maintenance.html", args: "", client: x.x.x.x, server: server.com, request: "GET /some.jpg 2 HTTP/1.1", host: "server.com"
Run Code Online (Sandbox Code Playgroud)

这是合乎逻辑的 - 如果我将所有内容重写为maintenance.html,则意味着静态内容不会被排除.

但我找不到任何适当的解决方案来重定向到每个文件,除了那些实际存在于root /home/shared/errors文件夹中的文件.

PS./home/shared/errors不与公共项目文件夹共享任何资源 - 这是完全独立的文件夹(即使没有/current项目的任何符号链接).

Wil*_* E. 11

对不起,Frank Farmer,但这不起作用.

什么有效但不那么整洁:

请求如何工作 - >

  1. 我使用规则#1

    if (-f /home/shared/system/maintenance.html) {
        return 503;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这个规则有一个支持命名的位置location @maintenance,并为共同重定向到/maintenance.htmlroot /home/shared/errors一切工作.

  2. 此页面包含和图像some.jpg- 要接收此图像浏览器启动新请求,此新请求再次点击规则#1

    所有这些都在最初的问题中描述了

    如果我if在Frank Farmer的答案中使用了一些魔法,我可以将服务器指向请求的文件但是HTTP回答将是503和浏览器(所有,除了Safari,在我的测试中)在调试控制台中抛出错误并且显示图像但不处理CSS-文件处于相同的情况.

    这很关键.

  3. 我尝试使用location magic来解决这个问题 - 我的新内容请求 - 这意味着我必须:

    1. 不要return 503内容请求,也不要跳过命名位置.

    2. 做更改,root /home/shared/errors因为维护内容仍然存在.

  4. 最后,我有下一个解决方案:

    1. maintenance-static为所有静态内容创建文件夹,并更改maintenance.html文件和维护静态样式表中的路径

    2. 接下来使用这些规则(我相信它们是自我描述的)if (-f /home/shared/system/maintenance.html)在初始问题中取代单一:

      set $can503 0;
      if (-f /home/shared/system/maintenance.html) {
          set $can503 1;
      }
      if ($uri ~* /maintenance-static/) {
          set $can503 0;
      }
      location /maintenance-static/ {
          root /home/shared/errors;
      }
      if ($can503 = 1) {
         return 503;
      }
      
      Run Code Online (Sandbox Code Playgroud)

此解决方案在所有浏览器和shared/errors文件夹中的大量页面中都没有任何错误,例如.maintenance.html,error.html,overload.html等.

这个解决方案并不是很清楚 - 可能你可以告诉我如何使它更整洁,但是记住我们正在处理单独的请求(以及高负载情况下每个文件/请求的单独nginx进程等),用于初始html和它的内容我们不能使用相同的规则503重定向所有文件.


Aar*_*ker 10

我花了两个小时寻找这个问题的答案,最后找到了这篇文章.似乎它应该更常见.我的解决方案介于Frank's和Wile之间.正如Wile所述,某些浏览器(例如Chrome)将选择不渲染返回503的任何文件的CSS/JS,即使它完全正确地获取它们.

但有一个解决方案比Wile做的更少hacky.只需返回200!

我的完整解决方案如下:

error_page 503 @maintenance;

location @maintenance {
    root /path_to_static_root;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /rest_of_path/maintenance.html break;
    }
    return 200;
}
Run Code Online (Sandbox Code Playgroud)

工作就像一个魅力.:)