关于我可以在Nginx配置中添加多少个服务器块的任何想法? 我需要将它用于具有多个子域的反向代理(每个客户端一个子域)。 它能成功支持10,000个服务器块吗? 有没有基准研究呢?
答案 0 :(得分:2)
这实际上不是您有多少个问题,而是您有多少个。可以体面地处理
您可以有效处理的数量在很大程度上取决于您的硬件(不是为容器供电的硬件,而是实际运行nginx的盒子),因为Nginx大部分时间会尝试将哈希表放入Cache中(最好在L1上)缓存,因为它虽然较小,但速度更快,或者如果无法缓存,则在L2缓存上) 那是基本理论。
根据nginx文档,每个服务器块将占用32/64/128字节的哈希值,具体取决于您的配置,因此,即使按1000个服务器块标记,您也可能不再位于L1上,这意味着您可能从1-2纳秒的寻道时间移动到10-15纳秒的寻道时间或更多(不记得确切的当前数字了。继续增长,您甚至可能用完L2缓存(再次,这取决于您的实际硬件是什么),因此您现在使用的是L3缓存甚至是速度更慢的RAM。即使所有缓存的命中率都可以达到99%或更高,但随着流量的增加,由于更多的CPU将专用于确定每个访问者的目的地,因此查找时间将成为问题。而且这只是假设所有服务器块都具有准确的域名,而不是通配符或正则表达式,这将进一步影响性能。
可以做到吗?当然……只要拥有一个坚固的CPU,就可以拥有最大的L1高速缓存,以及一个大型L2高速缓存。如果您绝对必须这样做,请远离通配符和正则表达式
准备调整server_names_hash_max_size
和server_names_hash_bucket_size
的配置指令(您将知道在添加服务器块之后需要这样做... Nginx可能花费异常/令人无法接受的时间来重新启动,或者根本不重新启动:这就是您更改此处概述的指令的提示:
http://nginx.org/en/docs/hash.html
在这里:
http://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_bucket_size
即使nginx确实重新启动,您也需要在流量开始增加时密切监视硬件,以确定瓶颈可能在多大程度上承受负载。最好的情况是,您将为每个请求增加一秒钟的时间...最坏的情况下,您可以将整个操作框屈膝(但这确实将其推到了极致)
说了这么多...您是否探索过其他选择?可能是通过DNS进行的,还是转向F5设备或其他一些较低级别的解决方案等企业级产品?