【问题标题】:Nginx 502 when serving error page content?提供错误页面内容时的Nginx 502?
【发布时间】:2012-02-20 11:08:42
【问题描述】:

我一直在将 Nginx 设置为服务器上应用程序的反向代理。其中一部分包括具有外部内容(如图像)的维护页面。我能够找到一种方法来设置返回 200 的图像的错误页面,但看起来反向代理会改变整个环境。这是nginx maintenance page with content issue的原始解决方案

error_page 503 @maintenance;

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

反向代理配置为:

location / {
            proxy_pass         http://127.0.0.1:9007/;
            proxy_redirect     off;
}

问题是当发现“维护”根目录中存在文件时,出现问题,服务器返回 502。有人知道可能是什么原因吗?

一些猜测 我想知道服务器是否侦听端口 80,它以某种方式将任何好的文件请求传递回代理。如果是真的,如何避免?

编辑

这是 nginx 日志中的错误。我直接尝试访问 50x.html。不知道为什么会这样?

2012/02/17 19:39:15 [error] 21394#0: *13 connect() failed (111: Connection refused) while connecting to upstream, client: (my ip address), server: _, request: "GET /50x.html HTTP/1.1", upstream: "http://127.0.0.1:9007/50x.html", host: "domain.com"

看起来是确实试图从应用程序而不是根目录获取。我怎样才能绕过这个?

编辑 2

我原本以为我找到了对 nginx v1.0.12 进行更改的答案,但它并没有解决问题。它涉及类似的情况,但我的猜测是修复太具体了。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    您不需要涉及后端(即,不应使用代理通行证),因为您的维护页面应该是 Nginx 可以直接提供的静态 html 文件。

    假设您的设置配置为 ...

    server {
        listen 80;
        server_name example.com;
        root /path/to/webroot;
    
    
        # Regular locations etc
        ...
    }
    

    创建一个名为“503_status”的文件夹并将您的维护页面作为“503.html”放在那里。

    准备好之后,在 Nginx 目录下创建一个名为“maintenance.default”的文件,内容如下...

    error_page 503 /503_status/503.html;
    
    # Candidate for redirection if not ending with one of these extensions.
    if ( $request_uri !~ \.(jpg|gif|png|css|js)$ ) {
         set $maint  "Tr";
    }
    # Candidate for redirection if not a request for the maintenance page 
    if ( $request_uri !~ ^/maintenance/$ ) {
        set $maint  "${maint}ue";
    }
    # Redirect to a location where the status code will be issued 
    if ( $maint = True ) {
        rewrite ^ /maintenance/ redirect;
    }
    # Due to Nginx quirk, issue the status code in a location context.
    # Make "internal" to prevent direct browsing.
    location /maintenance {
        internal;
        return 503;
    }
    # 503_status folder as "internal" so no direct browsing 
    location 503_status {
        internal;
        alias /server/path/to/503_status/folder;
    }
    

    每当您将网站投入维护时,只需包含以下文件...

    server {
        listen 80;
        server_name example.com;
        root /path/to/webroot;
    
        include /server/path/to/maintenance.default;        
    
        # Regular locations etc
        ...
    }
    

    这将为您的维护页面以及它所需的任何资源提供服务(只需确保扩展程序在列表中)。后端服务器根本不发挥作用。

    【讨论】:

    • 我明白了,所以你必须为维护内容设置一个新的服务器配置?如果不清楚,抱歉,Q中的location / { proxy_pass }实际上是后端服务器(一个java应用程序),所以仍然需要链接到它。这会改变答案吗?谢谢!
    • 您没有创建新的服务器块。只需将 maintenance.default 文件包含到受影响域的现有服务器块中即可。 Nginx 自己提供 503.html 文件,因此 Java 应用程序根本不被调用,也不应该被调用。顺便说一句,您所有的常规服务器块元素都保持不变,您只需包含接管该过程的 maintenance.default 文件。当您删除“包含”行时,您将返回到正常设置。您添加到普通服务器块(上面的第一个代码块)的唯一内容是“include /server/path/to/maintenance.default;” (上面的最后一个代码块)。
    • 完美,感谢您的详细回答和澄清。
    • 不客气。请注意,代码中有一个错误,即在服务器级别“使用”返回 503“似乎总是返回默认的 Nginx 503 错误页面。我已经修改了答案,以便使用自定义页面。这样做的缺点就是将要发送的实际状态码是“200”。
    • 终于得到了一个配置,它将发出自定义页面以及正确的状态代码。对我来说是一次有趣的发现之旅!
    猜你喜欢
    • 2016-04-16
    • 2017-07-07
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多