Nginx proxy_pass 故障转移到 URL 而不是服务器

Nginx proxy_pass 故障转移到 URL 而不是服务器

我有一个通过 Symfony 请求我的数据库的端点:
api.domain.com:80/item/123

当请求此端点时,Ngninx 将代理将其传递给能够从 memcache 获取项目的 nodejs 服务器:
127.0.0.1:8000/ item/123

如果在 memcache 中找不到该项目,它会从另一个 PHP 端点获取它:
api.domain.com:80/item/db /123

它运行良好,但我不知道如何管理 nodejs 故障。如果 nodejs 不再响应,我想忽略 proxy_pass 或使用第二个端点 (/item/db/123)。

我的 Nginx 配置是:

upstream itemFromNodeJs {
    server 127.0.0.1:8000;
}
server {
    listen 80;
    server_name api.domain.com 127.0.0.1;

    location ~*\/item\/([0-9]+)$ {
        proxy_pass http://itemFromNodeJs;
    }

我尝试在上游添加一个备份服务器:

upstream itemFromNodeJs {
    server 127.0.0.1:8000;
    server 127.0.0.1:80;
}

当然,当nodejs宕机时,它就无法工作了:无限循环。

我想到唯一的解决方案是创建一个特定的服务器来从数据库获取数据:

upstream itemFromNodeJs {
    server 127.0.0.1:8000;
    server 127.0.0.1:9000;
}

但我必须复制整个服务器:这太不优雅了。

还有其他想法吗?

答案1

Alexey 的建议很好!
以下是我的新配置:

upstream itemFromNodeJs {
    server 127.0.0.1:8000;
}
server {
    listen 80;
    server_name api.domain.com 127.0.0.1;

     location ~*\/item\/([0-9]+)$ {
        proxy_pass http://itemFromNodeJs;
        error_page 502 = /item/db/$1;
    }
    ...
}

那么现在会发生什么?
如果 nodejs 服务器处于活动状态,proxy_pass 就会起作用,我们无需进一步操作。如果 nodejs 服务器
已关闭,error_page 会拦截 502 错误并转到 fallback url,包括 url 参数 ($1)。= 使它将状态代码从 502 更改为 fallback URL 返回的状态代码。这正是我想要的。

有人可能会说这是玩弄语义的“欺骗和廉价方式”:错误页面就是错误页面,而不是后备页面。我同意,但这也是一个值得尊敬的逻辑:我的代理服务器(nodejs)已关闭,因此出现错误...

如果有人有其他解决方案,我仍然感兴趣!

相关内容