【问题标题】:Nginx proxy_pass, limit active concurrent connectionsNginx proxy_pass,限制活动并发连接
【发布时间】:2020-04-07 01:11:27
【问题描述】:

我有一个服务在低端机器上运行(在Nginx 后面),CPU 性能相当弱。其中一个 API 需要大量 CPU 时间,因此需要限制最大并发请求。但是如果请求被缓存,它的响应速度会快很多。

我想要做的是限制发送到特定 API 的后端服务的最大并发连接数。我研究了limit_req 和limit_conn,但它们都不符合我的情况。 limit_req 可能会导致高负载(太多未命中)或低负载(大部分请求被缓存时),不容易确定值。而limit_conn 将丢弃其余的请求(我希望它们排队)。

目前,我正在使用 apache2 mpm 模块,但它限制了所有请求。

是否可以让 Nginx 保持最大连接数而让其他人等待?

【问题讨论】:

    标签: nginx rate-limiting nextcloud


    【解决方案1】:

    基于 Nginx 缓存

    如果许多请求都尝试访问完全相同的数据,那么您可以使用locking mechanism 至少防止服务器在真正无用时超载。

    proxy_cache_lock on
    

    我不知道针对您的情况的另一种解决方案。默认情况下,在 N 已经发送到服务时保留请求似乎不是一个选项。如果您有多个这样的服务器,您可以将 nginx 设置为负载均衡器,但这是一个完全不同的概念。

    基于 Apache2 请求

    使用 Apache,您可以指定可以立即生成的 maximum number of client connections。通过将此值设置为一个非常小的数字(包括 1),它会自动对其他请求进行排队。

    MaxRequestWorkers 1
    

    (在2.3.13之前的旧版本中,使用MaxClients)

    这是一个服务器配置,因此所有连接都会受到影响。因此,为该特定服务运行一个单独的实例并通过该特定 Apache2 服务器路由所有访问非常重要。

              O  Internet
              |
              v
    +-------------------+
    |                   |   proxy based on URL or such
    |  Main HTTP Server +---------------+
    |                   |               |
    +---------+---------+               |
              |                         v
              |               +-----------------------------------+
              v               |                                   |
    +-------------------+     |  Apache with MaxRequestWorkers=1  |
    |                   |     |                                   |
    |  Main Services    |     +---------+-------------------------+
    |                   |               |
    +-------------------+               |
                                        v
                            +--------------------------+
                            |                          |
                            |  Slow Service Here       |
                            |                          |
                            +--------------------------+
    

    【讨论】:

    • 感谢您的编辑。似乎 proxy_cache 不是为此目的而设计的,无法实现要求。它将一个查询限制为对源服务器的查询,但其他查询将获取相同的结果。
    • @Newnius 啊,是的。抱歉,我以为您在询问将被缓存的访问权限。如果不缓存,那么它确实无济于事。恐怕我没有答案。我认为大多数技术将用于将您的请求分发到多个后端,而不是拖延它们。
    • 是的,我知道我的情况不正常。事实是我的 NAS 性能很差,所以渲染缩略图时需要 maxconn,否则服务器会卡顿几分钟。
    • @Newnius 好的。明白了(虽然我没有测试......)我认为您可以添加一个代理,该代理可以访问另一个 HTTP 服务器,您可以在其中限制工作人员的数量。我不了解 Nginx,但我想它也有类似的限制。我将展示如何设置 Apache 以将连接数限制为 1。我希望这对你有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多