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应用程序,不确定是否与此相关
答案 0 :(得分:0)
有两种方法可以做到这一点,
让我知道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会将客户端重新绑定到另一台服务器。