我有一个端点通过Symfony请求我的数据库:
api.domain.com:80/item/123
当请求这个端点时,Ngninx将代理把它传递给一个nodejs服务器,它能够从memcache中获取这个项目:
127.0.0.1:8000/item/123
如果在memcache中找不到该项目,则从另一个PHP端点获取:
api.domain.com:80/item/db/123
它运行良好,但我不知道如何pipe理nodejs失败。 如果nodejs不再响应,我想忽略proxy_pass或使用第二个endpoind(/ item / db / 123)。
我的Nginxconfiguration是:
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; }
当然,它不能工作:当nodejsclosures时无限循环。
我唯一的解决办法是创build一个特定的服务器来从数据库获取数据:
upstream itemFromNodeJs { server 127.0.0.1:8000; server 127.0.0.1:9000; }
但是我必须复制整个服务器:它远非优雅。
任何其他的想法?
来自Alexey的好build议!
这是我的新configuration:
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服务器closures,那么error_page会拦截502错误并转到fallback url,包括url参数($ 1)。 =使得它将状态码从502更改为由回退URL返回的状态码。 这正是我想要的。
人们可以说这是一个“欺骗和廉价的方式”来玩语义:一个错误页面是一个错误页面,而不是一个后备。 我同意,但这也是一个值得尊敬的逻辑:我的代理服务器(nodejs)已closures,从而给出错误…
如果有人有另一种解决scheme,我仍然感兴趣!