2008-12-16 5 views
4

J'essaye de réduire la charge sur mes serveurs Web en ajoutant un "serveur d'image" (un serveur dédié pour manipuler des demandes d'image), et en redirigeant toutes les demandes pour .gif, .jpg, .png etc., à lui.Meilleure façon de rediriger les demandes d'images vers un serveur Web différent?

Ma question est, quelle est la meilleure façon de gérer la redirection?

  • Au niveau du pare-feu? (Puis-je le faire en utilisant iptables?)
  • Au niveau de l'équilibreur de charge? (est-ce que ldirectord peut gérer cela?)
  • Au niveau apache - en utilisant des règles de réécriture?

Merci pour toute suggestion sur la meilleure façon de le faire.

--Update--

Une chose que je voudrais ajouter est que ce sont des domaines qui sont hébergés pour la 3e parties, donc je ne peux pas attendre tous les développeurs de modifier leur code et point leurs images à un autre serveur .

+0

"Au niveau de l'apache - en utilisant des règles de réécriture?" Si c'est au niveau d'Apache, vous êtes déjà sur le serveur web, donc le rediriger va quand même charger votre serveur web un peu. Ou avez-vous une couche proxy inverse Apache? Pouvez-vous décrire votre architecture? (y compris les loadbalancers que vous avez) –

+0

Actuellement, nous équilibrons la charge avec ldirectord sur l'un ou l'autre serveur web, avec un pare-feu iptables (boîte dédiée) devant les deux. (pas de reverse-proxy) – Brent

+0

Bonjour Brent, L'avez-vous fait? Quelle est l'augmentation de performance que cela fait? Cela vaut-il la peine de le faire? – Krunal

Répondre

3

Plus vous faites de la chaîne, mieux c'est.

Idéalement, faites-le au niveau DNS à l'aide d'un domaine différent pour vos images (par exemple imgs.example.com)

Si vous pouvez vous le permettre, demandez à quelqu'un d'autre de le faire en utilisant un CDN (Content réseau de livraison).

-Update-

Il y a aussi 2 featuers de mod_rewrite apache que vous voudrez peut-être regarder. Ils sont tous bien décrits au http://httpd.apache.org/docs/1.3/misc/rewriteguide.html. Le premier est sous le titre "Dynamic Miror" dans le document ci-dessus, qui utilise le drapeau mod_rewrite Proxy [p]. Cela permet à votre serveur d'extraire les fichiers d'un autre domaine en silence et de les renvoyer.

La seconde consiste simplement à rediriger la requête vers le nouveau domaine. Cette deuxième option met moins de pression sur votre serveur, mais les demandes doivent encore être reçues et cela ralentit le rendu final de la page, car chaque requête doit d'abord faire une requête essentiellement redondante à votre serveur.

+0

CoralCache est toujours là? Est-ce que ça marche? Il m'a sauvé d'un Slashdotting une fois. –

+0

Je suis d'accord pour dire que plus on avance dans la chaîne, mieux c'est. DNS est un peu élevé pour moi de faire ce travail, mais le faire au niveau du pare-feu NATting semble être plus prometteur. Mais tous les détails jusqu'à présent ont été au niveau apache. – Brent

+0

Le niveau de pare-feu n'est pas vraiment pratique. Pensez-y: le pare-feu devra creuser tout le chemin dans les paquets, interpréter les résultats, et créer sélectivement des paquets de retour appropriés. Cela décrit un serveur web comme Apache, pas un pare-feu – Eli

1

je suis d'accord avec rikh. Si vous souhaitez que les images soient diffusées à partir d'un serveur Web différent, servez-les sur un autre serveur Web. Par exemple:

<IMG src="images/Brett.jpg"> 

devient

<IMG src="http://brettnesbitt.akamia-technologies.com/images/Brett.jpg"> 

Tout type de équilibreur de charge va encore alimenter l'image de la conduite du serveur web, qui est ce que vous essayez d'éviter.


Je sais, bien sûr, ce que vous voulez vraiment.Qu'est-ce que vous voulez vraiment est pour toute demande comme:

GET images/Brett.jpg HTTP/1.1 

pour obtenir automatiquement convertis en:

HTTP/1.1 307 Temporary Redirect 
Location: http://brettnesbitt.akamia-technologies.com/images/Brett.jpg 

cette façon, vous ne devez pas faire un travail, à l'exception de copier les images à l'autre web -serveur.

Que je ne sais vraiment pas comment faire.


En utilisant l'expression « NAT », il implique que le pare-feu/routeur reçoit des requêtes HTTP, et que vous souhaitez transmettre la demande à un serveur interne différent si la requête HTTP était pour les fichiers image.

Cela soulève alors la question de ce que vous essayez réellement d'économiser. Quel que soit le serveur Web interne utilisé par la requête HTTP, les données doivent toujours passer par le canal du pare-feu/routeur. La raison pour laquelle je l'évoque est que le scénario courant lorsque quelqu'un veut servir des images d'un serveur différent est parce qu'il veut séparer le contenu à coût élevé de la bande passante, principalement statique, à faible coût CPU de sa logique actuelle. Utiliser uniquement NAT pour réécrire le paquet et l'envoyer à un serveur différent ne fonctionnera pas vers ce problème commun.

L'autre raison peut-être parce que les images ne sont pas du contenu statique sur votre système, et une demande de

GET images/Brett.jpg HTTP/1.1 

construit en fait une image à la volée, avec un coût élevé CPU, ou seulement en utilisant des données disponible (ie base de données SQL Server) sur ServerB.

Si tel est le cas, alors je continue à utiliser un nom de serveur différent sur la demande d'image:

GET http://www.brettsoft.com/default.aspx HTTP/1.1 
GET http://imageserver.brettsoft.com/images/Brett.jpg HTTP/1.1 

Je comprends ce que vous êtes espérant, avec l'inspection des paquets réseau pour passer outre la règle NAT et l'envoyer à un autre serveur - je n'ai jamais vu une telle chose qui peut le faire.

Il semble plus "proxy-ish", où le proxy web le fait. (ie pfSense et m0n0wall ne peuvent pas le faire)

Ce qui conduit alors à une sorte de solution que nous avons utilisée une fois: un serveur web personnalisé qui analyse la requête, fait la demande appropriée sur un serveur interne, et binaire écrit le réponse au client.

Cette douleur dans la solution de cul a été insisté sur un «consultant en sécurité», qui croit apparemment en security through obscurity.

Je sais qu'IIS ne peut pas faire de telles choses pour vous-même - je ne connais pas d'autres produits de serveur Web.


je viens de demander autour, et apparemment, si vous vouliez écrire un module de noyau personnalisé pour vous Linux routeur basé, vous pourriez avoir inspecter les paquets et prendre les mesures appropriées. Un tel module pourrait exister. Apparemment, il y a beaucoup d'autres modules open-source à utiliser comme point de départ.

Mais je préfère me tirer une balle dans la tête.

+0

Ce que j'aimerais vraiment, c'est avoir une boîte séparée (pare-feu/équilibreur de charge) reconnaître l'extension dans la requête HTTP, et NAT/rediriger en conséquence. – Brent

Questions connexes