<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Communauté Magento francophone &#187; Optimisation Système &amp; Réseau</title>
	<atom:link href="http://www.wikigento.com/category/optimisation-systeme-reseau/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wikigento.com</link>
	<description>Optimisation de sites E-commerce, hébergment Magento</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:33:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Optimisation de sites Magento (et autres) !</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 17:28:55 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation LAMP/Zend/Magento]]></category>
		<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[css optimiser]]></category>
		<category><![CDATA[optimisation de site]]></category>
		<category><![CDATA[optimisation de site magento]]></category>
		<category><![CDATA[optimisation pagespeed]]></category>
		<category><![CDATA[optimisation Yslow]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=1523</guid>
		<description><![CDATA[Introduction Beaucoup de principes sont généraux à tous les frameworks, qu&#8217;ils s&#8217;agissent d&#8217;un site Magento, Prestashop, WordPress, Drupal, etc&#8230; Certains Framework ou plugins de ces solutions vous aident nativement à le faire, d&#8217;autre n&#8217;ont pas cette possibilité ou cette richesse en stock. J&#8217;ai récemment refais le site de NBS System (ma société) de A à [...]]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p style="text-align: justify">Beaucoup de principes sont généraux à tous les frameworks, qu&#8217;ils s&#8217;agissent d&#8217;un site Magento, Prestashop, WordPress, Drupal, etc&#8230; Certains Framework ou plugins de ces solutions vous aident nativement à le faire, d&#8217;autre n&#8217;ont pas cette possibilité ou cette richesse en stock.</p>
<p style="text-align: justify">J&#8217;ai récemment refais le site de <a title="Hébergement de sites E-commerce" href="http://www.nbs-system.com/hebergement-infogerance/e-commerce/hebergement-magento/">NBS System</a> (ma société) de A à Z avec nos amis de l&#8217;<a href="http://www.dnd.fr/">agence DnD</a> et forcément, on s&#8217;est un peu intéressés à l&#8217;optimisation. C&#8217;est un chemin complexe mais passionnant alors autant vous faire partager quelques trouvailles dans le domaine.</p>
<p style="text-align: justify">Je ne reviens pas sur le pourquoi, optimiser c&#8217;est bien, améliorer l&#8217;expérience utilisateur c&#8217;est bien, avoir un meilleur référencement naturel car on charge vite, c&#8217;est bien. De toute façon vous surfez sur un Blog, il faudra bien justifier cela à votre boss un jour donc on va dire que c&#8217;est pour le bien d&#8217;Internet et la préservation de la bande passante.</p>
<p>Après en société, vous pourrez faire les malins et expliquer qu&#8217;en optimisant votre site, vous avez participer à éviter l&#8217;<a href="http://www.lesechos.fr/info/comm/020289856641.htm">Exaflood</a>, ca ne fait pas tomber les femmes mais coté entretient d&#8217;embauche, sur un malentendu, vous forcerez l&#8217;admiration.</p>
<h1>Comment Analyser</h1>
<p style="text-align: justify">Nos deux amis : <a title="utiliser Yslow" href="https://addons.mozilla.org/en-US/firefox/addon/5369">Yslow</a> et <a title="Utiliser Pagespeed" href="http://code.google.com/speed/page-speed/download.html">PageSpeed</a>. Ces deux plugins fonctionnent sous Firefox et vous donnent un point de vu sur ce qui est propre, bien fait et ce qui ne l&#8217;est pas. Pagespeed, celui de Google, est plus nouveau et un poil plus complet, il tourne évidemment aussi sous Chrome. Yslow est celui fournit par Yahoo depuis des années, il est très intéressant également, personnellement, j&#8217;utilise les deux.</p>
<p>Je vous conseil aussi le site <a href="http://analyze.websiteoptimization.com/">websiteoptimization</a> qui vous donnera aussi de préciseuses infos. Evidemment, passer sans erreur le <a title="W3C Xhtml Validator" href="http://validator.w3.org/">XHTML validator</a> est important également, même si c&#8217;est pas toujours simple.</p>
<p style="text-align: justify">En complément, je me dois de citer l&#8217;excellent site <a title="GT Metrix" href="http://www.gtmetrix.com">www.gtmetrix.com</a>. Pour ceux qui comme moi utilisent Opera ou qui ont un browser exotique et qui n&#8217;ont pas nativement ces plugins, c&#8217;est bien utile d&#8217;avoir à la fois Yslow et Pagespeed au même endroit, dans une même page.</p>
<p style="text-align: center"><strong>Pagespeed :</strong><br />
<a rel="attachment wp-att-1524" href="http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/attachment/pagespeed/"><br />
<img class="size-medium wp-image-1524 aligncenter" title="pagespeed screenshot" src="http://www.wikigento.com/wp-content/uploads/2010/07/pagespeed-500x388.jpg" alt="pagespeed screenshot" width="500" height="388" /></a></p>
<p style="text-align: center"><strong>Yslow :</strong><br />
<a rel="attachment wp-att-1525" href="http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/attachment/yslow/"><br />
<img class="size-medium wp-image-1525 aligncenter" title="yslow screenshot" src="http://www.wikigento.com/wp-content/uploads/2010/07/yslow-500x391.jpg" alt="yslow screenshot" width="500" height="391" /></a></p>
<p style="text-align: center"><strong>GT Metrix :</strong><br />
<a rel="attachment wp-att-1526" href="http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/attachment/gtmetrix/"><br />
<img class="size-medium wp-image-1526 aligncenter" title="gtmetrix" src="http://www.wikigento.com/wp-content/uploads/2010/07/gtmetrix-500x384.jpg" alt="gtmetrix" width="500" height="384" /></a></p>
<h1>Lire les résultats</h1>
<p style="text-align: justify;">Evidemment le but est atteindre le rating maximum, soit A/A ou 100%/100%.</p>
<p>C&#8217;est pour ainsi dire impossible donc si on peut aller à une note très intéressante, ca sera déjà pas mal. Ceci va en plus réduire le temps de chargement de la page et donc nous faire passer sous la barre d&#8217;1,5 seconde et donc améliorer la façon dont nous considère Google.</p>
<p>Dans l&#8217;immédiat, on voit que Pagespeed à un peu plus de critères mais on retrouve 70% de points communs soit une forme ou une autre alors je vais les grouper par types.</p>
<h2>Pagespeed : &laquo;&nbsp;Parallelize downloads across hostnames&nbsp;&raquo;<br />
Yslow : Use Cookie-free domains<br />
Pagespeed : Serve static content from a cookieless domain</h2>
<p style="text-align: justify;">C&#8217;est quasi comparable, dans le principe il s&#8217;agit de permettre aux browsers qui viennent de télécharger vos contenus de sites depuis plusieurs serveurs distincts afin de leur permettre d&#8217;établir plus de connexions simultannées. En gros, pour ne pas saturer les serveurs, les browser ne s&#8217;authorise que 6 à 15 connexions vers un même serveur, c-a-d qu&#8217;ils ne téléchargent que 6 à 15 éléments simultanéments et attendent pour demande les suivants que des connexions se libèrent.</p>
<p style="text-align: justify;">C&#8217;est paramétrable du coté du client, sur le navigateur mais on ne va pas demander à chacun de modifier son paramétrage de navigateur donc il vaut mieux utiliser plusieurs serveurs, quand cela est possible, pour servir le contenu, notamment static. Ici, seul le hostname compte, vous pouvez avec le même serveur physique derrère un www1, www2 etc&#8230;</p>
<p style="text-align: justify;">Avoir 4 serveurs qui distribuent le contenu va permettre aux navigateurs d&#8217;aller beaucoup plus vite pour récupérer les contenus. Un petit regret ici, il aurait été plus simple d&#8217;intégrer un variable sur le nombre de thread concourrant accepté directement dans le handshake http 1.1. Ca aurait permis d&#8217;accélérer en basse charge et de diminuer pendant les pics. On peut aller plus loin aussi en servant depuis plusieurs endroits, sur un domaine différents &laquo;&nbsp;cookieless&nbsp;&raquo;.</p>
<p style="text-align: justify;">Ce n&#8217;est pas très compliqué à faire en réalité. Le plus simple c&#8217;est d&#8217;enregistrer un nom domaine différent de celui du site, par exemple static-nbs-system.com et de mettre un CNAME dans la zone DNS qui pointe sur l&#8217;enregistrement A du site (en l&#8217;occurence nbs-system.com). Ensuite on configure le service web pour fournir les ressources statiques depuis ce nouveau domaine, on interdit de poser les cookies sur ce domaine et dans les pages web on appelle les ressources statiques sur ce domaine. On peut bien sûr reproduire le schéma avec n host sur ce nouveau domaine, static1.blablabla, static2.blablabla etc&#8230;</p>
<p style="text-align: justify;">Ca à l&#8217;air bien sur le papier mais si le framework le gère pas, il va falloir éditer des fichiers de config, des fichiers php ou HTML ou encore jouer de la commande sed pour automatiser le remplacement de l&#8217;url. (<a title="manuel de survie Unix" href="http://www.wikigento.com/general/manuel-de-survie-unix-linux-2°-partie/">pour sed, vous pouvez voir l&#8217;article ici</a>)</p>
<p style="text-align: justify;">Je ne sais pas si ca à une influence sur la SEO par contre. Vu que le nom et l&#8217;URL des ressources statiques participe à la SEO on m&#8217;a dit, je ne sais pas l&#8217;impacte.<br />
Faible je suppose vu que ce sont des plugins de moteurs de recherche qui conseillent ce mouvement&#8230; Un pro de la SEO pour m&#8217;éclairer ?</p>
<h2>Yslow : &laquo;&nbsp;Use a Content Delivery Network (CDN)&nbsp;&raquo;</h2>
<p style="text-align: justify">L&#8217;idée est un peu la même mais à une petite nuance prêt. Yslow conseil l&#8217;usage d&#8217;un CDN de manière absolu, un qui soit connu pour le reprérer. Pagespeed lui conseille de multiplier les sources servant les fichiers. L&#8217;idée de fond reste proche, servir le plus vite possible les éléments, depuis des sources spécialisées. Soit vous prenez un CDN connu (Akamai, limewire etc&#8230;) soit votre prestataire à le sien, soit vous en <a title="Liste de CDN" href="http://fr.wikipedia.org/wiki/Content_Delivery_Network#CDNs_Gratuits">prenez un gratuit</a>.</p>
<p>Dans les deux derniers cas, Yslow ne connaitra probablement pas votre CDN et vous devrez malgré tout trainer une mauvaise note sur ce sujet&#8230; Ca n&#8217;empêche pas d&#8217;avoir un A cependant car pour Yslow, c&#8217;est un point moyennement important. Et puis soyons honnête, avoir un CDN (Content Delivery Network) ce n&#8217;est utile que pour des sites qui servent à destinations de plusieurs pays distants, dans la majorité des cas, un serveur de ressources statiques suffit.</p>
<h2>Yslow : &laquo;&nbsp;Add Expire headers&nbsp;&raquo;,<br />
Pagespeed : &laquo;&nbsp;Leverage Browser Caching&nbsp;&raquo;</h2>
<p style="text-align: center">
<p style="text-align: justify">Ca joue beaucoup, ca compte beaucoup et, bonne nouvelle : c&#8217;est facile à faire !</p>
<p style="text-align: justify">Avec Apache, un petit tour dans la configuration, on ajoute le mod Expire et le mode Etags et on met les lignes de configurations suivantes :</p>
<p style="text-align: justify">LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so<br />
ExpiresActive On</p>
<pre>FileETag MTime Size</pre>
<pre>&lt;IfModule mod_expires.c&gt;
 ExpiresActive on
 ExpiresByType image/jpg "access plus 6 months"
 ExpiresByType image/jpeg "access plus 6 months"
 ExpiresByType image/gif "access plus 6 months"
 ExpiresByType image/png "access plus 6 months"
 ExpiresByType text/ico "access plus 6 months"
 ExpiresByType image/ico "access plus 6 months"
 ExpiresByType image/icon "access plus 6 months"
 ExpiresByType image/x-icon "access plus 6 months"
 ExpiresByType application/x-shockwave-flash "modification plus 6 months"
 ExpiresByType text/css "access plus 1 week"
 ExpiresByType text/javascript "access plus 1 week"
 ExpiresByType text/html "modification plus 1 week"
 ExpiresByType text/xml "modification plus 2 hours"
 ExpiresByType image/vnd.microsoft.icon "access plus 6 months"
 ExpiresDefault "access plus 1 week"
 #Header set Cache-Control "max-age=86400, public"
&lt;/IfModule&gt;</pre>
<pre>&lt;FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$"&gt;
 Header set Cache-Control "max-age=290304000, public"
&lt;/FilesMatch&gt;</pre>
<p style="text-align: justify">Voila, on a indiqué à Apache qu&#8217;on calculait la fraicheur d&#8217;une ressource en fonction de la date d&#8217;accès et de sa taille  (FilteEtag MTime  Size) et ensuite on lui a donné, par type de ressources, un temps d&#8217;expiration du cache. En résumé, quand votre navigateur récupère une donnée, il a le droit de la garder 6 mois si c&#8217;est un jpg par exemple, 1 semaine si c&#8217;est un javascript.</p>
<p style="text-align: justify">Evidemment, il faut le paramétrer en fonction de votre site et de la fréquence à laquelle vous mettez vos éléments à jour. Enfin, autre format, les 3 dernières lignes mettent une expiration à 480 semaines par défaut sur les ressources du type cité.</p>
<p style="text-align: justify">Si vous développez, il est fortement conseillé d&#8217;avoir une préproduction sur laquelle vous n&#8217;avez pas ces lignes, afin d&#8217;avoir le résultats de vos modifications instantanément et pas 480 semaines plus tard <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify">Les deux plugins considèrent, à juste titre, que c&#8217;est un point important.</p>
<h2>Yslow : Compress components with Gzip<br />
Pagespeed : Enable Gzip compression</h2>
<p style="text-align: justify">Il peut y avoir un peu débat sur celui-là, et encore. En gros le débat serait que sur un serveur dont le CPU est chargé, faire du Gzip en plus, ca aggrave le problème&#8230; Oui et non. Déjà, l&#8217;algorithme Zip est ultra rapide et optimisé, ca prends très peu de ressources à processeur moderne. En plus, servir plus vite c&#8217;est aussi diminuer sa charge de travail quelque part (on peut traiter plus de monde).</p>
<p style="text-align: justify">Coté débat, nous chez NBS, en matière de serveur E-commerce, on a tranché, c&#8217;est oui.</p>
<pre>&lt;IfModule mod_php5.c&gt;
   php_flag zlib.output_compression on
&lt;/IfModule&gt;</pre>
<pre>&lt;IfModule mod_deflate.c&gt;
 SetOutputFilter DEFLATE
 AddOutputFilterByType DEFLATE text/*
 DeflateFilterNote ratio
# Patch pour les navigateurs qui ne supportent pas
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch ^Mozilla/4\.0[678] no-gzip
 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Humm compresser les images, ce n'est pas utile, loin de là
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
&lt;/IfModule&gt;</pre>
<p style="text-align: justify">Bon, c&#8217;est assez simple et explicite, on compresse tout ce qui est textuel, on désactive pour les vieux Mozilla 4 et les IE, on ne compresse pas les images.</p>
<p style="text-align: justify">Ca réduit bien les transferts mine de rien :</p>
<p style="text-align: justify">
<tr height="20">
<td width="77" height="20">Type</td>
<td width="98">Uncompressed</td>
<td width="84">Compressed</td>
<td width="57">Win</td>
</tr>
<tr height="20">
<td height="20">doc / HTML</td>
<td align="right">44,5</td>
<td align="right">14,8</td>
<td align="right">67%</td>
</tr>
<tr height="20">
<td height="20">js</td>
<td align="right">25,1</td>
<td align="right">10,4</td>
<td align="right">59%</td>
</tr>
<tr height="20">
<td height="20">js</td>
<td align="right">57,2</td>
<td align="right">19,7</td>
<td align="right">66%</td>
</tr>
<tr height="20">
<td height="20">js</td>
<td align="right">0,9</td>
<td align="right">0,4</td>
<td align="right">56%</td>
</tr>
<tr height="20">
<td height="20">js</td>
<td align="right">90,4</td>
<td align="right">29,8</td>
<td align="right">67%</td>
</tr>
<tr height="20">
<td height="20">js</td>
<td align="right">17,4</td>
<td align="right">8,1</td>
<td align="right">53%</td>
</tr>
<tr height="20">
<td height="20">css</td>
<td align="right">30,9</td>
<td align="right">6</td>
<td align="right">81%</td>
</tr>
<tr height="20">
<td height="20"></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr height="20">
<td height="20">économie</td>
<td align="right">177,2</td>
<td>Ko</td>
<td align="right">33%</td>
</tr>
<p style="text-align: justify">C&#8217;est tangible et appréciable, ca économise de la bande passante des deux cotés, c&#8217;est tout bon !</p>
<h2>Yslow : Minify Javascript and CSS<br />
Yslow : Remove duplicate Javascript and CSS<br />
Pagespeed : Combine   external JavaScript<br />
Pagespeed : Minify Javascript<br />
Pagespeed : Removed unused CSS<br />
Pagespeed : Minify CSS<br />
Pagespeed : Combine external CSS</h2>
<p>Okay, ca fait beaucoup d&#8217;un coup mais c &#8216;est la même logique derrière.</p>
<p style="text-align: justify;">Le principe de fond : on regroupe les CSS et les Javascript en deux fichiers au lieu de 15, on les nettoye des bouts de codes ou expressions non utilisées, on les &laquo;&nbsp;minify&nbsp;&raquo; (on les densifie, on enlève les espaces et les choses inutiles).</p>
<p>L&#8217;idée est bonne mais ca fait un code peu maintenable, alors le conseil du pro : on fait son site sur la préproduction et on se fait un script bash de mise en production qui fait le ménage et compacte  le tout au moment de la mise en production. Comme cela, on a une préproduction qui reste efficace à maintenir avec des fichiers lisibles et un production optimisée.</p>
<p style="text-align: justify;">Pour réaliser ces optimisations, deux possibilités voir même beaucoup plus. Pagespeed à la gentillesse de fournir certains fichiers optimisés directement depuis le plugin. On le sauve, on le met sur la production et hop, c&#8217;est finit. Pour optimiser ses CSS on a aussi le site <a title="CSS optimiser" href="http://www.cssoptimiser.com/">cssoptimiser</a> ou le <a title="CSS cleaning" href="http://www.cleancss.com/">cssclean</a>. Bref ce ne sont pas les outils qui manquent. Pour les combiner, ca dépend de la technologie, sous Magento on a Fooman speedster, sous WordPress il y a CSS-JS-Booster de mémoire, parfois vous devrez tout simplement le faire à la main.</p>
<p>Evidemment enlever le code inutile des JS et/ou des CSS, c&#8217;est un impératif.</p>
<p style="text-align: justify;">En réduisant le nombre de fichiers, on réduit le nombres de requêtes HTTP, on économise des transferts, de l&#8217;overhead, bref, là encore c&#8217;est du tout bon.</p>
<p style="text-align: justify;">Personnellement, j&#8217;ai massivement utilisé les fichiers directement issus de Pagespeed quand il m&#8217;en proposait, c&#8217;est parfait.</p>
<p style="text-align: justify;">La plupart du temps, ces modifications sont considéré comme importantes par les plugins.</p>
<h2>Yslow : Avoid CSS expressions<br />
Pagespeed : Use efficient CSS Selectors</h2>
<p style="text-align: justify">J&#8217;ai regroupé ces deux là car ils touchent aux CSS et à leur optimisation. C&#8217;est un réel enjeu car les navigateurs se débrouillent plus ou moins bien avec les CSS et cela peut engendrer des délais du coté de l&#8217;utilisateur.</p>
<p>Yahoo Yslow nous dit d&#8217;éviter les expressions CSS, ce qui permet de changer dynamiquement un CSS si le browser est redimensionné par exemple. Le problème c&#8217;est que ces expressions sont appelées tout le temps, pendant la génération de l&#8217;affichage, au redimensionnement, parfois pendant le scrolling. Du coup ca charge un maximum le navigateur client. Ceci étant tous les frameworks ou presque évite ca comme la peste, vous ne devriez pas avoir de soucis avec. Sinon, il faut s&#8217;en passer et réécrire les portions du CSS qui utilisait ce système.</p>
<p style="text-align: justify">Google Pagespeed nous indique pour sa part qu&#8217;il est préférable d&#8217;utiliser des CSS selector efficaces. Ouiiiiiii, c&#8217;est à dire qu&#8217;on est pas contre, mais c&#8217;est quoi la différence entre un bon et un mauvais CSS selector ? C&#8217;est comme la chasse. Le bon chasseur, il voit&#8230; okay&#8230; on reprend.</p>
<p style="text-align: justify">Le but c&#8217;est d&#8217;éviter d&#8217;appliquer une clef de sélection peu efficace à un grand nombre d&#8217;éléments car cela pénalise les performances du navigateur. Mais cela va plus loin c&#8217;est plus une connaissance générale de la grammaire CSS qu&#8217;il faut avoir.</p>
<p style="text-align: justify"><span style="text-decoration: underline;">Par exemple, il vaut mieux :</span></p>
<ul>
<li style="text-align: justify">utiliser une classe pour appliquer un style à de nombreux élements</li>
<li style="text-align: justify">privilégier le mécanisme d&#8217;héritage</li>
<li style="text-align: justify">utiliser des règles spécifiques</li>
<li style="text-align: justify">utiliser des class et ID plutot que des sélecteur de type Tag</li>
<li style="text-align: justify">éviter les qualificateurs redondants (ex : ID selectors par class et class selectors qualifiés par un tag selector)</li>
<li style="text-align: justify">éviter les sélecteurs descendants, surtout pour ceux qui pointe des ancêtres redondants (par exemple bidy ul li a {&#8230;} est un sélecteur redondant puisque tous les éléments sont des descendants de ce tag)</li>
<li style="text-align: justify">utiliser des sélecteurs de class plutot que des sélecteurs descendants</li>
<li style="text-align: justify">si vous devez utiliser un selecteur descendant, préférez un &laquo;&nbsp;child selector&nbsp;&raquo; qui nécessitera moins d&#8217;interprétation.</li>
<li style="text-align: justify">dans le cas d&#8217;IE, évitez les :hover pour les éléments qui ne sont pas des liens</li>
<li style="text-align: justify">si vous utilisez :hover sur des éléments qui ne sont pas des ancres, testez là sous IE 7 &amp; 8 pour être sur que ca fonctionne.</li>
</ul>
<p style="text-align: justify">Ok j&#8217;ai fais mon possible pour le traduire de l &#8216;anglais mais ce n&#8217;est pas mon domaine non plus alors si vous n&#8217;avez rien compris, <a href="http://gtmetrix.com/use-efficient-css-selectors.html">allez à la source, ici</a>. C&#8217;est un métier développeur Web, moi je vous le dis&#8230;</p>
<h2>Yslow : Avoid HTTP 404 (Not Found) error<br />
Yslow : Avoid URL redirects<br />
Pagespeed : Avoid bad requests<br />
Pagespeed : Minimize redirects</h2>
<p style="text-align: justify;">Ne riez pas et surtout vérifiez que vous n&#8217;en avez pas. Sur un site normal, en production normal, on ne doit pas tomber tous 3 objets sur un 404, ni même sur un 301 ou un 302. Qu&#8217;il y ait du rewriting temporairement pour maintenir une compatibilité, why not, que ce soit les 3/4 des URLs, encore plus vers un autre domaine, c&#8217;est  à proscrire.</p>
<p style="text-align: justify;">Les 404, on s&#8217;en doute, c&#8217;est mal, d&#8217;autant plus que c&#8217;est surtout votre SEO qui va prendre. Mais les redirections prennent du RTT (pas des vacances, du Round Trip Time, des voyages allers/retours), ce qui ralentit l&#8217;ensemble.</p>
<p style="text-align: justify;">Là aussi, c&#8217;est important, plus pour Pagespeed que pour Yslow qui tolère les 404 et dégrade moins la note.</p>
<p style="text-align: justify;">Pour trouver vos 404, les <a title="Google Webmaster tools" href="http://webmaster.google.com">google webmaster tools</a> peuvent vous aider, les plugins, dont Firebug vous les donnent, des sites sont aussi disponibles pour vous aider à les trouver. Personnellement, j&#8217;utilise Firebug, ca me suffit. (oui ok, je n&#8217;utilise pas que Opera, c&#8217;est vrai)</p>
<h2>Yslow : Do not scale images in HTML<br />
Pagespeed : Specify image dimensions<br />
Pagespeed : Optimize images<br />
Pagespeed : served scaled images</h2>
<p style="text-align: justify;">Alors, là on est sur de la logique pure et dure&#8230;</p>
<p style="text-align: justify">Si je prend une image en 800&#215;600, que je la pose sur le serveur et que je l&#8217;affice dans du 400&#215;300, j&#8217;ai transféré une image 2 fois trop grosse pour rien (en fait 4 fois trop grosse, faite la multiplication). Donc je dois servir des images de la taille de ce qui va être affiché.</p>
<p style="text-align: justify;">Je dois aussi spécifier les dimensions directement si possible (ca accélère le rendu des navigateurs) et bien sur, ne pas les redimensionner par du HTML, ce qui va à l&#8217;encontre de la précédente optimisation et aussi du fait qu&#8217;on a directement des images de la bonne taille.</p>
<p style="text-align: justify;">Pour ce qui est d&#8217;optimiser les images sans pertes de qualité, le plugin fournit tout seul les versions optimisées&#8230; C&#8217;est pas le bonheur ca ?</p>
<p style="text-align: justify;">Du bon sens on vous dit !</p>
<h2>Yslow : Put CSS at the top<br />
Pagespeed : Optimize the order of styles and scripts<br />
Pagespeed : Put CSS in the document head</h2>
<p style="text-align: justify">Le principe de fond c&#8217;est de charger les données dans l&#8217;ordre le plus efficient. Il faut que le début de la page puisse se charger le plus vite possible pour &laquo;&nbsp;visuellement occuper le terrain&nbsp;&raquo;. Si les images arrivent en dernier mais que tous les scripts sont chargés, le site est techniquement quasi fonctionnel mais inregardable.</p>
<p style="text-align: justify">Dans la première demi seconde, on doit donc passer les CSS pour &laquo;&nbsp;préparer le terrain&nbsp;&raquo;, formater la page et commencer à afficher du texte et des images puis faire passer les images nécessaires puis enfin le Javascript.</p>
<p>Une fois la page chargée, c&#8217;est rare qu&#8217;un utilisateur clic instantanément, il prend le temps de la lire un minimum avant de cliquer, le Javascript peut donc arriver un peu en retard, de même s&#8217;il se charge d&#8217;une animation, on peut patienter 1 seconde de plus, c&#8217;est moins génant qu&#8217;une page blanche.</p>
<p style="text-align: justify">Bon ca tient de la bonne parole inapplicable parfois. Par exemple WordPress continue de charger les JS en début de page en version avant 3.0 (je n&#8217;ai pas vérifié sur la 3.0). Sous Magento, selon votre site, vous aurez peut être besoin de certains JS rapidement. Bref, ca se fait bien en général mais le cas particulier est légion.</p>
<h2>Yslow : Reduce cookie size<br />
Pagespeed : Minimize request size</h2>
<p style="text-align: justify;">Là encore, on essaye de réduire la données &laquo;&nbsp;inutilement&nbsp;&raquo; transférée.<br />
L&#8217;idée c&#8217;est d&#8217;arrêter de transférer des cookies pour des ressources qui en ont aucun besoin, comme les images.</p>
<p style="text-align: justify;">Chaque cookie par le navigateur transféré va consommer un peu de bande passante et de temps, pour rien et des millions de fois sur un an. Je n&#8217;ai pas compté combien cela peut faire en arbre sur un an mais le bilan carbon des cookies inutiles est lamentable. D&#8217;une manière générale, réduire la taille des requêtes, des cookies et leur nombre au minimum.</p>
<p style="text-align: justify;">Alors Google et Yslow sont relativement d&#8217;accord, il faut servir les fichiers statiques depuis un domaines qui ne pose pas de cookies dans la transaction.</p>
<h2>Yslow : Make fewer HTTP requests</h2>
<p>Un croustillant celui-là. Ca à l&#8217;air anodin mais on pourrait faire un post rien que sur lui&#8230;</p>
<p style="text-align: justify;">J&#8217;aurais bien fait mon lache et laissé ca de coté si ce n&#8217;était pas justifié mais là&#8230; On va devoir le traiter, c&#8217;est pas un détail.</p>
<p style="text-align: justify;"><em>Welcome to the CSS Sprites world !</em></p>
<p style="text-align: justify;">Un sprite c&#8217;est quoi ? C&#8217;est globalement innofensif, c&#8217;est une image avec plein de morceau dans laquelle on découpe le bout dont on a besoin à un moment donné pour l&#8217;afficher. Oui, jusque là, ca à l&#8217;air innoffensif, attendez la suite.</p>
<p>Voici le CSS sprite du site NBS System, sur lequel Aymeric de l&#8217;agence Dnd (notre web agency) à sué sang et eau :</p>
<p style="text-align: center"><a rel="attachment wp-att-1553" href="http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/attachment/sprite1/"><img class="size-medium wp-image-1553 aligncenter" title="CSS sprite" src="http://www.wikigento.com/wp-content/uploads/2010/07/sprite1-500x340.png" alt="CSS sprite" width="500" height="340" /></a></p>
<p style="text-align: justify;">Si on résume la chose, c&#8217;est une image qui se comporte comme une carte. Quand on a besoin d&#8217;un bout de celle-ci, onva taper aux coordonnées X/Y qui vont bien et on on obtient ce que l&#8217;on a demandé. L&#8217;intérêt c&#8217;est qu&#8217;au lieu d&#8217;aller chercher 50 icones, on prend directement une grosse image, on fait donc 49 transferts http de moins avec toute l&#8217;économie d&#8217;overhead que ca représente.</p>
<p style="text-align: justify;"><span style="text-decoration: underline;">Du coup dans son CSS on change son image par : </span></p>
<p style="text-align: justify;">.blog .widget .header{height:42px;background:url(images/sprite.png) no-repeat 3px -258px;}</p>
<p style="text-align: justify;">Ca n&#8217;occupe aussi qu&#8217;une socket du navigateur au lieu de 50, ce qui part groupe de 10 impose 5 volées de récupération des données. (voir le paragraphe précédent et le leverage browser cache).</p>
<p style="text-align: justify;">Donc tout cela est merveilleux sauf que notre site, il vient rarement avec des sprites tout fait. Le graphiste lui, il fait des icones, il les fournit à l&#8217;intégration qui fait un CSS et du HTML et du coté sprites, il considère plus que c&#8217;est des boissons gazeuses.</p>
<p style="text-align: justify;">Alors comment on génère ses sprites ? Deux cas pour démarrer. Soit vous êtes fort chanceux et vous avez évitez la problématique des dégradés et des ombres et ca va considérablement faciliter votre travail. Soit vous avez un beau site mais vous allez y passer du temps à vos sprites&#8230;</p>
<p style="text-align: justify;">On peut le faire à la main, avec amour, mais ca prend un peu de temps&#8230; Quoiqu&#8217;il arrive, il faut passer par le stade préprod / prod, comme pour les compilations de JS /CSS sinon c&#8217;est pas facile à maintenir.</p>
<p style="text-align: justify;">Bonne nouvelles : Il existe des générateurs.<br />
Mauvaise nouvelle : Ca marche pas toujours et pas dans tous les cas.</p>
<p><span style="text-decoration: underline;">Trois bonnes pistes sérieuses :</span></p>
<ul>
<li style="text-align: justify;"><a title="Sprite me" href="http://spriteme.org/">Sprite me : Le plus atypique et très bien pensé.</a> Il marche en bookmarklet, l&#8217;avantage c&#8217;est qu&#8217;il génère les différences à faire dans son CSS en live, c&#8217;est bien fait, assez efficace.</li>
<li style="text-align: justify;"><a href="http://csssprites.com/">un autre générateur en ligne</a>, très simple mais moins complet aussi je trouve</li>
<li style="text-align: justify;"><a title="Spritegen" href="http://spritegen.website-performance.org/">un des plus complets</a> : spritegen</li>
</ul>
<p style="text-align: justify;">Il existe aussi un truc super bien je pense qu&#8217;à utilisé Aymeric pour mon site mais ce petit cachotier n&#8217;a pas voulu me dire son nom&#8230; Peut être une trouvaille ou un développement maison, je vais le cuisiner, n&#8217;hésitez pas à envoyer pleinnnnnnn de mails à l&#8217;agence DnD jusqu&#8217;à ce qu&#8217;ils lachent l&#8217;info !</p>
<p style="text-align: justify;">En complément : <a title="CSS Sprites" href="http://www.alistapart.com/articles/sprites">un article assez complet</a> traduit en Français <a href="http://www.pompage.net/pompe/sprites/">ici</a>. Sous WordPress il y avait Csprite qui était pas mal mais qui n&#8217;est plus maintenu&#8230; <a href="http://css-tricks.com/css-sprites/">Un autre article pas mal du tout ici</a>.</p>
<p style="text-align: justify;"><a href="http://www.interactivellama.com/blog/archives/photoshop-script-combine-two-images-css-hover-css-sprite/">Un moyen de générer vos CSS sprites avec Photoshop aussi ici.</a></p>
<p style="text-align: justify;">A l&#8217;époque où je faisais une fixation sur les CSS sprites, j&#8217;avais trouvé un binaire opensource assez formidable qui permettait de commenter un CSS normal et de le compiler après coup en un CSS utilisant un Sprite, tout en générant le sprite au passage. Top. Mais j&#8217;ai perdu la bookmark pour le moment alors dès que je l&#8217;ai retrouvé, je corrige ce post, si vous voyez de quoi je parles, postez moi un petit commentaire.</p>
<h1>Les derniers points</h1>
<h2>Yslow : Reduce the number of DOM elements</h2>
<p>Les objets DOM (Document Object Model) nécessitent d&#8217;être tous chargés et parsés avant que les interprêtations Javascript (notamment) ne démarrent. Donc plus d&#8217;objets, plus de taille et donc de transfert, plus de mémoire utilisée, plus de temps de traitement, plus de délai avant que toute la page ne soit prête.</p>
<p>Réduite la taille du DOM est donc important dans une certaine mesure.</p>
<p>C&#8217;est d&#8217;autant plus vrai que les surfers ont de plus en plus de pages ouvertes en tabs, si tout le monde force en Javascript et pose des DOM énorment, les browsers se tapent des indigestions et &#8230; ca rame. C&#8217;est une question d&#8217;hygiène globale du browser quelque part <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Yslow : Make favicon small &amp; cacheable</h2>
<p style="text-align: justify">Parfois, je n&#8217;aimerai pas être une mouche chez Yahoo. Celui qui a sortie celle-ci est légèrement <em>&laquo;&nbsp;tatillon&nbsp;&raquo;</em> quand même, voir dypterophile sodomite à tendance compulsive.</p>
<p>Bon la Favicon, en faire une petite, c&#8217;est pas trop dur. Optimisée non plus. Par contre, la rendre cachable, ca a été un poil énervant car Apache n&#8217;aimait pas le mime/type ico ou gif/jpg donc ca ne parait jamais dans le module mod_expire&#8230;</p>
<p>Très pénible jusqu&#8217;à ce que je trouve le type mime des favicons :</p>
<pre>ExpiresByType <strong>image/vnd.microsoft.icon</strong> "access plus 6 months"</pre>
<p>Et voila, c&#8217;est caché, d&#8217;un coup l&#8217;Internet va plus vite&#8230; ou pas.</p>
<h2>Yslow :  Avoid AlphaImageLoader filter</h2>
<p style="text-align: justify">Oui alors si certains sont encore assez téméraires pour tenter d&#8217;afficher des images transparentes, style png, dans un IE datant d&#8217;avant la version 7, je penses qu&#8217;il a d&#8217;autres priorité en terme d&#8217;optimisation que ce que je racontes là.  Les soins psychiatriques et une URL de download d&#8217;Opera, Firefox ou Chrome.</p>
<p>En gros si vous jouer avec de la gif / png transparente, IE ne gère pas ca très bien, au mieux ca le ralentit, parfois ca le fait planter, on a même vu des failles de sécurité grave sur ce sujet&#8230;</p>
<p>Donc forcément, il faut éviter de proposer une bouteille de vodka à un alchoolique, là c&#8217;est pareil, pas de png transparente pour IE.</p>
<h2>Pagespeed : Minify HTML</h2>
<p style="text-align: justify">Alors là, forcément, on s&#8217;affronte à un problème. Soit on a un framework (magento, drupal, wordpress etc&#8230;) qui fait ca tout seul, bref du php qui génère du HTML, soit on a fait le sien. La deuxième catégorie devient rare et dans la première, sans toucher au core, on a peut de moyen d&#8217;action en général.</p>
<p style="text-align: justify">La plupart des outils proposent un système de templates qu&#8217;on peut optimiser mais c&#8217;est parfois coton. A voir mais sur le site de NBS par exemple, pour 7,9 Ko à réduire, il me met un malus de 27% sur ce point et me dégrade la note à C&#8230; Abusif je trouve mais bon, soit.</p>
<h2>Pagespeed : Specify a cache validator</h2>
<p>L&#8217;idée c&#8217;est de donnée la méthode par laquelle on vérifie que la ressource est fraiche ou non. Sous Apache, ca se fait par l&#8217;intermédiaire du paramètre :</p>
<pre>FileETag MTime Size</pre>
<p>Là on précise à Apache qu&#8217;on décide que la ressource à changé si soit la date de modification à changée, soit la taille.</p>
<h2>Pagespeed : Specify a Vary:Accept-Encoding header</h2>
<p>Allez, devinez, c&#8217;est encore pour IE&#8230; Comme quoi on peut faire un produit ultra pourrit et l&#8217;imposer sur le marché. Ca on peut pas enlever ca à Microsoft. Je n&#8217;ai rien contre eux sur le fond mais sur le navigateur, ils ont vraiment pourrit le web.</p>
<p>Notre ami IE donc, ne support pas les Vary headers. Du coup, si il trouve dans le header d&#8217;une ressource autre chose que User-agent et Accept-encoding, il ne la cache pas&#8230; Dans le principe, totalement se passer du Vary header est le mieux.</p>
<h2>Pagespeed : Specify a character set early</h2>
<p style="text-align: justify">Dès qu&#8217;on précise le character set, le navigateur peut démarrer certaines interprêtation, dont Javascript. Avant il ne sait pas comment interpréter les données, il est donc conseillé de le faire vite. En fait rien ne s&#8217;oppose à le faire le plus tôt possible et tous les framework standard le font en général.</p>
<h2>Yslow : Make JavaScript and CSS external</h2>
<p style="text-align: justify;">Avoir des fichiers séparés pour les CSS et les JS permet de les stocker en cache et de ne pas les transférer dans le HTML à chaque échange ou chaque page. Donc il vaut mieux ne pas mettre son JS et son CSS directement dans le code HTML et faire un include de fichiers externes, c&#8217;est beaucoup plus propre et simple.</p>
<h2>Yslow : Make AJAX cacheable</h2>
<p>En fait sur ce point, ce qu&#8217;il faut comprendre derrière le laconique &laquo;&nbsp;Make Ajax Cacheable&nbsp;&raquo; c&#8217;est &laquo;&nbsp;Make Ajax requests results cacheable&nbsp;&raquo;.</p>
<p style="text-align: justify;">Faire un requête ajax en background pour fluidifier le trafic c&#8217;est top mais ne pas stocker la ressource récupérer en cache c&#8217;est gacher ce premier transfert, reconsommer de la bande passante, participer activement à la déforestation des ours en pologne, bref, c&#8217;est le mal.</p>
<h2>Yslow : Use GET for AJAX requests</h2>
<p style="text-align: justify;">oUn Get est plus valable qu&#8217;un POST car avec un GET on transfert le headers et les données en même temps, ca évite un transfert inutile. Cependant, si vous avez des requêtes un peu longues, IE n&#8217;accepte pas les requêtes de plus de 2Ko. Qui a dit &laquo;&nbsp;encore IE&nbsp;&raquo; ? Pas de dénigrement, on est là pour progresser, tous ensemble, même les browsers qui partent avec de sérieux handicapes de conception.</p>
<p style="text-align: justify;">Les vrais pervers tenteront donc de transférer en GET, des images PNG transparentes de plus de 2 Ko, en laissant le vary-header avec un IE. Là normalement, on a tout bon pour avoir un beau blue screen <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Yslow : Reduce DNS lookups<br />
Pagespeed : Minimize DNS lookups</h2>
<p style="text-align: justify">Une résolution DNS prends entre 10 et 100 ms en gros. Pendant ce temps, le browser doit attendre que la résolution se fasse. Si on peut lui éviter d&#8217;avoir à résoudre beaucoup de noms et/ou hostnames différents, c&#8217;est plutot positif. Cela va aussi à l&#8217;encontre des multiplication hostname sur un domaine différents pour paralléliser les download quelque part.</p>
<p>Une fois résolu, la réponse reste en général dans un cache local, on peut donc décemment imaginer que multiplier les hostnames (par exemple 4 statics) est correctement rentable et n&#8217;impose pas trop de lookups.</p>
<h2>Pagespeed : Remove query strings from static   resources</h2>
<p>Typiquement ca :</p>
<p>http://www.nbs-system.com/wp-includes/js/jquery/jquery.js?ver=1.3.2</p>
<p>La paramètre <strong>&laquo;&nbsp;?ver=1.3.2&#8243;</strong> empèche certains proxys (dont Squid notamment) de cacher la ressource.</p>
<h2>Pagespeed : Serve resources from a consistent URL</h2>
<p style="text-align: justify">Pour les ressources partagées sur de multiples pages ou sites, il vaut mieux que la référence se fasse par rapport à une unique URL.<br />
Cela permet notamment de ne pas renvoyer de fichier depuis plusieurs endroits différents, provocant des ns lookups d&#8217;ailleurs. L&#8217;exemple donné par Google c&#8217;est que si monsite.exemple.com et tonsite.exemple.com utilise le même JS, autant qu&#8217;il soit servit directement depuis un seul des deux sites, comme ca il sera déjà en cache dans le browser quand on ira de l&#8217;un à l&#8217;autre.</p>
<h1>Autres optimisations</h1>
<p style="text-align: justify;">D&#8217;une manière général, il y a beaucoup d&#8217;autres optimisations, plus systèmes celles-ci, j&#8217;en parlerai prochainement, peut être directement sur <a title="Blog NBS System" href="http://www.nbs-system.com/blog">le blog de NBS System</a>. Les reverses proxy, les compilations de noyaux, les optimisations de .htaccess etc&#8230;</p>
<p style="text-align: justify;">Mais bon, on a déjà de quoi s&#8217;amuser un peu là non ? <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Je paye ma tournée au premier qui nous sort son site en A/A, ensuite celui qui nous passe un site Magento en A/A et pareil pour celui qui fait 100%/100% (sans tricher). Ca fera trois tournées mais elles seront largement méritées, chacunes d&#8217;elles !</p>
<p style="text-align: justify;">
<p style="text-align: justify;">PS : La <a href="http://code.google.com/speed/page-speed/docs/rules_intro.html">doc de Google</a> sur ces sujets est excellente, n&#8217;hésitez pas à la consulter.</p>
<p style="text-align: justify;">
Vous pouvez également lire l&#8217;article d&#8217;Arnaud ici : <span style="font-size:11.0pt;font-family:"><a href="http://bit.ly/ban1Pm">http://bit.ly/ban1Pm</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/optimisation-de-sites-magento/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>E.T.C : Extend To Cloud, Magento pour les TRES gros trafics !</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/e-t-c-extend-to-cloud-magento-pour-les-tres-gros-trafics/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/e-t-c-extend-to-cloud-magento-pour-les-tres-gros-trafics/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 22:01:45 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[admin système & réseau]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=1308</guid>
		<description><![CDATA[E.T.C : Extend To Cloud, un infrastructure physique qui s'étend grâce au Cloud pour fournir à Magento des moyens d'accueillir de TRES gros trafics !]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: justify">Problématique</h1>
<p><BR></p>
<p style="text-align: justify">Les grandes marques sont de plus en plus présentes sur Internet par l&#8217;entremise de leurs sites web marchands. Ces marques sont capables de générer des trafics colossaux sur une journée, tout particulièrement pendant des périodes particulières comme les soldes.</p>
<p>De plus, les grands rendez vous sont souvent les mêmes pour les sites de E-commerce ce qui fait que tous consomment beaucoup de ressources en même temps.</p>
<p>Les trois grands types de ressources consommées pendant ces pics de charge sont les suivants : réseau (bande passante), processeur, RAM.</p>
<p>Que faire lors de ces soldes, lors de ces pics et surtout pour ces grandes marques ?</p>
<p>Passer de 100 000 Visiteurs uniques par jour à 500 000 relève du possible pour ces grands compte. En contrepartie, passer de 3 serveurs frontaux à 15, juste pour des pics temporaires, semble couteux et peu pertinent dans le long terme, sans compter le gachis de ressources.</p>
<h1 style="text-align: justify">Le Cloud (computing)</h1>
<p><BR></p>
<p style="text-align: justify">Le cloud computing est une solution technique qui permet l&#8217;usage de ressources de type CPU / RAM, Bande passante &laquo;&nbsp;au compteur&nbsp;&raquo;. Vous payez ce que vous consommer. Il y a un coût rémanent pour l&#8217;hébergement de fichiers sur le Cloud mais il est très réduit.</p>
<p>Cette solution de payement à la ressource réellement consommée est donc un moyen très adapté de ne mettre en place des ressources que quand cela est nécessaire et de ne facturer que ce qui est consommer.</p>
<p>Plusieurs Cloud existent, Amazon S3, Rackspace etc&#8230;</p>
<h1 style="text-align: justify">Du simple C.D.N à l&#8217;infrastructure</h1>
<p><BR></p>
<p style="text-align: justify">Le C.D.N veut dire Content Distribution Network. En résumé, les données statiques, images, films, css, html simple peuvent vous être fournit depuis un lieu proche de vous plutôt que depuis l&#8217;autre coté de l&#8217;océan. Ceci améliore la rapidité de chargement mais également déleste les serveurs centraux en les allégeant du travail &laquo;&nbsp;idiot&nbsp;&raquo; de distribution de fichiers.</p>
<p>La première utilisation des Clouds a été ce CDN, les pionniers du décentralisé étant par exemple Akamaï. Mais de nos jours, les ténors comme Amazon ou Google ont rationalisé des infrastructures beaucoup plus vastes et complexes que ce qui avait été conçu jusque là. Ils ont mis en place des systèmes spécifiques, allant parfois même jusqu&#8217;à faire développer leur propre hardware.</p>
<p>Une fois la puissance rationalisée et déployable à loisir, il est devenu simple pour ces ténors de &laquo;&nbsp;revendre&nbsp;&raquo; leur capacité d&#8217;accueil. Nous sommes alors passé du simple CDN à de la capacité d&#8217;accueil réelle avec, notamment, l&#8217;ajout de systèmes de base de donnée.</p>
<h1 style="text-align: justify">E.T.C <em>(*)</em> : Extend to Cloud, le cloud pour Magento</h1>
<p><BR></p>
<p style="text-align: justify">Chez NBS System, on a dû très tôt trouver des solutions à ce problème. Les grands comptes étant de plus en plus nombreux à basculer sous Magento et il était indispensable de proposer une solution rationnelle pour les accueillir.</p>
<p>Les éléments étant réunis, le projet E.T.C : Extend To Cloud était lancé. Une discussion avec Yoav Kutner, pas mal de test et de R&amp;D et voici E.T.C.</p>
<p>Le concept est, dans le principe, simple. Au moment où un site monte en volume de trafic, on instancie des parcelles du cloud pour accueillir une partie du trafic qui &laquo;&nbsp;déborde&nbsp;&raquo; de la capacité d&#8217;accueil physique, réelle. Si l&#8217;infrastructure physique permet d&#8217;accueillir 100 000 Visiteurs uniques par jour, l&#8217;E.T.C permet de multiplier par 4 à 5 cette capacité d&#8217;accueil.</p>
<p>Une fois les tests menés et les systèmes de déploiement / rétractation au point, il devient possible d&#8217;automatiser également la mise en place d&#8217;une extension vers<br />
le Cloud (ETC) quand cela est nécessaire.</p>
<h1 style="text-align: justify">Conclusion</h1>
<p><BR></p>
<p style="text-align: justify">Évidemment, présenté comme cela, E.T.C c&#8217;est assez simple.</p>
<p>En pratique il existe pas mal de contraintes et de tests à mener. Les outils pour être complètement &laquo;&nbsp;élastique&nbsp;&raquo; sont assez technique à réaliser. Pour être francs, la R&amp;D est &laquo;&nbsp;un peu&nbsp;&raquo; coriace mais le résultat est à la hauteur du boulot fournit !</p>
<p>Une capacité unique d&#8217;accueil, sans multiplier les serveurs à l&#8217;infini, mais qui peut, de manière élastique, s&#8217;auto dimensionner pour répondre à des très fortes charges temporaires. Bien évidemment il y a un coût de setup assez minime et ensuite subsiste uniquement un coût d&#8217;usage qui est très très nettement plus intéressant que le fait de multiplier les serveurs <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>L&#8217;offre est disponible dès ce mois de décembre  2009.</p>
<p style="text-align: justify"><em>(*) E.T.C (Extend To Cloud) est une marque et une technologie NBS System.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/e-t-c-extend-to-cloud-magento-pour-les-tres-gros-trafics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Construire son infrastructure Magento, partie 1/3 : firewall / RProxy / load balancer</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/construire-son-infrastructure-magento-partie-13-firewall-rproxy-load-balancer/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/construire-son-infrastructure-magento-partie-13-firewall-rproxy-load-balancer/#comments</comments>
		<pubDate>Fri, 22 May 2009 12:55:35 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation LAMP/Zend/Magento]]></category>
		<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[admin système & réseau]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[firewall magento]]></category>
		<category><![CDATA[firewall reverse proxy load balancer]]></category>
		<category><![CDATA[load balancer]]></category>
		<category><![CDATA[load balancer magento]]></category>
		<category><![CDATA[memcached magento]]></category>
		<category><![CDATA[reverse proxy]]></category>
		<category><![CDATA[reverse proxy magento]]></category>
		<category><![CDATA[squid magento]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=656</guid>
		<description><![CDATA[Installation et paramétrage d'un Firewall / Reverse Proxy / load balancer pour une infrastructure Magento.]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p><BR></p>
<p style="text-align: justify">Cet article est le premier d&#8217;une série de 3 sur la configuration d&#8217;un infrastructure Magento complète, comprenant pour l&#8217;exemple un serveur qui sera Firewall/Reverse proxy/Load Balancer, deux autres qui seront des Serveur Web frontaux et un quatrième qui sera en  charge de la base de données.</p>
<h2>Plan des posts<span style="text-decoration: underline;"> </span></h2>
<p style="text-align: justify">1/3 : Configuration du firewall, du load balancer et du Rproxy<br />
2/3 : Configuration des serveurs Web (APC / Apache / PHP)<br />
3/3 : Configuration de la base de données  (Mysql)<br />
<span style="text-decoration: underline;"><br />
</span></p>
<h2><span style="text-decoration: underline;"> </span>Le setup de l&#8217;infrastructure Magento</h2>
<p style="text-align: justify"><a rel="attachment wp-att-789" href="http://www.wikigento.com/?attachment_id=789"><img class="alignleft size-medium wp-image-789" title="archi de base" src="http://www.wikigento.com/wp-content/uploads/2009/05/schema1-305x500.jpg" alt="archi de base" width="305" height="500" /></a>Internet, routeurs et hop, on tombe sur quoi ?</p>
<p style="text-align: justify">Le Firewall, reverse proxy, load balancer.</p>
<p style="text-align: justify">Le premier élément réellement intelligent et puissant sur  lequel on va pouvoir travailler, le premier serveur quoi. Parfois l&#8217;élément Firewall est séparé et repose sur une appliance en amont mais dans le principe, si vous faites dans le full opensource, vous aimez netfilter et donc le firewall de Linux.</p>
<p style="text-align: justify">C&#8217;est par ailleurs un excellent Firewall, je vais donc l&#8217;intégrer à ce petit tuto et même démarrer par là !</p>
<p style="text-align: justify">Pour cet exemple et le paramétrage des fichiers de configuration, le firewall/RP/LB est en 192.168.1.1, les serveurs Web sont en 192.168.1.2 et .3 et la DB est en 192.168.1.4 et le magasin &laquo;&nbsp;virtuel&nbsp;&raquo; s&#8217;appel www.demostore.fr.</p>
<p style="text-align: justify">Enfin, cote ip publique, j&#8217;ai utilisé 33.44.55.66 comme étant celle de demostore.fr et 88.77.111.222 comme étant celle des admins. Vous trouverez ces paramètres dans les fichiers de configuration du firewall, du reverse proxy et du load balancer, il faudra les modifier pour vos besoins.</p>
<p style="text-align: justify">
<p><BR><br />
<BR></p>
<h2>Points non couverts dans ces 3 articles</h2>
<p style="text-align: justify">Je vais me la jouer un peu à la Ruquier, donc ce soir, on ne recevra pas, euh pardon, dans cette série de 3 articles, on ne verra pas :</p>
<ul>
<li>Comment faire de la redondance mutli datacenter avec BGP et les synchros de sites &amp; de DB</li>
<li>Comment séparer les flux de bases de données en écriture &amp; lecture sur deux DB</li>
<li>Comment faire du Master/Master Master/Slave ou du Cluster en Mysql</li>
<li>Comment isoler le backoffice en terme de performances sur les serveurs frontaux</li>
<li>Comment isoler le backoffice en terme d&#8217;accès aux bases de données</li>
</ul>
<p style="text-align: justify;"><span style="text-decoration: underline;">On ne verra pas tout cela car :</span><br />
D&#8217;une part parce que cela serait très long et très complexe à expliquer et que les compétences nécessaires pour faire le tour du sujet sont très vastes. D&#8217;autre part parce que ca va déjà faire un bon volume à rédiger et donc que ca va prendre du temps. Et enfin parce que ces points sont très critiques sur le terrain commercial et qu&#8217;ils sont actuellement des avantages en faveur de ma société vis à vis de ses concurrents.</p>
<p style="text-align: justify">Vu que la concurrence dans le milieu de l&#8217;infogérance Magento est assez active, ma société <a title="NBS System, infogérance Magento" href="http://www.nbs-system.com/hebergement" target="_blank">NBS System</a> ne peux pas se permettre de révéler ses tous derniers tricks ou ses toutes dernières optimisations pour l&#8217;infogérance ou l&#8217;hébergemnt de Magento, mais ce qui sera décrit dans les 5 articles correspond à ce que nous utilisions fin décembre 2008, donc des configurations tout à fait décentes et efficaces.</p>
<p style="text-align: justify;">
En plus mes collègues bossent en ce moment même avec Zend pour faire un papier très complet sur les performances et l&#8217;optimisation avec ZAS (Zend Application Server), je ne vais donc pas dévoiler de secrets avant la publication officielle au <a title="Bargento 2" href="http://www.bargento.fr" target="_blank">Bargento 2</a>.</p>
<h2>Préambule sur GRSEC/PAX</h2>
<p style="text-align: justify;">
Autre point, c&#8217;est peu décrit dans cet article mais plus dans un autre dont je donne le lien et aussi sur le net : <strong><span style="text-decoration: underline;">GRSEC + PAX c&#8217;est l&#8217;assurance vie de vos serveurs</span></strong>. Ce n&#8217;est pas une option : c&#8217;est un pré-requis. Grsec/Pax impose de recompiler le kernel, tache un peu complexe quand on a pas l&#8217;habitude mais le couple vous protège à 99,999% contre tous les overflow, les off by one et autres cochonneries de ce genre. Que ce soit apache, mysql, php, squid, memcached, apc etc&#8230; tous ces applicatifs peuvent avoir un jour une faille de sécurité. Grsec c&#8217;est l&#8217;assurance que même si ca se produit (et ca se produira), vos serveurs ne seront pas compromis.</p>
<h1>Le Firewall</h1>
<p><BR></p>
<h2>Configuration simple</h2>
<p style="text-align: justify">J&#8217;ai réalisé, il y a (très) longtemps de cela, <a title="Iptables et netfilter" href="http://www.nbs-system.com/dossiers/howto-iptables.html" target="_blank">un petit tutoriel pour prendre Iptables &amp; Netfilter en main</a>. Il est incomplet, très vieux, contient des erreurs ou des abbérations que je n&#8217;ai pas eu le temps de corriger dans les scripts mais les explications et schémas sont corrects. <em>Vous remarquerez au passage ma maîtrise considérable dans la création de page Web, celle-ci à faillit avoir de nombreuses récompenses pour l&#8217;utilisation audacieuse des CSS, mais finalement le jury a préféré un autre site (curieusement).</em></p>
<p><span style="text-decoration: underline;">Ceci étant, ce que l&#8217;on souhaite faire ici est assez simple :<br />
</span>- Interdire tout par défaut (comme tout firewall décent)<br />
- Authoriser spécifiquement les connexions d&#8217;administration depuis  nos IP<br />
- Permettre d&#8217;accéder directement aux serveurs derrière également depuis nos IP</p>
<p style="text-align: justify">Attention, il existe de très nombreux tricks à mettre en place pour avoir le top du top, dans le /proc/sys/net/ipv4, afin d&#8217;ajouter des règles anti DOS,  d&#8217;ajuster la stack IP pour la gestion des connexions demi ouvertes, gérer la réduction des timeouts, et puis aussi par des règles pour loger les attaques, ajouter des systèmes de sondes/IDS etc&#8230;</p>
<p>C&#8217;est un firewall assez basique que je vais exposer ici. Pour de très fortes charges, il faudra également vérifier les capacités de NAT de la machine qui repose sur un système de buckets, lui même calculé en fonction de la RAM de la machine. Il faudra également redonder la machine, etc&#8230; <em>(Mais avant que vous en soyez là, vous pourrez largement vous payer les services de personnes qui voient très bien de quoi je parles)<br />
</em></p>
<p><span style="text-decoration: underline;">Préparation du Kernel :</span></p>
<ol>
<li>On télécharge les patchs de GRSEC <a title="GRSEC patch" href="http://www.grsecurity.net/grsecurity-2.1.12-2.6.27.10-200812271347.patch.gz" target="_blank">ici</a>,<a title="GRadmin" href="gradm-2.1.12-200812271437.tar.gz"> ici</a> (et en option le patch pour iptables <a title="GRSEC patch iptables" href="http://www.grsecurity.net/grsecurity-iptables-1.4.0.patch">ici</a>)</li>
<li>On télécharge le kernel qui va avec la version de grsec <a title="Kernel 2.6.27.10" href="http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.27.10.bz2">ici</a></li>
<li>On détar/dézip les archives et on applique les patchs (<strong>bzip2 -d kernel*; tar xvf grsec*;patch -p0 &lt; gr*.patch</strong>)</li>
<li>On ajoute deux ou trois tools qui risque de manquer : <strong>install libncurses-dev ncurses-dev make gcc paxtest gradm2 chpax</strong></li>
<li>On configure le kernel (make menuconfig), voici l&#8217;ultra minimum :<br />
- Pas de support des modules, tout en statique (ca évite l&#8217;insertion de backdoor)<br />
- networking/networking options/netfilter/ip:netfilter configuration/activer la majorité des options<br />
- Security options / Grsec: activez tout sauf dans kernel auditing juste les relocations et forks, dans Pax mettez tout.</li>
</ol>
<p style="text-align: justify">C&#8217;est une config <u>ultra</u> minimaliste. Pour plus d&#8217;info de nombreux sites parle de la compilation du noyau, le <a title="howto iptables" href="http://www.nbs-system.com/dossiers/howto-iptables.html" target="_blank">howto iptables</a> est un peu plus précis aussi mais c&#8217;est trop long à expliquer pour avoir une place ici. Après, de nombreuses petites ou grands optimisations peuvent être effectuées au niveau du noyau, les  résultats, du coté performances, comme du coté sécurité s&#8217;en ressentiront. Disons que si vous avez correctement configuré votre kernel avec pax et grsec, normalement les autres options par défaut sont rarement débiles.</p>
<p><span style="text-decoration: underline;">Pour le firewall à proprement parler, on va faire simple dans un premier temps :</span></p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p656code1'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6561"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
</pre></td><td class="code" id="p656code1"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># short, simple, incomplete, not really commented iptables script for Debianed firewalls/rproxy/load balancers by Philippe Humeau (c) 2009 NBS System, lord Rusty forgive me, amen</span>
&nbsp;
<span style="color: #007800;">IPTABLES</span>=<span style="color: #ff0000;">&quot;/sbin/iptables&quot;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
start<span style="color: #7a0874; font-weight: bold;">&#41;</span> 
&nbsp;
<span style="color: #007800;">date</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #ff0000;">'%b %d %k:%M:%S'</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">ADMIN_IP</span>=<span style="color: #ff0000;">&quot;88.77.111.222&quot;</span> <span style="color: #666666; font-style: italic;"># &amp;lt;-------------- Change me !</span>
<span style="color: #007800;">SERVERS_IP</span>=<span style="color: #ff0000;">&quot;192.168.1.0/24&quot;</span>
<span style="color: #007800;">SERVERS_WEB1</span>=<span style="color: #ff0000;">&quot;192.168.1.2&quot;</span>
<span style="color: #007800;">SERVERS_WEB2</span>=<span style="color: #ff0000;">&quot;192.168.1.3&quot;</span>
<span style="color: #007800;">SERVERS_DB</span>=<span style="color: #ff0000;">&quot;192.168.1.4&quot;</span>
<span style="color: #007800;">INET</span>=<span style="color: #ff0000;">&quot;eth0&quot;</span>
<span style="color: #007800;">SERVERS</span>=<span style="color: #ff0000;">&quot;eth1&quot;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$date</span> -- Starting Firewall --&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>kern.log
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;31mSetting Default Policies to DROP \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> INPUT DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> OUTPUT DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> FORWARD DROP 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;33mFlushing all rules &amp;amp; tables \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-X</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-Z</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> INPUT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> OUTPUT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> FORWARD
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-F</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-Z</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-X</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-N</span> LOG_DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> LOG_DROP <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG <span style="color: #660033;">--log-tcp-options</span> <span style="color: #660033;">--log-prefix</span> <span style="color: #ff0000;">'Dropped: '</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> LOG_DROP <span style="color: #660033;">-j</span> DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-N</span> syn-flood
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> syn-flood <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">10</span><span style="color: #000000; font-weight: bold;">/</span>s <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">10</span> <span style="color: #660033;">-j</span> RETURN
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> syn-flood <span style="color: #660033;">-j</span> DROP 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;34m Set kernel networking tweaks \033[0m &amp;lt;-&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_forward
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_dynaddr
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>all<span style="color: #000000; font-weight: bold;">/</span>accept_source_route
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_timestamps
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_syncookies
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>all<span style="color: #000000; font-weight: bold;">/</span>accept_redirects
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>all<span style="color: #000000; font-weight: bold;">/</span>rp_filter
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>icmp_ignore_bogus_error_responses
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">16384</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_conntrack_max
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>all<span style="color: #000000; font-weight: bold;">/</span>log_martians
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">30</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_fin_timeout
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">2400</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_keepalive_time
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>kernel<span style="color: #000000; font-weight: bold;">/</span>printk
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1800</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_keepalive_time
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_window_scaling
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_sack
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">64</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_default_ttl
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">2048</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_queue_maxlen
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>icmp_ignore_bogus_error_responses
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>icmp_echo_ignore_broadcasts
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>tcp_ecn
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;33m INPUT RULING \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> all <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> ESTABLISHED,RELATED <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-s</span> <span style="color: #007800;">$ADMIN_IP</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">11211</span> <span style="color: #660033;">-j</span> ACCEPT <span style="color: #666666; font-style: italic;"># memcached</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">-s</span> <span style="color: #007800;">$SERVERS_IP</span> <span style="color: #660033;">-j</span> ACCEPT        <span style="color: #666666; font-style: italic;"># accept très (trop) générique pour les requêtes des serveurs au rp/lb/fw</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> ICMP <span style="color: #660033;">-i</span> SERVERS <span style="color: #660033;">-s</span> <span style="color: #007800;">$SERVERS_IP</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> ICMP <span style="color: #660033;">-i</span> lo <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-s</span> <span style="color: #007800;">$SERVERS_IP</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Spoofed packet: &quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-f</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Frag packet: &quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-p</span> icmp <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">12</span><span style="color: #000000; font-weight: bold;">/</span>hour <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG <span style="color: #660033;">--log-prefix</span> <span style="color: #ff0000;">&quot;ICMP: &quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">22</span> <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;SSH loggin attempt&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> ALL FIN,URG,PSH <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth XMAS scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> ALL SYN,RST,ACK,FIN,URG <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #660033;">--log-prefix</span> <span style="color: #ff0000;">&quot;Stealth XMAS-PSH scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> ALL ALL <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth XMAS-ALL scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> ALL FIN <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth FIN scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> SYN,RST SYN,RST <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth SYN/RST scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> SYN,FIN SYN,FIN <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth SYN/FIN scan(?)&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> ALL NONE <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">/</span>m <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Stealth Null scan&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">0</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Port 0 OS fingerprint&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> udp <span style="color: #660033;">--dport</span> <span style="color: #000000;">0</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;UDP port 0 OS fingerprint&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--sport</span> <span style="color: #000000;">0</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;TCP source port 0&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> udp <span style="color: #660033;">--sport</span> <span style="color: #000000;">0</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-j</span> LOG_DRop <span style="color: #666666; font-style: italic;"># &quot;UDP source port 0&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> multiport <span style="color: #660033;">--sports</span> <span style="color: #000000;">20</span>,<span style="color: #000000;">21</span>,<span style="color: #000000;">22</span>,<span style="color: #000000;">23</span>,<span style="color: #000000;">80</span>,<span style="color: #000000;">110</span>,<span style="color: #000000;">143</span>,<span style="color: #000000;">443</span>,<span style="color: #000000;">993</span>,<span style="color: #000000;">995</span> <span style="color: #660033;">-m</span> limit <span style="color: #660033;">--limit</span> <span style="color: #000000;">6</span><span style="color: #000000; font-weight: bold;">/</span>h <span style="color: #660033;">--limit-burst</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-j</span> LOG_DROP <span style="color: #666666; font-style: italic;"># &quot;Napta/smurfing/Drd/Dos&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-p</span> tcp <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">--syn</span> <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> DROP <span style="color: #666666; font-style: italic;"># &quot;drop TCP connexion wich doesn't start by a syn&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> INVALID <span style="color: #660033;">-j</span> DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> INPUT <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--syn</span> <span style="color: #660033;">-j</span> syn-flood 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;32m FORWARD RULING \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> INVALID <span style="color: #660033;">-j</span> DROP
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-p</span> all <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> ESTABLISHED,RELATED <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">80</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-i</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">443</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">20</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">21</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">22</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">25</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">80</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-i</span> <span style="color: #007800;">$SERVERS</span> <span style="color: #660033;">--dport</span> <span style="color: #000000;">443</span> <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> NEW <span style="color: #660033;">-j</span> ACCEPT 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;32m OUTPUT RULING \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> all <span style="color: #660033;">-m</span> state <span style="color: #660033;">--state</span> ESTABLISHED,RELATED <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> ICMP <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">20</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">21</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">22</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">25</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> UDP <span style="color: #660033;">--dport</span> <span style="color: #000000;">53</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">80</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> UDP <span style="color: #660033;">--dport</span> <span style="color: #000000;">123</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">123</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-A</span> OUTPUT <span style="color: #660033;">-p</span> TCP <span style="color: #660033;">--dport</span> <span style="color: #000000;">443</span> <span style="color: #660033;">-j</span> ACCEPT
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;33m Masquerading \033[0m &amp;lt;-&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--tcp-flags</span> SYN,RST SYN <span style="color: #660033;">-j</span> TCPMSS <span style="color: #660033;">--clamp-mss-to-pmtu</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-i</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$INET</span> <span style="color: #660033;">-j</span> MASQUERADE
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;-&amp;gt; \033[40m\033[1;32m Firewall Setup complete, activating Forward \033[0m &amp;lt;-&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_forward 
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;------------------------&amp;gt; \033[40m\033[1;32mEOF : End of Firewall \033[0m&amp;lt;-----------------------&quot;</span>
<span style="color: #000000; font-weight: bold;">;;</span> 
&nbsp;
stop<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;\033[40m\033[1;31m----------------------&amp;gt; Shutting down Firewall ! &amp;lt;----------------------\033[0m&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot; &quot;</span>
<span style="color: #007800;">IPTABLES</span>=<span style="color: #ff0000;">&quot;/sbin/iptables&quot;</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-X</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-Z</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> INPUT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> OUTPUT
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span> FORWARD
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-F</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-Z</span>
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-X</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_forward
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;-&amp;gt; DONE ! &amp;lt;-&quot;</span>
<span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Usage: /etc/init.d/firewall {start|stop}&quot;</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">;;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></td></tr></table></div>

<p><BR></p>
<p style="text-align: justify"><span style="text-decoration: underline;">Quelques points :<br />
</span>- N&#8217;oubliez pas de durcir tous vos noyaux de serveurs, tout spécialement celui-ci, avec le patch GRSEC pour le kernel Linux. (ca doit aussi être décrit dans le howto de mémoire).</p>
<p style="text-align: justify;">- Si on veut être plus méchant, au lieu de DROP on peut utiliser TARPIT si on a compilé iptables avec, ca fait un bel effet sur la machine attaquante !</p>
<p style="text-align: justify;">- Si le scipt ne charge pas c&#8217;est que j&#8217;ai fais un faute de frappe quelque part, corrigez là <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Si il ne charge pas parcequ&#8217;il manque des target, ajoutez les dans le noyau au moment de sa compilation.</p>
<h1>Le Reverse Proxy</h1>
<p><BR></p>
<h2>Introduction</h2>
<p style="text-align: justify">
<p style="text-align: justify">Le Firewall est une fonction en soit est très peu consommatrice car, sur un noyau linux, c&#8217;est embarqué. Netfilter et son application de pilotage iptables  sont des outils très puissants et très économes.</p>
<p style="text-align: justify">Dans le cas qui nous préoccupe, c&#8217;est d&#8217;autant plus vrai qu&#8217;on va filtrer très peu de chose, ce n&#8217;est pas non plus le firewall du pentagone, on va juste protéger les accès d&#8217;administration. Sur notre beau serveur, on a dépensé 0,000001% de la capacité CPU, que faire du reste ?</p>
<p style="text-align: justify">Hummmmm du folding@home, du calcul de Pi, un serveur Quake 3, du Seti project : non !</p>
<p>On va faire un reverse proxy et un load balancer qui eux peuvent commencer à occuper un peu la machine sur ses 99,999999 % de temps CPU restant.</p>
<p style="text-align: justify;">Le reverse proxy, c&#8217;est une histoire un peu plus complexe. Si on part sur une solution simple, Squid est très capable. Pour de la dentelle, qui nécessite aussi une optimisation du code pour en tirer le plein partit, Varnish est une solution plus costaud mais réellement plus longue à mettre en place. On va donc ici s&#8217;atteler à concevoir un Squid correcte.</p>
<h2>Rôle<span style="text-decoration: underline;"><br />
</span></h2>
<p><span style="text-decoration: underline;">Le rôle du reverse proxy c&#8217;est ca :</span><br />
<a rel="attachment wp-att-681" href="http://www.wikigento.com/?attachment_id=681"><img class="alignnone size-full wp-image-681" title="rp stats" src="http://www.wikigento.com/wp-content/uploads/2009/04/rp.jpg" alt="rp stats" width="394" height="358" /></a></p>
<p>Réduire les accès aux serveurs Web en les allégeants de tout ce qui n&#8217;a pas de valeur ajouté, tout ce qui n&#8217;est pas généré.  J&#8217;ai pris volontairement une page très lourde pour la démonstration.</p>
<p><span style="text-decoration: underline;">En l&#8217;occurence on va cacher :</span></p>
<ul>
<li>Le HTML</li>
<li>Les CSS</li>
<li>Les images</li>
<li>Les fichiers Javascript</li>
</ul>
<p style="text-align: justify">et forcément, le serveur Web, ca lui fait du bien. En résumé, il se concentre sur les requêtes Ajax et le PHP, il laisse les transferts &laquo;&nbsp;de base&nbsp;&raquo; au Rproxy. Evidemment, un tour de magie de ce type, ca consomme un maximum en RAM car il faut tout stocker en RAM pour aller vite. Si on doit charger chaque éléments depuis le disque dur, c&#8217;est plutôt lent. Un bon reverse proxy a donc beaucoup de RAM et un processeur correct, sans plus puisque la charge processeur est faible.</p>
<p style="text-align: justify">Au final, même si l&#8217;exemple ici, un peu exagéré, montre un gain de 97%, on gagne quand même en général au minimum 75% de trafic en moins vers le ou les serveurs Web. Donc qu&#8217;on ait un serveur Web ou plusieurs, le reverse proxy est <span style="text-decoration: underline;">in-dis-pen-sable</span>.</p>
<p style="text-align: justify;">Une autre optimisation intelligente sur ce point est à faire au niveau du code. Un fichier JS, un fichier CSS et pas des millions, ca change des choses. Du coup, concaténer tout cela intelligemment, c&#8217;est un plus non négligeable. Un gars s&#8217;est pris la tête à faire le boulot pour vous et encore mieux, il en a fait un plugin Magento, que demande le peuple ? Au fait ca s&#8217;appel <a title="Fooman speedster Module" href="http://www.magentocommerce.com/extension/457/fooman-speedster" target="_blank">Fooman speedster module</a> et, depuis l&#8217;invention de la fénéantise, c&#8217;est un des outils les plus indispensable pour optimiser sans se fatiguer.</p>
<h2>Installation de Squid</h2>
<p style="text-align: justify">
Vous êtes des gens biens, vous avez une Debian.</p>
<p>Vous pouvez aussi être des gens bien et ne pas avoir de Debian mais dans ce cas vous savez installer une tarball ou un package. Il y a même des gens bien qui travaillent avec OpenBSD par exemple, ils ont toute ma considération mais je ne ferai pas de howto pour <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (Il n&#8217;y a plus de gens bien sous HPUX rassurez moi ?)</p>
<p>Le coté &laquo;&nbsp;à la main&nbsp;&raquo;, je sais faire aussi mais, personnellement, j&#8217;adore APT et DPKG <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="text-decoration: underline;">Attention, on se concentre, installer Squid ce n&#8217;est pas simple sous debian :</span></p>
<p>~&gt; su   (on passe root car on est <span style="text-decoration: underline;">jamais</span> loggé en root par défaut)<br />
~&gt; apt-get install squid</p>
<p>Ok on respire, on a fait le plus dur. Un petit café pour se récompenser s&#8217;impose, bravo, vous avez bien bossé ! (merci aux gars de Gnu aussi). Ca c&#8217;est fait, Squid est installé, on souffle, on respire, c&#8217;était dur mais la vie est dure parfois.</p>
<h2>Configuration de squid en reverse proxy Magento</h2>
<p style="text-align: justify;">Phase 2, on essaye de faire croire aux patrons qu&#8217;on est payé à faire quelque chose de balaise et incompréhensible, qui mérite probablement une augmentation énorme mais qu&#8217;on va se contenter de 10% et une voiture de fonction : on édite le fichier de configuration.</p>
<p style="text-align: justify;">Bon Squid c&#8217;est un proxy et un reverse proxy. En gros ca permet dans un cas comme dans l&#8217;autre de gérer un cache pour que les fichiers régulièrement demandés soient dans un cache rapide, mémoire de préférence, plutot que redemandés voir ré interprétés par le serveurs Web. Ca allège énormément les serveurs dans le cas du reverse proxy. Le proxy cache les réponses des serveurs Web aux browsers http pour les acheminer au client sans les redemander. Le reverse proxy lui fait l&#8217;inverse (d&#8217;où le reverse), il stocke les réponses les plus souvent envoyées par le serveurs aux clients afin de servir ceux-ci sans demander quoique ce soit aux serveurs Web.</p>
<p style="text-align: justify;">Bref Squid c&#8217;est complexe, énorme, un fichier de conf de base ca fait dans les 7000 lignes avec les commentaires, je vous livre donc ici une version expurgée des commentaires, juste préparer pour du reverse proxy et dont toutes les fonctions ne sont pas activées, juste les principales. Encore une précision, quand vous utilisez un reverse proxy, n&#8217;oubliez pas que votre serveur Web ne verra plus toutes les requêtes&#8230; Eh oui, c&#8217;est bien le but d&#8217;ailleurs. Donc ce qui est intercepté doit être minutieusement loggé pour pouvoir avoir des stats et compléter celles des serveurs Web sous Apache.</p>
<p><span style="text-decoration: underline;">Allez, voici la configuration :</span></p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p656code2'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6562"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code" id="p656code2"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Squid sooooo basic configuration for Magento, by Philippe Humeau &amp;amp; Adrien Urban (c) 2009 NBS System</span>
acl manager proto cache_object
acl localhost src 127.0.0.1<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">32</span>
acl to_localhost dst 127.0.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span>
acl SSL_ports port <span style="color: #000000;">443</span>
acl Safe_ports port <span style="color: #000000;">80</span>		<span style="color: #666666; font-style: italic;"># http</span>
acl Safe_ports port <span style="color: #000000;">443</span>		<span style="color: #666666; font-style: italic;"># https</span>
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny <span style="color: #000000; font-weight: bold;">!</span>Safe_ports
http_access deny CONNECT <span style="color: #000000; font-weight: bold;">!</span>SSL_ports
icp_access deny all
htcp_access deny all
&nbsp;
http_port 192.168.1.1:<span style="color: #000000;">80</span> transparent <span style="color: #007800;">name</span>=proxy_int_IP
http_port 33.44.55.66:<span style="color: #000000;">80</span> transparent <span style="color: #007800;">name</span>=ip_demostore
hierarchy_stoplist cgi-bin ?
&nbsp;
cache_mem <span style="color: #000000;">6144</span> MB
maximum_object_size_in_memory <span style="color: #000000;">8</span> MB
memory_replacement_policy heap lfuda
cache_dir null <span style="color: #000000; font-weight: bold;">/</span>tmp
&nbsp;
&nbsp;
access_log <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>squid3<span style="color: #000000; font-weight: bold;">/</span>access.log squid
access_log <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>squid3<span style="color: #000000; font-weight: bold;">/</span>access-apache.log combined
refresh_pattern <span style="color: #7a0874; font-weight: bold;">&#40;</span>cgi-bin<span style="color: #000000; font-weight: bold;">|</span>\?<span style="color: #7a0874; font-weight: bold;">&#41;</span>	<span style="color: #000000;">0</span>	<span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">%</span>	<span style="color: #000000;">0</span>
refresh_pattern .		<span style="color: #000000;">0</span>	<span style="color: #000000;">20</span><span style="color: #000000; font-weight: bold;">%</span>	<span style="color: #000000;">4320</span>
icp_port <span style="color: #000000;">3130</span>
&nbsp;
acl localhost src 127.0.0.1<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span>
acl localnet src 192.168.1.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">24</span>
&nbsp;
acl debianUpdate dstdomain ftp.fr.debian.org              <span style="color: #666666; font-style: italic;"># pour les updates Debian</span>
acl debianUpdate dstdomain security.debian.org          <span style="color: #666666; font-style: italic;"># pour les updates Debian</span>
acl dstOutAllowed dstdomain ws.mperf.com                <span style="color: #666666; font-style: italic;"># pour le mailing, remplacer mailperf par votre fournisseur</span>
acl dstOutAllowed dstdomain chart.apis.google.com      <span style="color: #666666; font-style: italic;"># pour les beaux graphs à la google style</span>
acl dstOutAllowed dstdomain www.magentocommerce.com     <span style="color: #666666; font-style: italic;"># devinez</span>
acl dstOutAllowed dstdomain connect.magentocommerce.com <span style="color: #666666; font-style: italic;"># devinez v2.0</span>
acl dstOutAllowed dstdomain pear.php.net                           <span style="color: #666666; font-style: italic;"># devinez v3.0</span>
acl dstOutAllowed dstdomain schemas.xmlsoap.org                <span style="color: #666666; font-style: italic;"># pour les wsdl, soaperie et autres webservices</span>
&nbsp;
http_access allow localnet debianUpdate
http_access allow localnet dstOutAllowed
&nbsp;
acl IpInternal myportname proxy_int_IP
acl IpExternal myportname ip_demostore
acl dstdemostore dstdomain www.demostore.fr
acl dstdemostore dstdomain demostore.fr
never_direct allow dstdemostore
&nbsp;
<span style="color: #666666; font-style: italic;"># demostore</span>
cache_peer 192.168.1.2 parent <span style="color: #000000;">80</span> <span style="color: #000000;">0</span> no-query round-robin sourcehash
cache_peer 192.168.1.3 parent <span style="color: #000000;">80</span> <span style="color: #000000;">0</span> no-query round-robin sourcehash
cache_peer_access 192.168.1.2 allow dstdemostore
cache_peer_access 192.168.1.3 allow dstdemostore
&nbsp;
cache_peer_access 192.168.1.2 deny all
cache_peer_access 192.168.1.3 deny all
&nbsp;
http_access allow dstdemostore
&nbsp;
http_access deny all
&nbsp;
access_log <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>squid3<span style="color: #000000; font-weight: bold;">/</span>demostore-squid.log squid demostore
access_log <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>squid3<span style="color: #000000; font-weight: bold;">/</span>demostore-apache.log combined demostore</pre></td></tr></table></div>

<p style="text-align: justify">Dans cet exemple, votre serveur dispose de 8 Go de Ram et on en prend 6 pour le cache de squid. C&#8217;est évidemment à ajuster en fonction de votre configuration. (cache_mem 6144 MB) On a aussi une taille maximal de fichier à 8 Mo pour cacher les gros objets et on interdit le cache sur disque pour ne pas gréver les performances. On a paramétré le service Squid pour gérer www.demostore.fr et demostore.fr et donné l&#8217;accès aux serveurs vers d&#8217;autres hosts comme Magento connect ou les updates de Debian.</p>
<h2>Le load balancer</h2>
<p style="text-align: justify">Bonne nouvelle : c&#8217;est déjà fait !</p>
<p>Eh oui en donnant deux peers vous avez dit à Squid qu&#8217;il avait deux serveurs Web dont il devait s&#8217;occuper. Vous pourriez vouloir donner un poids différent (ici dans l&#8217;exemple c&#8217;est du 50/50) si vous avez des serveurs de puissance différentes. Il faudra alors ajouter Weight comme directive dans la déclaration des peers.</p>
<p>Le piège serait de faire du load balancing IP. Netfilter sait le faire, c&#8217;est même assez simple à mettre en oeuvre et pour tout vous dire c&#8217;est ce qu&#8217;on faisait à NBS System avant. Mais cela posait des problèmes quand le client arrivait d&#8217;une IP qui changeait en cour de session (gros firewall corporate qui nat par une autre connexion ou même simplement une adsl en ip variable). Du coup il vaut mieux passer par cette solution qui est plus propre.</p>
<h1>Memcached</h1>
<p><BR></p>
<h2>Introduction</h2>
<p style="text-align: justify">Nous y voila, la fin de l&#8217;aventure Firewall / Load Balancer / Reverse Proxy est proche&#8230;</p>
<p>Si je finis par ce point c&#8217;est aussi parce que c&#8217;est le plus facile quelque part.</p>
<p>On peut mettre memcached un peu partout dans l&#8217;infrastructure, sur le proxy, sur les serveurs Web ou même sur les serveurs de base de données. L&#8217;idée c&#8217;est de garder les sessions des surfers non pas en fichiers mais en mémoire. D&#8217;un point de vue performance, c&#8217;est très préférable et c&#8217;est simple à réaliser alors pourquoi s&#8217;en passer&#8230;</p>
<h2>Installation</h2>
<p style="text-align: justify">
On peut le mettre dans plusieurs endroit ce fameux memcached mais je préconise un serveur qui est unique et accédé / accessible par tous comme la base de données (si on a qu&#8217;un serveur de DB) ou le reverse proxy mais, si possible, pas sur les serveurs Web. En effet si l&#8217;un tombe, autant que l&#8217;autre puisse bosser et reprendre ses sessions. Evidemment, il vaut mieux que le dit serveur soit redondant ou bien costaud pour ne pas tomber sinon c&#8217;est toutes les sessions qu&#8217;on perd mais vu que le site tombera avec, ca sera un moindre problème <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<p><u>Oui, je sais, toujours un peu douleureuse cette phase sous Debian : </u><br />
~&gt; su   (on passe root car on est <span style="text-decoration: underline;">plus</span> loggé en root, normal)<br />
~&gt; apt-get install memcached php5-memcached</p>
<p>Allez, ca va aller, c&#8217;est finit&#8230; On respire lentement, le rythme cardiaque redescend !</p>
<h2>Configuration</h2>
<p>Dans le fichier local.xml de Magento, vous devriez pouvoir ajouter :</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p656code3'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6563"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p656code3"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;global<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cache<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;backend<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>memcached<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/backend<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;memcached<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;compression</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cache_dir</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hashed_directory_level</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hashed_directory_umask</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;file_name_prefix</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
             <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;default<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;host<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>192.168.1.1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/host<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
              <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>11211<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
             <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;persistent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/persistent<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
           <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/default<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/servers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/memcached<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cache<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;session_save<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[memcache]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/session_save<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;session_save_path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[tcp://192.168.1.1:11211?persistent=1]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/session_save_path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/global<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>On peut aussi mettre memcached en dehors de Magento et de sa configuration, tout simplement en installant le démon avec une configuration dans le /etc/memcached.conf :</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p656code4'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6564"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p656code4"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># memcached ultra simplistic config file by philippe Humeau (c) 2009 NBS System</span>
<span style="color: #660033;">-d</span>
logfile <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>memcached.log
<span style="color: #660033;">-m</span> <span style="color: #000000;">1024</span>
<span style="color: #660033;">-p</span> <span style="color: #000000;">11211</span> 
<span style="color: #660033;">-u</span> nobody
<span style="color: #660033;">-l</span> 192.168.1.1</pre></td></tr></table></div>

<p><BR></p>
<h1>Conclusion</h1>
<p><BR></p>
<ol>
<li>Vous méritez un café après tout ce travail</li>
<li>Je mérite un café après ce travail de rédaction</li>
<li>Il est incompréhensible que les producteurs de café soient pauvres</li>
<li>La personne qui monte un site Magento entièrement dédié au café, il va se faire du blé</li>
</ol>
<p style="text-align: justify">Oui&#8230; Je sais&#8230; J&#8217;ai toujours un petit soucis sur les conclusions mais bon, vous commencez à être habitués depuis le temps et puis je me soigne.</p>
<p>Prochain exercice de style, l&#8217;article 2/3 : Configuration d&#8217;un serveur Web pour Magento !</p>
<p style="text-align: justify">
PS : N&#8217;oubliez pas de vous inscrire pour Bargento 2, il reste encore quelques places et après on est complet, ce qui implique que même en arrivant à l&#8217;improviste sur place, on ne pourra pas vous faire rentrer pour rester dans les capacités d&#8217;accueil de la salle.</p>
<p>De plus, le papier sur Zend Application Server et les performances de Magento devrait apporter un jour nouveau et pas mal de complément sur ce mini tuto / howto.</p>
<p>Par manque de temps, je n&#8217;ai pas eu le temps de tout tester sur un serveur donc si il y a des boulettes dans les fichiers de configuration, n&#8217;hésitez pas à me les signaler, je modifierai l&#8217;article.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/construire-son-infrastructure-magento-partie-13-firewall-rproxy-load-balancer/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Magento et la SEO : quelques astuces de plus</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/magento-et-la-seo-quelques-astuces-de-plus/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/magento-et-la-seo-quelques-astuces-de-plus/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 14:47:52 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[fooman]]></category>
		<category><![CDATA[speedster]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=617</guid>
		<description><![CDATA[Un article intéressant sur la SEO et quelques optimisations.]]></description>
			<content:encoded><![CDATA[<p>Un excellent article (en anglais) : <a title="SEO Magento" href="http://yoast.com/articles/magento-seo/" target="_blank">Magento SEO</a>, écrit sur le blog Yoast et qui donne de très bons tips sur la SEO et plus généralement sur un paquet d&#8217;optimisations à passer sur la bête.</p>
<p>C&#8217;est beau, c&#8217;est clair et&#8230; très pertinent !</p>
<p>Ils nous parlent aussi du <a title="Fooman speedster" href="http://www.magentocommerce.com/extension/457/fooman-speedster" target="_blank">fooman speedster module</a> qui vient de passer dans le magento connect depuis le 22/03 !</p>
<p>En un mot comme en 100, jetez y un oeil ca vaut le coup. Depuis le temps que je grogne sur le fait que les sites nous arrivent en hébergement sont, neuf fois sur dix, pas optimisés pour un rond&#8230; Enfin un homme bon et généreux vous propose de grouper et compresser vos CSS et vos JS !</p>
<p>Globalement, ce joli petit module vous permet de regrouper (presque) tous vos Javascript en un ficher, idem pour les CSS. Il y a quelques exceptions, le classique print.css par exemple, mais sinon, sincèrement, s&#8217;en passer c&#8217;est se tirer dans le pied !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/magento-et-la-seo-quelques-astuces-de-plus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avant de poster les optimisations, parlons mesures !</title>
		<link>http://www.wikigento.com/test-bench/avant-de-poster-les-optimisations-parlons-mesures/</link>
		<comments>http://www.wikigento.com/test-bench/avant-de-poster-les-optimisations-parlons-mesures/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 09:10:28 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[Test / Bench]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[sessions magento]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=579</guid>
		<description><![CDATA[Avant toute chose, le Wiki a été mis à jour sur la partie dimensionnement des infrastructures Web. Ca se passe ici, si vous voyez des erreurs, n&#8217;hésitez pas à corriger. Alors, où en est-on sur le front des performances ? Eh bien si vous avez mis en place les optimisations qui sont recommandées, celles que [...]]]></description>
			<content:encoded><![CDATA[<p>Avant toute chose, le Wiki a été mis à jour sur la partie dimensionnement des infrastructures Web. Ca <a title="Dimensionnement de l'infrastructure Web" href="http://www.wikigento.com/wiki/index.php/Dimensionnement_de_l%27infrastructure_Web" target="_blank">se passe ici</a>, si vous voyez des erreurs, n&#8217;hésitez pas à corriger.</p>
<p>Alors, où en est-on sur le front des performances ?</p>
<p>Eh bien si vous avez mis en place les optimisations qui sont recommandées, celles que l&#8217;ont vous a expliqué chez Fragento ou ici, celles que l&#8217;on va vous exposer dans les prochains posts, bref si vous faites les choses correctement, vous pouvez atteindre de 200 à 800 sessions &laquo;&nbsp;Magento connectées&nbsp;&raquo; par core (coeur) de vos processeurs récents.</p>
<p>Mais avant de parler des optimisations en elles mêmes, il faut avoir des moyens de comparer, des unités et des repères communs. Je vous propose d&#8217;adopter des <em>&laquo;&nbsp;S.M.C</em>&nbsp;&raquo; comme unité.</p>
<h2>S.M.C ?</h2>
<p>En premier lieu &laquo;&nbsp;<strong>S</strong>essions <strong>M</strong>agento <strong>C</strong>onnectées&nbsp;&raquo;, qu&#8217;est-ce que cela peut bien représenter&#8230; ?</p>
<p>Déjà, on va réduire le nom à <strong>SMC</strong> pour éviter de trimbaler 5 lignes. On peut prendre de nombreux points de repères différents pour estimer la charge : les sessions apache, les Visiteurs Uniques (V.U) journaliers, horaires, le nombre de page vues, etc&#8230; Alors pourquoi choisir les SMC ?</p>
<p>Les SMC cela reste un indicateur pertinent car c&#8217;est Magento qui mesure cette valeur. Elle peut donc être utilisées dans d&#8217;autres contexte, pour faire d&#8217;autres calculs mais surtout elle est mesurée partout de la même façon, ce qui est important pour avoir des repères. Comme c&#8217;est Magento qui la mesure, on travail tous sur la même valeur.</p>
<p><span style="text-decoration: underline;">Comment les récupérer ? Avec une requête SQL en base de données tout simplement : </span><br />
<span style="color: #0000ff;">select count(*) from log_visitor where ADDTIME(utc_timestamp(), -1500) &lt;  last_visit_at;</span></p>
<p>Cela nous donne les sessions ayant eu une activité lors des 15 dernières minutes. C&#8217;est très proche de ce que l&#8217;on a dans le backoffice. Une dataquery et un script bash plus tard,</p>
<p><span style="text-decoration: underline;">On en fait un beau graphique </span><span style="text-decoration: underline;">pour les clients </span><span style="text-decoration: underline;">dans Cacti ou avec RRD, MRTG etc&#8230; :</span><br />
<a rel="attachment wp-att-581" href="http://www.wikigento.com/?attachment_id=581"><img class="aligncenter size-full wp-image-581" title="Graph SMC" src="http://www.wikigento.com/wp-content/uploads/2009/03/ss-20090317114824.jpg" alt="Graph SMC" width="580" height="208" /></a><br />
L<span style="font-size: medium;"><span style="font-family: times new roman,times;">à, par exemple, on voit un mailing. Monté en charge progressive du nombre de SMC pour atteindre les 1200 vers 18H00. Ca se corrèle bien avec le graphique d&#8217;utilisation des cores :</span></span></p>
<p><span style="font-size: medium;"><span style="font-family: times new roman,times;"><a rel="attachment wp-att-582" href="http://www.wikigento.com/?attachment_id=582"><img class="size-full wp-image-582 aligncenter" title="Graph Core" src="http://www.wikigento.com/wp-content/uploads/2009/03/ss-20090317114859.jpg" alt="Graph Core" width="594" height="221" /></a></span></span></p>
<p><span style="font-size: medium;"><span style="font-family: times new roman,times;">On 4 cores utilisés pour 1200, donc 300 utilisateurs par core, en l&#8217;occurence ce sont des AMD Shanghai 2374 à 2,3 Ghz. Comme ce sont des quad cores, on utilise un processeur complet. Évidemment on ne peut pas se permettre d&#8217;avoir tous les cores à 100% donc les autres processus Linux tournent sur un autre core dédié d&#8217;un autre processeur. Coté base de données, ca glandouille gentillement :</span></span></p>
<pre><a rel="attachment wp-att-583" href="http://www.wikigento.com/?attachment_id=583"><img class="size-full wp-image-583 aligncenter" title="Graph core DB" src="http://www.wikigento.com/wp-content/uploads/2009/03/ss-20090317115009.jpg" alt="Graph core DB" width="590" height="215" /></a></pre>
<pre><span style="font-size: medium;"><span style="font-family: times new roman,times;">Il faut lire 0,2 core (200 milli). Ceci étant ce site spécifique sollicite peu la base de données donc ce n'est pas représentatif non plus.</span></span></pre>
<h2>Tester les performances, tests de charge &amp; Benchmark !</h2>
<p>De nombreux outils existent, qui mesurent différentes choses. En test de charge purs, on a par exemple Load runner, Apache bench, Opensta etc&#8230; Coupler tout cela à des analyseurs de code ou de requêtes SQL (comme la console Mysql enterprise par exemple) permet d&#8217;optimiser le code mais ce n&#8217;est pas le sujet de ce post et Gilles nous fera peut être un petit article là dessus.</p>
<p>Non, ce qui nous intéresse ici, c&#8217;est d&#8217;évaluer le nombre de SMC que l&#8217;on peut servir dans de bonnes conditions avec la plateforme que l&#8217;on aura préparé. Pour cela, load runner et Opensta sont de bons outils. Apache bench n&#8217;est pas très adapté sincèrement car son test est toujours le même, donc avec la chaine de cache, à la fin de ces 2000 itérations, il vous sort joyeusement 250 000 connectés <img src='http://www.wikigento.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Opensta permet de définir des scénarii de tests et d&#8217;en jouer plusieurs, de front, à suivre, plusieurs fois les mêmes etc&#8230; Le soft tourne sous Windows, il est gratuit et opensource. On peut <a href="http://prdownloads.sourceforge.net/opensta/ostaw32-x86-1404.msi?download" target="_blank">le trouver ici</a> et même s&#8217;il n&#8217;est plus entretenu, il fonctionne bien et fait le boulot demandé.</p>
<p>Le but ici n&#8217;est pas de faire un manuel ou un howto d&#8217;opensta mais globalement d&#8217;expliquer ce qui représente de bonnes circonstance de tests, tout au moins réaliste. Ce que je fais, en général, c&#8217;est que je demande à mes clients, c&#8217;est de réaliser entre vingt et trente scénarii classique de surf. On enregistre un très simple de la personne qui vient sur la home et se déconnecte, un autre ou il fait une recherche un autre ou il clique de produit en produit, etc&#8230; Le plus le mieux mais également, le plus logique le mieux !</p>
<p>Le scénario de connexion à la home puis déconnexion, on va le jouer 25% du temps, puis celui du parcours de produit 1, le 2 et aussi les recherches. On mixe le tout savamment et on demande à plusieurs scénarii de se jouer sur le site. Trois qui surf, des connexions déconnexions sur la home, deux recherches en même temps etc&#8230; A la fin, on regarde les performances affichées par l&#8217;interface d&#8217;Opensta et celles collectées dans Cacti. On corrèle les graphs, on analyse et on arrive à estimer la charge que peux tenir un système ! En laissant tourner les scénarii un moment, le graph sera réaliste et on saura dire combien de S.M.C peut faire tenir un core standard.</p>
<p>La suite est un jeu d&#8217;enfant, on prend le nombre de V.U prévu en pic, on déduit le nombre de S.M.C que l&#8217;on doit pouvoir encaisser et on divise par la performance unitaire d&#8217;un Core. On sait alors combien de core on doit mettre en place et donc combien de processeurs !</p>
<p>Bon si une bonne âme veut bien écrire un tuto/howto sur Opensta, je passe mon tour pour le moment et je vous laisse juste en compagnie de deux shoots d&#8217;écran, le modeler et le commander :</p>
<p><a rel="attachment wp-att-592" href="http://www.wikigento.com/?attachment_id=592"><img class="alignnone size-medium wp-image-592" title="opensta-commander" src="http://www.wikigento.com/wp-content/uploads/2009/03/opensta-commander-500x223.jpg" alt="opensta-commander" width="500" height="223" /></a></p>
<p>On définit son scénario dans le modeler ci-dessous, on planifie dans le commander ci-dessus, et on a un autre module qui collecte et affiche les statistiques.</p>
<p><a rel="attachment wp-att-593" href="http://www.wikigento.com/?attachment_id=593"><img class="alignnone size-medium wp-image-593" title="opensta-modeler" src="http://www.wikigento.com/wp-content/uploads/2009/03/opensta-modeler-500x339.jpg" alt="opensta-modeler" width="500" height="339" /></a></p>
<p>Et voila !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/test-bench/avant-de-poster-les-optimisations-parlons-mesures/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Compression des pages (gzip) &amp; plugin firefox</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/compression-des-pages-gzip-plugin-firefox/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/compression-des-pages-gzip-plugin-firefox/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 14:21:34 +0000</pubDate>
		<dc:creator>Olivier</dc:creator>
				<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[yslow]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=549</guid>
		<description><![CDATA[utiliser Yslow pour détecter les ralentissements et activer mod_gzip pour accélérer les performances]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce qui est intéressant quand on fait des tutoriels c’est qu’on s’aperçoit que l’on a soit même mal appliqué les astuces que l’on va énoncer.</p>
<p style="text-align: justify;">Je voulais vous faire un petit tutorial sur comment optimiser un peu les pages en elles-mêmes, et finalement on va commencer par quelque chose de plus  basique la compression des pages.</p>
<p style="text-align: justify;">La première étape que je vous propose, c’est de télécharger pour ceux qui ne le connaissent pas encore un plugin pour firefox nommé <a href="http://developer.yahoo.com/yslow/">Yslow</a> qui nous donne de nombreuses informations sur l’optimisation de votre site. Ce plugin développé par Yahoo fait parti d’un ensemble de bonnes pratiques pour optimiser le temps de chargement de vos pages. Vous pouvez en retrouver la liste (en anglais) ici : <a href="http://developer.yahoo.com/performance/rules.html#cdn">http://developer.yahoo.com/performance/rules.html#cdn</a></p>
<p style="text-align: justify;">Et en complément quelques idées supplémentaires sur leur blog de développement:<br />
<a href="http://developer.yahoo.net/blog/archives/2008/03/yahoos_latest_p.html">http://developer.yahoo.net/blog/archives/2008/03/yahoos_latest_p.html</a></p>
<p style="text-align: justify;">Le premier onglet de ce plugin « Performance » nous donne des indications sur le respect de votre site de ces bonnes pratiques. Chaque élément est noté entre A et F et nous donne une idée des points que l’on a pu oublier, comme par exemple activer la compression gzip sur le serveur (bien que la note totale -souvent F- ne présente pas beaucoup d’intérêt car certaines règles sont difficiles à mettre en pratique).</p>
<p style="text-align: justify;">On observe d&#8217;ailleurs que Magento respecte naturellement nombres de ces règles (une bien connue maintenant étant la minification des js).</p>
<p style="text-align: justify;"><img src="http://www.wikigento.com/wp-content/uploads/2009/03/performance.jpg" alt="performance" width="405" height="368" /></p>
<p style="text-align: justify;">Ce qui nous amène au deuxième onglet, l’onglet « Stats », celui-ci permet d’obtenir le poids total de votre page, ainsi que la répartition du poids entre les différents éléments (images, css, flash, html) ainsi que le poids de votre page une fois que les éléments ont été chargé une première fois et sont dans le cache du navigateur.</p>
<p style="text-align: justify;"><img src="http://www.wikigento.com/wp-content/uploads/2009/03/yslow_stats.jpg" alt="yslow_stats" width="500" height="256" /></p>
<p style="text-align: justify;">On voit ainsi dans cet exemple la différence de poids que l’on peut avoir entre une page d’accueil avec ou sans la compression gzip. Je pense que je n’ai pas besoin de vous expliquer l’intérêt d’économiser 200Ko de trafic pour chaque internaute qui chargera votre page d’accueil.</p>
<p style="text-align: justify;">Enfin l’onglet « Components » nous permet d’avoir le détail pour chaque élément son poids (avant et après compression gzip), comme l’onglet Net (Réseau en français) du plugin Firebug, on peut voir en rouge les éléments qui n’ont pas été chargés ainsi que le temps de chargement de chaque élément. Cet onglet est intéressant puisqu’on peut classer les éléments par poids. On peut ainsi s’apercevoir qu’on a des images qui mériteraient une compression jpg plus forte, ou qu’un flash mériterait d’être optimisé (voir déplacé ou remplacé par quelque chose de plus léger si par exemple il est sur une la page d’accueil d’un site à fort trafic).</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-557" src="http://www.wikigento.com/wp-content/uploads/2009/03/components.jpg" alt="components" width="648" height="367" /></p>
<p style="text-align: justify;">J’arrive à mon deuxième point, la compression gzip. En complément du plugin Yslow ce lien <a href="http://www.whatsmyip.org/mod_gzip_test/">http://www.whatsmyip.org/mod_gzip_test/</a> permet de vérifier immédiatement que la compression est bien activée pour une url donnée.</p>
<p style="text-align: justify;">Pour activer la compression gzip cela suppose que le module apache adéquat soit chargé (mod_gzip qui se nomme maintenant mod_deflate), je vous laisse vous tourner vers votre hébergeur ou google pour vérifier que ce module est chargé.</p>
<p style="text-align: justify;">Ensuite quand le module est chargé, il faut également que les règles apache correspondantes aient été chargées, chose qui n’aura pas toujours été faite quand on vous livre un serveur. On a alors toutes les règles nécessaires dans le fichier .htaccess de notre bon vieux magento qu’il suffit de décommenter :</p>
<p style="text-align: justify;"><span style="color: #008000;">############################################<br />
## enable resulting html compression</span></p>
<p style="text-align: justify;">php_flag zlib.output_compression on</p>
<p style="text-align: justify;"><span style="color: #008000;">############################################<br />
## enable apache served files compression<br />
## http://developer.yahoo.com/performance/rules.html#gzip</span></p>
<p style="text-align: justify;"><span style="color: #008000;"> # Insert filter</span><br />
SetOutputFilter DEFLATE</p>
<p style="text-align: justify;"><span style="color: #008000;"> # Netscape 4.x has some problems&#8230;</span><br />
BrowserMatch ^Mozilla/4 gzip-only-text/html</p>
<p style="text-align: justify;"><span style="color: #008000;"> # Netscape 4.06-4.08 have some more problems</span><br />
BrowserMatch ^Mozilla/4\.0[678] no-gzip</p>
<p style="text-align: justify;"><span style="color: #008000;"> # MSIE masquerades as Netscape, but it is fine</span><br />
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html<br />
<span style="color: #008000;"> # Don&#8217;t compress images</span><br />
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary</p>
<p style="text-align: justify;"><span style="color: #008000;"> # Make sure proxies don&#8217;t deliver the wrong content</span><br />
Header append Vary User-Agent env=!dont-vary</p>
<p style="text-align: justify;">(On peut évidemment appliquer directement ces règles dans le httpd.conf d’apache quand on sait ce que l’on fait).</p>
<p style="text-align: justify;">Attention, si l&#8217;on transfert du Zip, le &laquo;&nbsp;php_flag zlib.output_compression on&nbsp;&raquo; va poser problème me remonte un lecteur !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/compression-des-pages-gzip-plugin-firefox/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dimensionner ses serveurs, simuler et estimer la performance</title>
		<link>http://www.wikigento.com/optimisation-systeme-reseau/dimensionner-ses-serveurs-simuler-et-estimer-la-performance/</link>
		<comments>http://www.wikigento.com/optimisation-systeme-reseau/dimensionner-ses-serveurs-simuler-et-estimer-la-performance/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 18:27:16 +0000</pubDate>
		<dc:creator>Philippe Humeau</dc:creator>
				<category><![CDATA[Latence]]></category>
		<category><![CDATA[Optimisation Système & Réseau]]></category>
		<category><![CDATA[général]]></category>
		<category><![CDATA[calcul de charge]]></category>
		<category><![CDATA[dimensionnement]]></category>

		<guid isPermaLink="false">http://www.blogento.com/?p=99</guid>
		<description><![CDATA[Méthodes, formules et calculs pour dimensionner une infrastructure Magento]]></description>
			<content:encoded><![CDATA[<p>La performance d&#8217;un site est vitale pour ses ventes ou sa consultation, deux géants célèbres ont fait des études sur ce point : Google et Amazon. Le premier a déterminer que si sa latence augmentait de 0,5s, il perdait 20% de son trafic et le second a déterminer qu&#8217;en répondant en 100 ms de plus, il perdait 1% de CA !</p>
<p>Il est très complexe de dimensionner les serveurs nécessaires et ajuster les paramètres systèmes afin d&#8217;être sûr d&#8217;obtenir une navigation agréable pour un grand nombre d&#8217;utilisateurs. L&#8217;empirisme commence à bien fonctionner avec le recul de plusieurs sites hébergés mais je pense qu&#8217;on peut faire mieux et commencer à structurer des calculs plus scientifiques.<span id="more-99"></span></p>
<p>Je vous ai parlé des différents processeurs du marché et des infrastructures blades. Aujourd&#8217;hui quand un client me demande un hébergement, je dois partir de ce qui existe pour m&#8217;assurer des performances que je peux lui offrir : son site. Il est optimisé ou pas, on le voit vite, si les caches bloc/eav ont bien été activés dans le code, si les requêtes en bases sont bien conçues, si les fichiers CSS/AJX sont regroupés, etc&#8230; On sait que l&#8217;optimisation du site a été pensée (et réalisée) ou pas.</p>
<p>Partons du principe que le code a été optimisé et qu&#8217;on cherche maintenant juste à dimensionner. Plusieurs outils vont nous servir : les logs d&#8217;apache (ou du reverse proxy si il y a un load balancing), les logs des tests Opensta et les informations fournies par Google Analytics.</p>
<p>Analytics fournit une information qualifiée et permet de faire quelques projections. Le problème c&#8217;est que toutes les pages ne sont pas forcément taggées, elles ne sont pas forcément les mêmes entre l&#8217;ancien et le nouveau site et enfin seules les pages consultées sont prises en compte, les webservices, ajax, les transferts de fichiers plus ou moins volumineux et les autres facteurs ne sont pas pris en compte. Donc seul les pages php générées (ou rproxysées) seront prises en compte mais ca constitue déjà un premier indice sur la charge que porte le CPU. Dans analytics :</p>
<ol>
<li>Dans le tableau de bord, prenez une période d&#8217;un jour de haute charge du site. (Un seul jour de sélectionné dans la période)</li>
<li>Cliquez sur visiteurs, puis visiteurs-tendances puis sur visites</li>
<li>Cliquez sur l&#8217;icone &laquo;&nbsp;Graphique horaire&nbsp;&raquo; à droite, juste au dessus du premier graphique</li>
<li>Prenez la tranche d&#8217;une heure qui contient le plus de visites et gardez le nombre au chaud</li>
<li>Allez ensuite dans nombre de pages vues, pour la même tranche horaire, prenez le chiffre</li>
<li>Allez enfin dans temps passé sur le site et prenez, toujours pour la même tranche horaire le temps moyen</li>
</ol>
<p>Ensuite, avec la formule (((temps de visite moyen en seconde)*(nombre de visiteur horaire))/3600) / ((temps de visite moyen en seconde)/(nombre de pages par visiteurs), vous savez le nombre de pages que les serveurs doivent générer par secondes. Certains sites charges toujours les mêmes pages, d&#8217;autres ont des catalogues tellement profonds que les chaines de cache ne vont quasiment pas travailler.</p>
<p>Pour compléter l&#8217;analyse, faites des sessions Opensta, SQL Analyzer et regardez précisément le nombre de fichiers chargés, générés et le temps que le(s) serveur(s) met à répondre, par session. Jouez plusieurs profils différents, des vrais séances de surf pour que ce soit réaliste. (20 profils différents semblent raisonnablement précis) Une fois les profils fait, jouez en N en même temps, jusqu&#8217;à ce que le temps de réponse du site se mette à augmenter légèrement.</p>
<p>Vous avez alors trouvé, sur votre architecture de test, le nombre de personnes connectées simultanément.</p>
<p>Sur un site qui génère 20 000 visites par exemple, le nombre de sessions simultanées peut, en réalité, être assez faible avec des pics à 600 sessions simultanées &laquo;&nbsp;seulement&nbsp;&raquo;. Les sites étant tous différents dans leurs comportement, une seule méthode compte, simuler précisément, confronter à l&#8217;historique réel du site contenu dans analytics et extrapoler ces simulations du serveur de tests à la plateforme finale. Si vos simulations montrent un ralentissement après 150 sessions simultanées et que vous devez atteindre 600, il vous faudra 5 serveurs (4 + 1 autre fournissant les 20% de sureté).</p>
<p><span style="text-decoration: underline;">On prépare un Guide de l&#8217;optimisation Magento qui sera articulé comme suit (à priori) :</span></p>
<p>1°) Introduction<br />
2°) Infrastructure<br />
3°) Système d&#8217;exploitation<br />
4°) environnement LAMP<br />
5°) Architecture/conception du code Magento<br />
6°) Développement<br />
7°) Optimisation (SQL&amp;Code analyzer)<br />
8°) Tests de charges / Benchmarking<br />
9°) Les caches (memcached, rproxy, eav/zend)<br />
10°) Nice things, hints &amp; tricks</p>
<p>Comme mon équipe n&#8217;est pas spécialisée dans le développement, je pense que les chapitres 5/6 seront réalisés par des volontaires. De toute façon, tout cela se passera dans le Wiki.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/optimisation-systeme-reseau/dimensionner-ses-serveurs-simuler-et-estimer-la-performance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

