【问题标题】:Load balancing with nginx using hash method使用哈希方法与 nginx 进行负载平衡
【发布时间】:2015-04-28 05:10:16
【问题描述】:

我想在几个 node.js 应用节点前面使用 nginx 作为负载均衡器。

round-robinip_hash 方法非常容易实现,但在我的用例中,它们并不是最合适的。

我需要 nginx 就其会话 ID 为后端节点提供客户端服务,这些会话 ID 由首先登陆的节点提供。

在我的谷歌搜索过程中,我想出了“散列”方法,但我找不到太多资源。

这是我尝试过的:

my_site.conf:

http {

    upstream my_servers {
        hash $remote_addr$http_session_id consistent;
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
    }

    server {
        listen 1234;
        server_name example.com;

        location / {
            proxy_pass http://my_servers;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_redirect off;
            proxy_buffering off;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

在应用程序中,我返回带有会话 ID 的 Session-ID 标头。

res.setHeader('Session-ID', req.sessionID);

我错过了什么,但是什么?

【问题讨论】:

  • $http_session_id 指的是客户端(浏览器)发送的标头,而不是您的应用程序响应。你需要的是nginx.org/r/sticky,但它只是商业订阅。为什么你不想要简单的 ip_hash?
  • 是的,在问完这个问题后,我发现了“粘性”模块......但正如你所说,它是商业的:(因为我需要计算不同的客户,即使它们来自同一个 IP .. . 顺便说一句,请添加您的评论作为答案,我会接受它。

标签: node.js nginx load-balancing


【解决方案1】:

$http_session_id 指的是客户端(浏览器)发送的标头,而不是您的应用程序响应。你需要的是http://nginx.org/r/sticky,但它只是商业订阅。

third-party 模块可以做与商业模块相同的工作,但你必须重新编译 nginx。

【讨论】:

    【解决方案2】:

    它不能开箱即用,因为 nginx 是一个(好的)网络服务器,但不是真正的负载平衡器。 首选 haproxy 进行负载平衡。

    此外,您需要的不是散列。您需要持久化 session-id 标头,并且需要能够在源 IP 上持久化,直到获得此标头。 这对于 HAProxy 来说非常简单。 HAProxy也可以用来检查session id是服务端生成的还是客户端伪造的。

    后端 myapp # 在内存中创建一个stick table #(注意:使用peers来同步表的内容) 棒表类型字符串 len 32 过期 1h 大小 1m # 匹配表中的客户端 http-session-id 进行持久化 坚持比赛 hdr(http-session-id) # 如果没有找到,则使用源IP地址 坚持 src,lower # 把 IP 地址变成字符串的肮脏技巧

    # 学习服务器已经生成的http-session-id 棒存储响应 hdr(http-session-id)

    # 如果 http-session-id 似乎是伪造的,则添加一个标头(未在表中找到) #(注意:仅在 1.6-dev 中可用) acl has-session-id req.hdr(http-session-id) -m found acl 未知会话 id req.hdr(http-session-id),in_table(myapp) http-request set-header X-warning unknown\ session-id if has-session-id unknown-session-id

    那么你就完全安全了:)

    巴蒂斯特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多