Quelle est votre expérience en utilisant nginx et memcached pour optimiser un site Web?

Nous avons une application Web basée sur Java EE qui s’exécute sur un cluster de serveurs d’applications Glassfish . Le trafic entrant sera principalement des requêtes RESTful pour des représentations basées sur XML de nos ressources applicatives, mais peut-être 5% du trafic pourrait être pour des représentations basées sur JSON ou XHTML / CSS.

Nous étudions actuellement les solutions d’équilibrage de charge pour répartir le trafic entrant entre les instances de Glassfish dans le cluster. Nous examinons également comment décharger le cluster en utilisant memcached, une carte de hachage dissortingbuée en mémoire dont les clés seraient les noms de ressources REST (par exemple, “/ user / bob”, “/ group / jazzlovers”) et dont les valeurs sont les représentations XML correspondantes.

Une approche qui semble prometteuse consiste à tuer les deux oiseaux d’une pierre et à utiliser le serveur proxy / serveur HTTP nginx rapide et léger. Nginx prendrait en charge chaque requête entrante en examinant d’abord son URI dans memcached pour voir s’il existe déjà une représentation XML non expirée. Sinon, nginx envoie la demande à l’une des instances de Glassfish. Le module nginx memcached est décrit dans ce bref résumé .

Quelle est votre impression générale avec nginx et memcached utilisés de cette façon, comment êtes-vous heureux avec eux? Quelles ressources avez-vous trouvé les plus utiles pour apprendre à leur sujet? Si vous les avez essayées et que celles-ci ne vous convenaient pas, pourquoi pas et à quoi avez-vous utilisé à la place?

Note: voici une question connexe .

Mise à jour: J’ai ensuite posé la même question sur ServerFault.com. Les réponses suggèrent principalement des alternatives à nginx (utile, mais indirectement).

En supposant que vous ayez une banque de serveurs d’applications en amont des données de livraison aux utilisateurs.

upstream webservices { server 10.0.0.1:80; server 10.0.0.2:80; server 10.0.0.3:80; } server { ... default nginx stuff ... location /dynamic_content { memcached_pass localhost:11211; default_type text/html; error_page 404 502 = @dynamic_content_cache_miss; set $memcached_key $uri; } location @dynamic_content_cache_miss { proxy_pass http://webservices; } 

Ce que fait l’extrait de code nginx.conf ci-dessus est de diriger tout le trafic de http://example.com/dynamic/ * DIRECTLY vers le serveur memcached. Si memcache a le contenu, vos serveurs en amont ne verront AUCUN trafic.

Si le succès du cache échoue avec une erreur 404 ou 502 (pas dans le cache ou si memcache ne peut pas être atteint), alors nginx transmettra la demande aux serveurs en amont. Étant donné qu’il existe trois serveurs dans la définition en amont, vous obtenez également un proxy d’équilibrage de charge transparent.

Maintenant, le seul inconvénient est que vous devez vous assurer que vos serveurs d’applications principaux conservent les données de memcache. J’utilise nginx + memcached + web.py pour créer des petits systèmes simples qui traitent des milliers de requêtes par minute sur du matériel relativement modeste.

Le pseudo-code général du serveur d’applications est comme ceci pour web.py

 class some_page: def GET(self): output = 'Do normal page generation stuff' web_url = web.url().encode('ASCII') cache.set(web_url, str(output), seconds_to_cache_content) return output 

Les points importants à retenir dans le code web.py / pseudo ci-dessus sont que le contenu provenant de memcached via nginx ne peut pas être modifié du tout. nginx utilise des chaînes simples et non unicode. Si vous stockez la sortie unicode dans memcached, vous obtiendrez au moins des caractères étranges au début et à la fin de votre contenu mis en cache.

J’utilise nginx et memcached pour un site Web lié au sport où nous obtenons d’énormes impulsions de trafic qui ne durent que quelques heures. Je ne pouvais pas me passer de nginx et de memcached. La charge des serveurs lors de notre dernier grand événement sportif du 4 juillet est passé de 70% à 0,6% après la mise en œuvre des modifications ci-dessus. Je ne peux pas le recommander assez.