6 votes

Apache : respect du ttl DNS dans le proxy-pass

Nous essayons de configurer un tas d'Apache 2.4.18 pour transmettre les demandes qu'il reçoit à notre serveur en amont de notre partenaire. Notre partenaire utilise l'équilibrage de charge élastique d'Amazon et donc la seule chose que nous connaissons à propos de leurs serveurs est leurs noms de DNS.

Le TTL des enregistrements DNS est de 60 secondes et j'aimerais savoir si Apache peut respecter ce ttl, gardant la connexion active tant que l'enregistrement DNS est valide, puis demandant la traduction lorsque le TTL a expiré.

En utilisant mod_proxy DisableReuse = on force l'ouverture d'une nouvelle connexion à chaque fois qu'une ressource est nécessaire en amont. Cela fonctionnerait tant que le système d'exploitation sous-jacent effectue le caching du TTL DNS. Sinon, chaque fois qu'une nouvelle ressource est nécessaire, Apache forcera une nouvelle demande DNS, augmentant le temps de réponse.

J'ai pensé à jouer avec les paramètres ttl et timeout de mod_proxy, mais je pense que je ne suis pas en train de résoudre correctement le problème. Selon la documentation, le paramètre de timeout de mod_proxy contrôle le temps d'attente d'un socket pour des données en amont, mais je ne suis pas sûr si l'instance Apache va fermer la connexion et en ouvrir une nouvelle. De plus, jouer avec le timeout est sujet aux erreurs, car une valeur plus basse pourrait envoyer une réponse erronée au client.

J'ai passé un peu de temps à essayer de résoudre cette configuration sans succès. Y a-t-il une configuration spéciale pour couvrir ce scénario? Ou ai-je peut-être manqué quelque chose? Toute aide serait appréciée.

Meilleures salutations,

Gustau

5voto

jcollum Points 10236

La seule option qui peut être utile pour votre cas d'utilisation est disablereuse=On.

Les requêtes DNS sont effectuées par la partie résolveur de la glibc. Les résultats ne sont pas mis en cache par cette bibliothèque, ni par le système d'exploitation. Dans le cas d'apache, les résultats DNS sont mis en cache par le processus worker d'apache. Vous pouvez utiliser un service DNS, tel que nscd ou dnsmasq, pour effectuer le cache DNS.

Voici des extraits de la documentation apache.

https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#workers

Résolution DNS pour les domaines d'origine

La résolution DNS se produit lorsque le socket vers le domaine d'origine est créé pour la première fois. Lorsque la réutilisation de la connexion est activée, chaque domaine de backend n'est résolu qu'une seule fois par processus enfant, puis mis en cache pour toutes les connexions ultérieures jusqu'à ce que l'enfant soit recyclé. Ces informations doivent être prises en compte lors de la planification des tâches de maintenance DNS impliquant des domaines de backend. Veuillez également vérifier les paramètres de ProxyPass pour plus de détails sur la réutilisation des connexions.

https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass

disablereuse (par défaut "Off") Ce paramètre doit être utilisé lorsque vous souhaitez forcer mod_proxy à fermer immédiatement une connexion avec le backend après avoir été utilisé, et ainsi désactiver sa connexion persistante et son pool pour ce backend. Cela est utile dans diverses situations où un pare-feu entre Apache httpd et le serveur backend (peu importe le protocole) a tendance à abandonner silencieusement les connexions ou lorsque les backends eux-mêmes peuvent être soumis à un DNS de type round-robin. Lorsque la réutilisation de la connexion est activée, chaque domaine de backend est résolu (avec une requête DNS) une seule fois par processus enfant et mis en cache pour toutes les connexions ultérieures jusqu'à ce que l'enfant soit recyclé. Pour désactiver la réutilisation de la connexion, définissez la valeur de cette propriété sur On.

-1voto

Quarind Points 435

Pour votre cas, il est préférable d'utiliser nginx ou haproxy. Apache est trop lourd pour faire la répartition de requêtes.

Nginx peut définir le résolveur comme suit :

server {
    ...
    resolver 127.0.0.1;
    set $backend_upstream "http://dynamic.example.com:80";
    proxy_pass $backend_upstream;
    ...
}

Vous pouvez en savoir plus sur les délais d'attente dans haproxy ici, et sur les délais d'attente dans nginx ici. Comment configurer nginx.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X