Nginx配置更改为轮询中的粘性会话

时间:2020-05-07 08:44:43

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

Rails应用程序(4.2)托管在nginx上,并在localhost:5478服务。下面的代码片段中的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应用程序,不确定是否与此相关

1 个答案:

答案 0 :(得分:0)

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

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

让我知道nginx是否需要任何配置更改。

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

以您的示例为例,

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;
        }

        ...
    }

    ...
}

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

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

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