Nginx:数千个server_name


12

如何配置Nginx限制成千上万个不同的server_name而不创建数千个外部配置文件或编写很长的server_name行?

确实,我希望Nginx仅作为server1.com,server2.com等的反向代理...

对我来说最好的解决方案是拥有一个包含我受限制的server_names的单个外部配置文件:server1.com,server2.com等。

可能吗 ?


好的,谢谢您的回答,它无需注册即可工作。表达式。正如kolbijack解释的那样,只是一个很大的server_name列表。谢谢。


如果有帮助,您应该接受kolbijack的回答。
Oneiroi

Answers:


19

您可以将server_name指令本身全部放在文件中,然后从服务器块中将其包括进来:

# example.com.conf
server {
  include /path/to/server_names;
  ...
}

# /path/to/server_names
server_name
  example.com
  domain.com
  foo.com
;

server_names文件只需要在顶部的server_name和; 在底部是有效的指令。


如果要这样做,请注意延迟/查找延迟/ RAM使用情况。我已经在Apache中对大型列表(大约5,000 ServerAlias条指令和多达1600万Deny from条指令)进行了一些测试。5,000个域产生了可测量但很小的延迟。当增加数量时,我发现延迟开始变得明显,大约为50,000。使用Apache(可能还使用nginx)时,该列表保存在RAM中,这意味着使用我尝试过的最大集,我只能在可用RAM中启动一个子进程。
Ladadadada

1
@Ladadadada哈哈。我刚刚检查过。Nginx在server_name指令中为10万个域使用30Mb RAM 并做出响应Request rate: 36900.6 req/s (0.0 ms/req)
VBart 2012年

1
60Mb for 1 000 000 andRequest rate: 34716.8 req/s (0.0 ms/req)
VBart

至少在使用prefork MPM的情况下,这比Apache管理的要好得多。方便知道。
拉达达达

7

块中的server_name声明server {}可以是正则表达式,这应允许您在设置模式中匹配server_name。

有关更多信息,请参见:http//nginx.org/en/docs/http/server_names.html#regex_names


谢谢,但是我无法在单个正则表达式中声明我的自定义域列表。server_name [zeus.domain.com | poseidon.domain.com | etc ...]; 太久了
Fred

1
@fred您能举个示例数据集吗?除非没有一个域与另一个域完全相同,否则我会非常有信心Regex模式可以解决您的问题。
Oneiroi

@Oneiroi:示例用例=用户生成的子域。想象一下一个软件即服务产品,其中每个用户都有自己的子域,而您想使用Nginx将其路由到其他服务器。在这种情况下,没有一个域与另一个域完全相同。
m.stenta

@ m.stenta啊,很公平。除非子域中有一些共性,否则正则表达式将无法正常工作。否则,您将需要绑定从域本身派生的正则表达式的创建,恕我直言,这不符合目的。
Oneiroi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.