NGINX:当 proxy_pass 失败时提供静态文件

Ale*_*ard 0 nginx

我有一个运行 nginx 的前端,它将请求代理到运行 Web 服务的后端。如果后端服务关闭,我想提供一个静态文件。

这是我正在使用的配置文件:

location ~ /api/admin {
        rewrite /xxxx/(.+) /$1 break;
        error_page 404 502 =200 /themes/yyyy/themes.json;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Origin '*';
        add_header Access-Control-Allow-Methods 'GET, POST';
        proxy_intercept_errors on;
        proxy_pass http://xxxx;
}

location = /themes/yyyy/themes.json {
        rewrite /themes/yyyy/themes.json /api/admin/thematics/edito;
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时:

http://url/themes/geoportail/themes.json
Run Code Online (Sandbox Code Playgroud)

我从 nginx 收到 502 错误,而不是 200 和静态文件...

2014/08/25 17:02:35 [error] 13551#0: *6719 connect() failed (111: Connection refused) while connecting to upstream, client: 160.92.103.160, server: uri, request: "GET /themes/yyyy/themes.json HTTP/1.1", upstream: "http://IP:PORT/api/admin/thematics/edito", host: "", referrer: ""
Run Code Online (Sandbox Code Playgroud)

Ale*_*ard 5

我正在发布我找到的解决方案,随时提出更优雅的建议。

location ~ /api/admin {
        rewrite /xxxx/(.+) /$1 break;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Origin '*';
        add_header Access-Control-Allow-Methods 'GET, POST';
        proxy_intercept_errors on;
        proxy_pass http://xxxx;
        error_page 404 502 503 504 =200 @statictheme;
}

location @statictheme {
    try_files $uri /themes/yyyy/themes.json last;
}

location = /themes/yyyy/themes.json {
        rewrite /themes/yyyy/themes.json /api/admin/thematics/edito;
}
Run Code Online (Sandbox Code Playgroud)