【问题标题】:Setting up nginx to proxy failed requests on one server to another设置 nginx 以将一台服务器上的失败请求代理到另一台服务器
【发布时间】:2016-04-28 08:47:30
【问题描述】:

我正在开发一个新版本的 api,它是对当前 api 的完全重写。一开始,新 api 不会处理任何请求,但随着时间的推移,越来越多的路由将在新 api 中实现(其中大多数使用与旧 api 中相同的路径)。我将 nginx 设置在与新的 api 服务(在端口 3000 上运行的节点)相同的服务器上,并且旧的 api 服务在 api.example.com(192.168.1.25)上运行。我想要做的是将 api.example.com 指向新的 api 服务,然后当请求进来时,让 nginx 首先尝试新 api 服务(127.0.0.1:3000)上的请求,如果该请求返回 404 ,然后将请求发送到旧的api服务(192.168.1.25)。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    我最终使用以下配置使其与标头和 cookie 支持一起使用。

    http {
      upstream new_api_backend {
        server 127.0.0.1:3000;
      }
    
      upstream old_api_backend {
        server old.example.com:443;
      }
    
      server {
        listen         80;
        return         301 https://$http_host$request_uri;
      }
    
      server {
        proxy_http_version 1.1;
    
        listen               443;
        ssl                  on;
        ssl_certificate      /etc/nginx/ssl/my_cert.crt;
        ssl_certificate_key  /etc/nginx/ssl/my_cert.key;
    
        location / {
          proxy_intercept_errors on;
          error_page 417 = @old_backend;
          proxy_pass http://new_api_backend;
        }
    
        location @old_backend {
          proxy_set_header Host old.example.com;
          proxy_redirect https://old.example.com/ https://$http_host/;
          proxy_cookie_domain old.example.com $http_host;
          proxy_pass https://old_api_backend;
        }
      }
    }
    

    注意error_page 417 = @old_backend。这使得 nginx 捕获来自新服务器的417 响应作为使用旧服务器的触发器。然后我只是添加了一条到新服务器的通用路由以返回417,这样404s 仍然可以在适当的时候在新服务器上使用。 417 Expectation Failed 可能不是这个用例最合适的代码,但它看起来已经足够接近了。

    此外,这将正确地将http://example.com/some/path 代理到https://old.example.com/some/path

    【讨论】:

      【解决方案2】:

      如果您使用“upstream”设置端点,则可以配置 proxy_pass 以在 404 上切换尝试 the next upstream

      upstream api {
        # new
        server localhost:3000;
        # old
        server 129.168.1.25:3000 backup;
      }
      
      
      location / {
         proxy_pass http://api;
         proxy_next_upstream http_404 non_idempotent;
      }
      

      但我不确定的一件事是,您是否可以真正切换到“备份”服务器作为 proxy_next_upstream 的一部分,因为从技术上讲,服务器是健康的。

      【讨论】:

      • 可能代替“备份”,你可以做 weight = 0;
      猜你喜欢
      • 2018-01-20
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多