【问题标题】:Nginx config changes for sticky session in round robin循环赛中粘性会话的 Nginx 配置更改
【发布时间】:2020-05-07 08:44:43
【问题描述】:

Rails 应用程序(4.2) 托管在 nginx 上,服务于 localhost:5478。下面代码sn-p中的ip_hash维护了服务器请求响应的一致性,按预期工作。

upstream rails {
  ip_hash;

为了分担负载,ip_hash 被评论了。现在用户的登录开始失败,因为需要传递会话 cookie,而 Rails3 的工作方式类似。这与粘性会话有关,但无法追踪处理它的确切方式。

nginx.conf

upstream mongrel {
    server 127.0.0.1:5469;
  }

  upstream rails {
    #ip_hash;
    server 127.0.0.1:5479;
    server 127.0.0.1:5480;
    server 127.0.0.1:5481;
    server 127.0.0.1:5482;
  }


    location / {
      # Setup redirection headers
      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;

      # Pass the request thru
      proxy_pass         http://mongrel;
    }
  }

  server {
    listen          5478 default;
    server_name     _;
    root            "../games/public";

    location ~ ^/assets/ {
      root "../d2/public";
      expires 1y;
      add_header Cache-Control public;

      add_header ETag "";
      break;
    }

我尝试按照建议使用consistent_hash $scheme $request_uri; ,但consistent_hash 作为指令无法识别并失败。让我知道是否需要对 nginx 进行任何配置更改。我还发现带有 ip_hash 注释的相同 nginx 配置适用于 Rails3 应用程序,不确定这是否相关

【问题讨论】:

    标签: ruby-on-rails session nginx load-balancing round-robin


    【解决方案1】:

    有两种方法可以做到这一点:

    1. 您在后端之间共享会话,或者
    2. 您传递一个 cookie 以允许 nginx 将客户端连接到上游服务器。

    如果 nginx 需要任何配置更改,请告诉我。

    如果您无法修改应用程序,例如让多个应用实例使用一个公共存储,可以尝试使用 nginx 的sticky 指令(>=1.5.7)。

    使用您的示例,它应该类似于

    http {
        ...
    
        upstream rails {
            server 127.0.0.1:5479;
            server 127.0.0.1:5480;
            server 127.0.0.1:5481;
            server 127.0.0.1:5482;
    
            sticky rails_sticky expires=1d domain=.rails.local path=/ httponly secure;
        }
    
        ...
        server {
            listen 5478;
            server_name rails.local;
            root "../games/public";
    
            location / {
                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;
    
                proxy_pass http://rails;
            }
    
            ...
        }
    
        ...
    }
    

    您可能需要根据您的环境调整配置。

    使用sticky,如果尚未绑定,nginx 应该使用名为rails_sticky 的粘性cookie 检查并绑定客户端。绑定客户端仍会检查您在upstream 指令中设置的任何平衡方法,默认为加权循环。

    如果客户端已绑定到服务器,任何后续请求都将转发到指定的上游服务器。如果指定的上游服务器无法使用,nginx会将客户端重新绑定到另一个服务器。

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2015-10-26
      • 1970-01-01
      • 2020-08-10
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多