Nginx: des milliers de nom_serveur

12

comment puis-je configurer Nginx restreindre à des milliers de nom_serveur différents sans créer des milliers de fichiers de configuration externes ou écrire une très longue ligne nom_serveur?

En effet, je voudrais que Nginx soit un proxy inverse uniquement pour server1.com, server2.com, etc ...

La meilleure solution pour moi serait d'avoir un seul fichier de configuration externe contenant mes noms de serveur restreints: server1.com, server2.com, etc ...

C'est possible ?


Ok, merci pour vos réponses, ça marche sans reg. expressions. Juste une grande liste de nom de serveur comme expliqué par kolbijack. Merci.

Fred
la source
vous devriez accepter la réponse kolbijack, si c'est celle qui vous a aidé.
Oneiroi

Réponses:

19

Vous pouvez mettre la directive server_name dans un fichier tout seul et ensuite l'inclure à partir de votre bloc serveur:

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

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

Le fichier server_names a juste besoin de server_name en haut et; en bas pour être une directive valide.

kolbyjack
la source
Méfiez-vous de la latence / des retards de recherche / de l'utilisation de la RAM si vous faites cela. J'ai fait quelques tests avec de grandes listes (environ 5 000 ServerAliasdirectives et jusqu'à 16 millions de Deny fromdirectives) dans Apache. 5 000 domaines produisent un délai mesurable mais faible. En augmentant le nombre, j'ai trouvé que le retard commençait à se faire sentir autour de 50 000. Avec Apache (et probablement aussi avec nginx), la liste est conservée dans la RAM, ce qui signifie qu'avec le plus grand ensemble que j'ai essayé, je ne pouvais démarrer qu'un seul processus enfant dans ma RAM disponible.
Ladadadada
1
@Ladadadada LOL. Je viens de vérifier. Nginx utilise 30 Mo de RAM pour 100 000 domaines dans la server_namedirective et répondRequest rate: 36900.6 req/s (0.0 ms/req)
VBart
1
60 Mo pour 1 000 000 etRequest rate: 34716.8 req/s (0.0 ms/req)
VBart
C'est considérablement mieux que Apache géré, au moins avec le MPM préfork. Pratique à savoir.
Ladadadada
7

La server_namedéclaration dans votre server {}bloc peut être une expression régulière, cela devrait vous permettre de faire correspondre les nom_serveur dans un modèle défini.

Plus d'informations à ce sujet peuvent être consultées ici: http://nginx.org/en/docs/http/server_names.html#regex_names

Oneiroi
la source
Merci, mais je ne peux pas déclarer ma liste de domaines personnalisés en une seule expression régulière. nom_serveur [zeus.domain.com | poseidon.domain.com | etc ...]; Ce serait trop long.
Fred
1
@fred Pouvez-vous donner un exemple d'ensemble de données? à moins qu'aucun domaine ne ressemble à l'autre, je serais assez confiant qu'un modèle Regex résoudrait votre problème.
Oneiroi
@Oneiroi: exemple de cas d'utilisation = sous-domaines générés par l'utilisateur. Imaginez un produit logiciel en tant que service où chaque utilisateur obtient son propre sous-domaine et que vous souhaitez utiliser Nginx pour le router vers différents serveurs. Dans ce cas, aucun domaine ne ressemble à l'autre.
m.stenta
@ m.stenta ah, juste point. À moins qu'il n'y ait des points communs dans les sous-domaines, alors oui, l'expression régulière ne fonctionnera pas. Ou vous aurez besoin de lier la création de regex dérivées du domaine lui-même, ce qui, à mon avis, va à l'encontre du but.
Oneiroi