Nginx 502在提供错误页面内容时?

时间:2012-02-18 03:02:48

标签: nginx

我一直在设置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进行了更改,但它没有解决问题。它涉及类似的情况,但我的猜测是修复太具体了。

1 个答案:

答案 0 :(得分:3)

您不应该涉及后端(I.E.,不应该使用代理传递),因为您的维护页面应该是Nginx可以直接提供的静态html文件。

假设您将设置配置为...

server {
    listen 80;
    server_name example.com;
    root /path/to/webroot;


    # Regular locations etc
    ...
}

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

准备好后,创建一个名为" maintenance.default"的文件。在Nginx目录下有以下内容......

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
    ...
}

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