首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有内容问题的nginx维护页面

有内容问题的nginx维护页面
EN

Stack Overflow用户
提问于 2011-05-13 04:46:16
回答 5查看 14.7K关注 0票数 22

为了在部署期间显示维护页面,我一直使用nginx中的next config:

代码语言:javascript
复制
if (-f /home/shared/system/maintenance.html) {
    return 503;
}

error_page 503 @maintenance;

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

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

在error.log中使用此类日志的静态内容数量:

代码语言:javascript
复制
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"

这是合乎逻辑的--如果我把所有东西都重写成maintenance.html,那就意味着静态内容并不是唯一的。

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

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

EN

回答 5

Stack Overflow用户

发布于 2011-11-05 16:05:31

我花了整整两个小时寻找这个问题的答案,终于找到了这篇文章。看起来它应该更常见一些。我的解决方案介于Frank和Wile之间,正如Wile所说,某些浏览器(例如Chrome)将选择不呈现返回503的任何文件的CSS/JS,即使它完全正确地获取了它们。

但是有一个修复方法没有Wile做的那么麻烦。只需返回200!

我的完整解决方案如下:

代码语言:javascript
复制
error_page 503 @maintenance;

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

就像一个护身符。:)

票数 10
EN

Stack Overflow用户

发布于 2011-05-13 06:32:06

代码语言:javascript
复制
location @maintenance {
    root /home/shared/errors;
    rewrite  (some\.jpg|some2\.gif)$ /$1 break;
    rewrite ^(.*)$ /maintenance.html break;
}

这可能在不枚举白名单文件的情况下起作用:

代码语言:javascript
复制
location @maintenance {
    root /home/shared/errors;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /maintenance.html break;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-05-11 16:46:35

这个解决方案只需使用一条if语句,而且可读性和理解性也更强:

代码语言:javascript
复制
upstream unicorn {
        server unix:/path/to/unicorn.sock;
}

server {
        listen 3000 default deferred;

        proxy_read_timeout 3600;
        client_max_body_size 4G;
        set_real_ip_from 0.0.0.0/0;

        root /path/to/current/public;
        try_files $uri/index.html $uri.html $uri @unicorn;

        error_page 404 /404.html;
        error_page 500 502 504 /500.html;
        error_page 503 /system/maintenance.html;

        location /404.html {
                internal;
        }

        location /500.html {
                internal;
        }

        location @unicorn {
                if (-f $document_root/system/maintenance.html) {
                        return 503;
                }

                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
                proxy_redirect off;
                proxy_pass http://unicorn;
        }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5984270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档