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
if (-f /home/shared/system/maintenance.html) {
return 503;
}
Run Code Online (Sandbox Code Playgroud)
这个规则有一个支持命名的位置location @maintenance,并为共同重定向到/maintenance.html的root /home/shared/errors一切工作.
此页面包含和图像some.jpg- 要接收此图像浏览器启动新请求,此新请求再次点击规则#1
所有这些都在最初的问题中描述了
如果我if在Frank Farmer的答案中使用了一些魔法,我可以将服务器指向请求的文件但是HTTP回答将是503和浏览器(所有,除了Safari,在我的测试中)在调试控制台中抛出错误并且显示图像但不处理CSS-文件处于相同的情况.
这很关键.
我尝试使用location magic来解决这个问题 - 我的新内容请求 - 这意味着我必须:
不要return 503内容请求,也不要跳过命名位置.
做更改,root /home/shared/errors因为维护内容仍然存在.
最后,我有下一个解决方案:
maintenance-static为所有静态内容创建文件夹,并更改maintenance.html文件和维护静态样式表中的路径
接下来使用这些规则(我相信它们是自我描述的)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)
工作就像一个魅力.:)
| 归档时间: |
|
| 查看次数: |
13436 次 |
| 最近记录: |