Nginx: milhares de server_name

12

como posso configurar o Nginx restringir a milhares de server_name diferentes sem criar milhares de arquivos de configuração externos ou gravar uma linha server_name muito longa?

Na verdade, eu gostaria que o Nginx fosse um proxy reverso apenas para server1.com, server2.com, etc ...

A melhor solução para mim seria ter um único arquivo de configuração externo contendo meus nomes de servidor restritos: server1.com, server2.com, etc ...

É possível ?


Ok, obrigado por suas respostas, ele funciona sem reg. expressões. Apenas uma grande lista server_name, conforme explicado pelo kolbijack. Valeu.

Fred
fonte
você deve aceitar a resposta do kolbijack, se for essa a que ajudou.
ONEIROS

Respostas:

19

Você pode colocar a diretiva server_name em um arquivo por si só e depois incluí-la no bloco do servidor:

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

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

O arquivo server_names apenas precisa de server_name na parte superior e; na parte inferior para ser uma diretiva válida.

kolbyjack
fonte
Cuidado com os atrasos na latência / pesquisa / uso de RAM, se você fizer isso. Eu fiz alguns testes com grandes listas (cerca de 5.000 ServerAliasdiretivas e até 16 milhões de Deny fromdiretivas) no Apache. 5.000 domínios produzem um atraso mensurável, porém pequeno. Ao aumentar o número, descobri que o atraso começou a se tornar visível em cerca de 50.000. Com o Apache (e provavelmente também com o nginx), a lista é mantida na RAM, o que significa que, com o maior conjunto que eu tentei, eu poderia iniciar apenas um processo filho na minha RAM disponível.
Ladadadada
1
@Ladadadada LOL. Acabei de verificar. Nginx usa 30Mb de RAM para 100 000 domínios na server_namedirectiva e responderRequest rate: 36900.6 req/s (0.0 ms/req)
Vbart
1
60Mb para 1 000 000 eRequest rate: 34716.8 req/s (0.0 ms/req)
VBart 11/07/12
Isso é consideravelmente melhor do que o Apache conseguiu, pelo menos com o MPM pré-fork. Útil para saber.
Ladadadada
7

A server_namedeclaração no seu server {}bloco pode ser uma expressão regular, isso deve permitir que você combine server_name s dentro de um padrão definido.

Mais informações sobre isso podem ser encontradas aqui: http://nginx.org/en/docs/http/server_names.html#regex_names

Oneiroi
fonte
Obrigado, mas não posso declarar minha lista de domínios personalizados em uma única expressão regular. nome_do_servidor [zeus.domínio.com | poseidon.domínio.com | etc ...]; Seria muito longo.
Fred
1
@fred Você pode dar um exemplo de conjunto de dados? a menos que nenhum domínio seja igual ao outro, eu estaria bastante confiante de que um padrão Regex resolveria seu problema.
ONEIROS
@Oneiroi: exemplo de caso de uso = subdomínios gerados pelo usuário. Imagine um produto de software como serviço em que cada usuário obtenha seu próprio subdomínio e você queira usar o Nginx para rotear esses servidores para diferentes servidores. Nesse caso, nenhum domínio é como o outro.
m.stenta
@ m.stenta ah, ponto justo. A menos que haja alguma semelhança nos subdomínios, sim, o regex não funcionará. Ou você precisará vincular a criação de regex derivado do próprio domínio que imho derrota o objetivo.
Oneiroi 12/06