<?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>AbriCoCotier.fr &#187; Nginx</title>
	<atom:link href="http://www.abricocotier.fr/tag/nginx/feed" rel="self" type="application/rss+xml" />
	<link>http://www.abricocotier.fr</link>
	<description>Analyses et anticipations sur le web et les nouvelles technologies de demain.</description>
	<lastBuildDate>Tue, 07 Feb 2012 21:17:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>WordPress sur un combo Nginx/Varnish + Xcache/eAccelerator ?</title>
		<link>http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator</link>
		<comments>http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator#comments</comments>
		<pubDate>Thu, 31 Mar 2011 12:09:36 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Varnish]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=14612</guid>
		<description><![CDATA[Julien m&#8217;a envoyé un email récemment, me parlant d&#8217;une solution d&#8217;optimisation des performances d&#8217;un site web sous PHP. L&#8217;idée : mettre un reverse-proxy avec Varnish en front, Nginx en back (qui gèrerait le PHP via PHP-FPM), ce a quoi on &#8230; <a href="http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Julien m&#8217;a envoyé un email récemment, me parlant d&#8217;une solution d&#8217;optimisation des performances d&#8217;un site web sous PHP. L&#8217;idée : mettre un reverse-proxy avec <a href="http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration">Varnish</a> en front, <a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache">Nginx</a> en back (qui gèrerait le PHP via PHP-FPM), ce a quoi on pourrait rajouter un système de cache du PHP (lui proposait Xcache, mais moi je connais un peu mieux eAccelerator). Son idée est en fait excellente. En effet, sachant que jusqu&#8217;à présent l&#8217;utilisation de WP-Super-Cache m&#8217;empèche de virer totalement Apache, pourquoi ne pas enlever Wp-Super-Cache (c&#8217;est a dire de regénerer les pages à chaque appel), mais ce via une structure beaucoup plus rapide ?    <span id="more-14612"></span></p>
<p style="text-align:center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/10/varnish_server_picture.jpg" alt="" title="varnish_server_picture" width="580" /></p>
<p>Pour être très clair, je n&#8217;ai pas testé cette combinaison.</p>
<p>A l&#8217;heure actuelle, comme je l&#8217;ai souvent dit, je fonctionne sur une pile Nginx (front) / Apache (back) / eAccelerator / Memcached. Sachant que WP-Super-Cache se place au niveau de Apache.</p>
<p>La pile de Julien serait Varnish / Nginx / eAccelerator / memcached.</p>
<p>Franchement, cette pile m&#8217;a l&#8217;air extrêmement intéressante. Je ne l&#8217;ai pas testée, mais j&#8217;aimerais vraiment faire un petit benchmark, parce que je suis sûr que les perfs seraient intéressantes, voire encore meilleures que celles de la pile actuelle !</p>
<p>Si vous avez testé cette configuration, je vous remercie de m&#8217;en donner des feedbacks !</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator">Permalien</a> |
<a href="http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator#comments">9 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/apache" rel="tag">Apache</a>, <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/php" rel="tag">PHP</a>, <a href="http://www.abricocotier.fr/tag/varnish" rel="tag">Varnish</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/14612-wordpress-nginx-varnish-xcache-eaccelerator/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Nginx+Apache ou Varnish+Apache ? Comparatif des fichiers de configuration</title>
		<link>http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration</link>
		<comments>http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration#comments</comments>
		<pubDate>Mon, 18 Oct 2010 06:38:50 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Serveur]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=13145</guid>
		<description><![CDATA[En l&#8217;espace de quelques jours, j&#8217;ai vu passer sous mon fil Twitter trois articles très intéressant à propos de la configuration Varnish+Apache. Pour ceux qui ne connaissent pas, Varnish est un serveur statique, fréquemment utilisé par les gros sites de &#8230; <a href="http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En l&#8217;espace de quelques jours, j&#8217;ai vu passer sous mon fil Twitter trois articles très intéressant à propos de la configuration <a href="http://www.varnish-cache.org/">Varnish</a>+Apache. Pour ceux qui ne connaissent pas, Varnish est un serveur statique, fréquemment utilisé par les gros sites de journaux en ligne, notamment dans une configuration de Reverse Proxy, c&#8217;est à dire Varnish en frontend et Apache en backend. Un peu de la même façon que ce que j&#8217;ai expliqué plusieurs fois ici, où je fonctionne avec <a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress">Nginx en frontend et Apache en backend</a>.     <span id="more-13145"></span></p>
<p style="text-align:center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/10/varnish_server_picture.jpg" alt="" title="varnish_server_picture" width="580" /></p>
<p>La différence de Varnish est qu&#8217;il est un site statique par essence, et donc contrairement à <a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache">Nginx</a>, il n&#8217;est pas capable de passer par WSGI pour servir des pages non-générées. Nginx a également l&#8217;avantage de fonctionner avec une pile de connexion, et Varnish est donné comme fonctionnant avec un système de cache interne, mais je n&#8217;ai pas réussi à en voir plus dans les trois articles que j&#8217;ai lu. Les voici :</p>
<blockquote><p>
<a href="http://cd34.com/blog/infrastructure/apache-varnish-nginx-and-lighttpd/">Apache, Varnish, nginx and lighttpd</a></p>
<p>Ce billet montre des comparatifs de performances, qui tendent à montrer dans des conditions assez correctes et objectives que Nginx et Varnish font jeu égal, avec un léger avantage pour Varnish.
</p></blockquote>
<blockquote><p>
<a href="http://www.haute-disponibilite.net/2010/10/14/gerer-son-cache-web-avec-varnish/">Gérer son cache web avec Varnish</a></p>
<p>Chez HAute-Disponibilité, on peut en apprendre un peu plus sur le système de cache de Varnish, mais je ne m&#8217;y suis pas penché davantage.</p></blockquote>
<blockquote><p><a href="http://blog.nicolargo.com/2010/10/booster-votre-blog-wordpress-avec-varnish.html">Booster votre blog WordPress avec Varnish</a></p>
<p>Sur ce billet de Nicolargo, on peut comprendre comment fonctionne la configuration de Varnish. Ce billet m&#8217;a permit de faire le comparatif entre les configurations Nginx et Varnish que je vais présenter ci-dessous.</p></blockquote>
<h3>Comparatif des configurations</h3>
<p>Pour bien comprendre la différence entre Nginx et Varnish (tous deux en frontend, sur le port 80, et servant le contenu non statique à Apache sur le port 127.0.0.1:8080), je vais copier-coller les deux configurations l&#8217;une à côté de l&#8217;autre et les expliquer.</p>
<h2><strong>Pour Nginx</strong></h2>
<p>Pour Nginx, on va avoir un seul fichier important. Ce sera celui relatif au site servi (donc le fichier de conf sera dans /etc/nginx/sites-available) :</p>
<pre class="brush: plain; title: ; notranslate">
server {
  listen      212.227.159.187:80;
  server_name monsite.fr;
  # On distribue les fichiers statiques directement
  location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|srt|swf)$ {
    gzip_static on;
    root  /var/www/htdocs/abricocotier.fr/;
    access_log  /var/log/nginx/monsite-server-access.log;
    error_log   /var/log/nginx/monsite-server-error.log;
    error_page 404 = /erreur-404;
    expires           30d;
  }

location / {
    proxy_pass    http://127.0.0.1:8080/;
    include /etc/nginx/conf.d/proxy.conf;
    #root   /lerepertoiredemonsite/;
    #index  index.html index.htm;
    }

}
</pre>
<p>Tout tient dans ce fichier.<br />
On y voir que le premier bloc d&#8217;instructions vise à dire à Nginx de traiter tous les fichiers portant les extensions classiques pour des fichiers statiques.<br />
Le deuxième bloc dit à Nginx d&#8217;envoyer toutes les requêtes qui restent (non-traitées jusque là) sur localhost:8080.</p>
<h2><strong>Pour Varnish</strong></h2>
<p>Grâce au billet de Nicolargo, j&#8217;ai pu rapidement m&#8217;installer une configuration Varnish très simplement en local. C&#8217;est pas plus compliqué que pour Nginx.</p>
<p>Dans le fichier /etc/varnish/default.vcl, on met le nom du site qui sera passé au serveur de backend (donc on prend un peu le problème à revers par rapport à Nginx) :</p>
<pre class="brush: plain; title: ; notranslate">
backend www {
.host = &quot;monsite.fr&quot;;
.port = &quot;8080&quot;;
}
</pre>
<p>Puis, à la suite, dans le même fichier, les instructions de traitement pour les requètes :</p>
<pre class="brush: plain; title: ; notranslate">

sub vcl_recv {
if (req.http.host ~ &quot;(www\.monsite\.fr|monsite\.fr)&quot;) {
set req.backend = www;
} 

# Compatiblity with Apache log
remove req.http.X-Forwarded-For;
set    req.http.X-Forwarded-For = client.ip;
# Normalize Content-Encoding
if (req.http.Accept-Encoding) {
if (req.url ~ &quot;\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$&quot;) {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ &quot;gzip&quot;) {
set req.http.Accept-Encoding = &quot;gzip&quot;;
} elsif (req.http.Accept-Encoding ~ &quot;deflate&quot;) {
set req.http.Accept-Encoding = &quot;deflate&quot;;
} else {
remove req.http.Accept-Encoding;
}
}

# Remove cookies and query string for real static files
if (req.url ~ &quot;^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.*|)$&quot;) {
unset req.http.cookie;
set req.url = regsub(req.url, &quot;\?.*$&quot;, &quot;&quot;);
}
# Pas de cache pour les requêtes POST
if (req.request == &quot;POST&quot;) {
return(pass);
}
# Pas de cache pour l'interface d'administration de WordPress
if( req.url ~ &quot;^/wp-(login|admin)&quot; || req.http.Cookie ~ &quot;wordpress_logged_in_&quot; ){
return(pass);
}
}
</pre>
<p>Comme on le vois, ce n&#8217;est pas beaucoup plus compliqué, c&#8217;est juste que le problème est pris dans l&#8217;ordre inverse. Je pense que c&#8217;est dû au fait que Varnish est fait pour faire du reverse proxy, contrairement à Nginx, qui n&#8217;a peut-être pas été conçu juste pour ça. Mais Nginx a l&#8217;énorme avantage de fonctionner avec une pile de requête, donc je me dis qu&#8217;il présente une sécurité pour qui n&#8217;a pas un gros serveur sous la main mais peu voir affluer à certaines heures de grosses quantités de connexions (et n&#8217;ayant pas envie de voir son serveur tomber toutes les 5 minutes).</p>
<p>Je rajoute que le mode de configuration de Nginx est sans doute plus simple pour ceux qui ont un peu regardé la configuration sous Apache (je pense notamment à l&#8217;arborescence sites-available/ et sites-enabled/ avec lien symbolique entre les deux pour &laquo;&nbsp;activer&nbsp;&raquo; un site), et c&#8217;est donc un facteur de plus grande facilité d&#8217;utilisation.</p>
<p>Enfin, et en terme de performances (c&#8217;est ça qui nous intéresse), <strong>je n&#8217;ai pas réussi à trouver de comparatif clair entre les performances des configurations Nginx+Apache et Varnish+Apache</strong>. Je constate que de très gros sites utilisent Nginx+Apache (par exemple, WordPress.com et toute sa plateforme de blogs), mais j&#8217;ai l&#8217;impression que Varnish n&#8217;anonce pas clairement qu&#8217;il existe comme le fait Nginx (c&#8217;est à dire que quand on a Varnish+Apache, le header de la réponse ne comporte que Apache, donc le client ne peut pas savoir que Varnish est dans la boucle). </p>
<p>D&#8217;après un collègue techniquement fort (ce qui m&#8217;inciterait à le croire), Apache serait mis souvent en frontend quand on a besoin d&#8217;un serveur d&#8217;application Java en backend (Tomcat, Weblogic, Websphere, etc), car Apache sans plugin est un serveur statique. J&#8217;ai du mal à trouver de quoi étayer cette thèse sur le web, Wikipédia ne mentionnant jamais dans la <a href="http://fr.wikipedia.org/wiki/Apache_HTTP_Server">fiche Apache</a> que celui-ci est un serveur statique quand il n&#8217;a pas de plugins (même si en soit, c&#8217;est vrai : Apache sans plugin ne peut pas faire beaucoup d&#8217;autre chose que de servir des fichiers statiques). La <a href="http://en.wikipedia.org/wiki/Apache_HTTP_Server">fiche anglophone</a> dit seulement que Apache est fait pour pouvoir servir du contenu static et dynamique. Bref : je continue à penser qu&#8217;Apache est une formidable machine à tout faire, mais qu&#8217;il y a mieux quand on prend un besoin spécifique (cela dit, Google a plusieurs fois dit qu&#8217;il utilisait une version d&#8217;Apache modifiée pour ses serveurs, donc il semble difficile de dire qu&#8217;Apache n&#8217;est pas un serveur rapide).</p>
<p>Bref : si un jour j&#8217;ai deux serveurs sous la mains et n&#8217;étant pas en productions, je tenterais de faire un ApacheBenchmark des deux configurations, avec un site WordPress en backend, celui-ci ayant une base de donnée correcte, afin que cela simule des conditions réelles.</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration">Permalien</a> |
<a href="http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration#comments">12 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/apache" rel="tag">Apache</a>, <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/serveur" rel="tag">Serveur</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/13145-nginx-apache-ou-varnish-apache-comparatif-des-fichiers-de-configuration/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Augmenter la rapidité de son blog en passant de WordPress à Plone ?</title>
		<link>http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone</link>
		<comments>http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone#comments</comments>
		<pubDate>Mon, 19 Jul 2010 14:52:13 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Python (et Django)]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12127</guid>
		<description><![CDATA[L&#8217;augmentation de la rapidité de mon blog est un sujet que je rumine assez fréquemment, et qui a d&#8217;ailleurs tendance à empiéter sur ma vie &#171;&#160;professionnelle&#160;&#187;, où j&#8217;ai une certaine tendance à favoriser toute évolution en terme de &#171;&#160;temps d&#8217;exécution&#160;&#187;, &#8230; <a href="http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache">L&#8217;augmentation</a> de la <a href="http://www.abricocotier.fr/10650-google-prend-desormais-en-compte-la-rapidite-daffichage-dun-site-dans-le-calcul-du-pagerank">rapidité</a> de <a href="http://www.abricocotier.fr/9954-syntaxhighlighter-ou-gist-github-comparaison-de-ces-solutions-pour-partager-du-code-avec-wordpress">mon</a> <a href="http://www.abricocotier.fr/9318-pourquoi-jai-supprime-disqus-de-mon-blog">blog</a> <a href="http://www.abricocotier.fr/8844-sur-wordpress-mieux-que-wp-super-cache-le-cache-statique-a-la-racine">est</a> <a href="http://www.abricocotier.fr/8959-ameliorer-le-temps-de-reponse-de-wordpress-avec-le-htaccess-et-php-5">un</a> <a href="http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress">sujet</a> que je rumine assez fréquemment, et qui a d&#8217;ailleurs tendance à empiéter sur ma vie &laquo;&nbsp;professionnelle&nbsp;&raquo;, où j&#8217;ai une certaine tendance à <strong>favoriser toute évolution en terme de &laquo;&nbsp;temps d&#8217;exécution&nbsp;&raquo;, même si celle-ci n&#8217;est pas demandée/payée</strong>. Faisant actuellement du <strong>développement <a href="http://www.abricocotier.fr/10638-png2css-un-outil-pour-theoriquement-accelerer-le-chargement-des-pages">Python</a></strong>, et ayant un certain attrait pour ça, je me suis donc demandé quel serait le gain en performance pour un blog tel que le mien, en passant du CMS WordPress au CMS <a href="http://fr.wikipedia.org/wiki/Plone">Plone</a>, qui me semble être le plus populaire dans la communauté Python.    <span id="more-12127"></span></p>
<p style="text-align: center;"><img title="plone-wordpress_logos" src="http://www.abricocotier.fr/wp-content/uploads/2010/07/plone-wordpress_logos.jpg" alt="" width="580" /></p>
<p>D&#8217;abord le pourquoi : Pourquoi continuer à s&#8217;entêter à vouloir faire davantage de traitements par unité de temps sur des même machines, alors que le coût du matériel baisse sans cesse, et qu&#8217;il suffirait d&#8217;investir (peu) dans des serveurs plus puissants ?</p>
<p>La réponse est simple : j&#8217;ai eu la preuve sous mes yeux que c&#8217;était possible, et que, avec un peu de technique/connaissance/travail, <strong>on pouvait faire des choses incroyablement rapides, même avec des ordinateurs aujourd&#8217;hui considérés comme &laquo;&nbsp;vieux&nbsp;&raquo;</strong>. Rien que parce que les MegaHertz des processeurs constituent des millions de calculs par secondes, et donc que cette fréquence peut suffire, si elle est bien utilisée, à servir un nombre déjà énorme de pages sur un site.</p>
<p><strong>Le problème est donc de coder dans un langage assez rapide </strong>(car assez proche du langage machine ou assez compilé) pour rapprocher les traitements à exécuter des fonctions de base du processeur. C&#8217;est possible avec des langages tels que le python (quand il est <a href="http://fr.wikipedia.org/wiki/Python_(langage)#Compilation">compilé</a>), ou encore plus simplement avec Java, mais évidemment, cela freine toute simplicité de modification du code à la volée (car une compilation est nécessaire), comme le permet le PHP (qui y perd donc sa rapidité, car il est &laquo;&nbsp;relu&nbsp;&raquo; à chaque fois) (même si lui aussi peut être compilé/mis en cache, par exemple avec <a href="http://en.wikipedia.org/wiki/PHP_accelerator">PHP Accelerator</a>).</p>
<p>Bref, au final, <strong>je me demandais si un CMS &laquo;&nbsp;évolué&nbsp;&raquo; aurait un temps d&#8217;exécution meilleur en étant codé avec un autre langage</strong> (en l&#8217;occurrence, pour Plone, c&#8217;est Python). Dans &laquo;&nbsp;évolué&nbsp;&raquo;, j&#8217;entends : &laquo;&nbsp;en ayant une perspective de fonctionnalités équivalentes&nbsp;&raquo; (c&#8217;est à dire avec un système d&#8217;extension). Le mieux pour faire un tel comparatif serait de le faire serait de le faire sur un même serveur (disons Apache + mod_python) et avec une même BDD (même serveur pour permettre d&#8217;être facilement interchangeable, et de ne comparer les performances propres que d&#8217;un seul maillon de la chaine). Allons à l&#8217;essentiel : à part le billet suivant &laquo;&nbsp;<a href="http://davisagli.com/blog/notes-on-migrating-this-blog-from-wordpress-to-plone">Notes on migrating this blog from WordPress to Plone</a>&laquo;&nbsp;, ainsi que le <a href="http://plone.org/documentation/kb/plone-and-mysql">tutoriel sur le site de Plone.org</a>, je n&#8217;ai pas trouvé <a href="http://www.google.fr/search?hl=fr&amp;q=plone+mysql&amp;aq=f&amp;aqi=g1&amp;aql=&amp;oq=&amp;gs_rfai=">grand chose</a> traitant de Plone et Apache/MySQL, étant donné que celui-ci étant bien plus conseillé d&#8217;être mis dans un environnement Zope+Plone+<a href="http://fr.wikipedia.org/wiki/Binary_large_object">Blob</a>. Le billet le plus intéressant sur les performances de Ploneque j&#8217;ai pu trouver  face à WordPress est celui-là : &laquo;&nbsp;<a href="http://www.pilotsystems.net/actus/plone-4-test-rapidite-wordpress">Plone 4, un CMS plus rapide que WordPress</a>&laquo;&nbsp;, qui appelle <a href="http://www.circulartriangle.com/">ce site</a>.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-12132" title="plone4_vs_wordpress" src="http://www.abricocotier.fr/wp-content/uploads/2010/07/plone4_vs_wordpress.png" alt="" width="346" height="275" /></p>
<p>On voit que Plone a des performances approchant le double de celles de WordPress. Sur le site de Plone, le <a href="http://plone.org/products/plone/features/4/cms-benchmarks.png">graphique</a> est un peu différent (performances trois fois supérieures à celles de WordPress) :</p>
<p style="text-align: center;"><img title="cms-benchmarks" src="http://www.abricocotier.fr/wp-content/uploads/2010/07/cms-benchmarks.png" alt="" width="580" /></p>
<p>Ailleurs, sur 01net, un <a href="http://pro.01net.com/editorial/515885/le-tableau-comparatif/">tableau comparatif</a> de plusieurs CMS n&#8217;est pas très favorable aux performances de Plone (3/5 en &laquo;&nbsp;Robustesse et Performance&nbsp;&raquo;), à l&#8217;inverse de de eXo Platform, en Java, qui s&#8217;en sort beaucoup mieux (4,5/5), et en dessous de Typo3 et Drupal, tous deux (3,5/5) en PHP.</p>
<p>Alors, que faire ? Pour résumer, <strong>il ne semble pas que Plone s&#8217;en sorte beaucoup mieux que ce que j&#8217;aurais espéré par rapport à WordPress</strong>. Changer de CMS python alors ? Si je regarde chez <a href="http://www.bertrandkeller.info/2009/09/24/1200-django-cms-un-cms-en-python/">DjangoCMS</a>, <a href="http://www.pylucid.org/">PyLucid</a>, ou <a href="http://orangoo.com/skeletonz/">Skeletonz</a>, je ne suis pas sûr de trouver des fonctionnalités équivalentes à ce qu&#8217;il y a sur WordPress (grosse communauté, et grosse base de plugins/extensions). <strong>La solution pourrait donc venir d&#8217;ailleurs : je vois venir l&#8217;avènement progressif des CMS Ruby/Rails avec </strong><a href="http://www.phusion.nl/"><strong>Phusion Passenger</strong></a><strong>/</strong><a href="http://www.modrails.com"><strong>Mod_Rails</strong></a><strong> qui fonctionne avec Nginx</strong>, et donc les performances sont tout à fait bluffantes. Reste bien sûr à aligner les fonctionnalités, mais il semble que les projets de CMS en Ruby ne manquent pas, donc il ne me reste plus qu&#8217;à aller voir de ce côté là pour trouver mon bonheur <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone">Permalien</a> |
<a href="http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone#comments">9 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/python" rel="tag">Python (et Django)</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12127-augmenter-rapidite-blog-wordpress-plone/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Envoyer des fichiers gzipés avec Nginx sans recompilation</title>
		<link>http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation</link>
		<comments>http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation#comments</comments>
		<pubDate>Tue, 25 May 2010 14:24:46 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Serveur]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=11145</guid>
		<description><![CDATA[Dans la longue série des billets que je fais sur l&#8217;optimisation de la vitesse de chargement et d&#8217;envoi d&#8217;un site web, j&#8217;en suis arrivé à faire plusieurs billets sur Nginx. Par ailleurs, j&#8217;ai découvert récemment (via Lionel) le webware GTmetrix, &#8230; <a href="http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dans la longue série des billets que je fais sur l&#8217;optimisation de la vitesse de chargement et d&#8217;envoi d&#8217;un site web, j&#8217;en suis arrivé à faire plusieurs billets sur <a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress">Nginx</a>. Par ailleurs, j&#8217;ai découvert récemment (<a href="http://blog.websourcing.fr/gtmetrix-analyse-amelioration-performance-site/">via Lionel</a>) le webware <a href="http://gtmetrix.com/">GTmetrix</a>, qui permet de faire rapidement un état des lieux des performances de son site, grâce auquel j&#8217;ai pu me rendre compte qu&#8217;il ne me restait pas grand chose à améliorer à part l&#8217;<strong>encodage des fichiers en gzip</strong>. Cet encodage permet de réduire grandement la quantité d&#8217;information envoyée au client (car celle-ci est compressée), et notamment pour les fichiers textes (comme les feuilles de style et fichiers javascripts), pour lesquels on atteint facilement des réduction de 70%.<br />
<span id="more-11145"></span><br />
Cela m&#8217;a étonné, car je croyais l&#8217;avoir mis en place via l&#8217;installation de Nginx, mais à l&#8217;évidence, ça ne fonctionnait pas.</p>
<p style="text-align: center;"><img style="border: 2px solid black;" title="gtmetric_compress_gzip" src="http://www.abricocotier.fr/wp-content/uploads/2010/05/gtmetric_compress_gzip.jpg" alt="" width="580" /></p>
<p>Après quelques vérifications, j&#8217;ai vu qu&#8217;effectivement, même si la configuration de mon Nginx indiquait qu&#8217;il fallait fournir le contenu en gzip, cette étape ne fonctionnait pas. J&#8217;ai fait d&#8217;autres recherches, qui m&#8217;ont permit de conclure que j&#8217;avais oublié d&#8217;inclure l&#8217;option gzip lors de la compilation de Nginx (oui parce que je l&#8217;ai compilé moi-même : la version proposée par mon OS étant à mon goût trop vieille &#8211; car désormais non supportée par Nginx&#8230;). Bref : a la compilation, j&#8217;ai oublié l&#8217;étape permettant à Nginx de prendre les fichiers, et de les convertir en gzip.</p>
<p>Cela dit, une bonne chose est que la version que j&#8217;ai installé permet, si on met dans la configuration d&#8217;un site la ligne :</p>
<blockquote><p><code>gzip_static on;</code></p></blockquote>
<p>&#8230;de vérifier à chaque envoi s&#8217;il existe une version gzippée du fichier, et si oui, de l&#8217;envoyer à la place du fichier demandé.</p>
<p>Sauf que : il me fallait désormais prendre les différents fichiers textes non gzippés. J&#8217;ai un instant crû qu&#8217;un tar -czvf suffirait, mais je me suis retrouvé avec des headers <a href="http://forum.ubuntu-fr.org/viewtopic.php?pid=3503266">pas bons</a>. En utilisant la commande gzip, j&#8217;ai obtenu des résultats bien meilleurs. Du coup, j&#8217;ai pris quelques minutes pour créer un <strong>script convertissant en gzip tous les fichiers CSS et JavaScript d&#8217;un dossier et de ses sous-dossiers</strong> :</p>
<pre class="brush: plain; title: ; notranslate">
#!/bin/bash

#User Variables

DIR1=/var/www/monsite1/;
DIR2=/var/www/monsite2/;

FIND=find;
GZIP=/bin/gzip;

for d in &quot;$DIR1 $DIR2&quot;
do
    for i in `$FIND $d -name &quot;*.css&quot; -o -name &quot;*.js&quot;`;
    do
                $GZIP -c $i &gt; $i.gz;
    done;
done;
</pre>
<p>Notez plusieurs choses dans ce script :</p>
<p>On trouve l&#8217;intégralité des fichiers avec extension css ou js via la commande find :</p>
<blockquote><p><code>find path/ -name "*.css" -o -name "*.js"</code></p></blockquote>
<p>On les convertit en laissant l&#8217;original via la commande gzip customisée :</p>
<blockquote><p><code>gzip -c style.css &gt; style.css.gz</code></p></blockquote>
<p>Voilà ! Normalement, cette technique permettra d&#8217;économiser encore un peu de bande passante. Après, mettez ce script dans une tâche CRON pour qu&#8217;elle s&#8217;exécute assez régulièrement (au cas où vous mettriez à jour des fichiers CSS). Et enfin, en ce qui concerne la compatibilité avec les différents navigateurs, j&#8217;ai testé sous Chrome 4, Firefox 4, Opera 10.50 et IE7 (out ça sur Windows XP), et ça fonctionnait sans problème. J&#8217;ai bien conscience que peut-être, il y a encore des personnes sous IE5 ou IE6, mais elles commencent sérieusement à m&#8217;énerver. Donc je ne vérifie pas pour ces configurations. POINT.</p>
<blockquote><p><em><strong>Edit :</strong> Pour ceux qui viendraient me dire qu&#8217;il y a toujours le mod_deflate de Apache, je leur répondrais que je suis au courant, mais que chez moi <a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress">Apache ne traite pas les CSS et les JS</a>, donc cette solution n&#8217;était pas envisageable ici.</em></p></blockquote>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation">Permalien</a> |
<a href="http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation#comments">1 commentaire</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/serveur" rel="tag">Serveur</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/11145-envoyer-des-fichiers-gzipes-avec-nginx-sans-recompilation/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Script shell de sauvegarde des fichiers associés à un blog WordPress</title>
		<link>http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress</link>
		<comments>http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress#comments</comments>
		<pubDate>Wed, 19 May 2010 14:23:48 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Serveur]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=11013</guid>
		<description><![CDATA[Dans la lignée du script de sauvegarde quotidienne des bases de données, je me suis dis qu&#8217;il serait bon également de sauvegarder les fichiers associés au fonctionnement du site, parmi lesquels on peut citer (pour un blog WordPress) les images &#8230; <a href="http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dans la lignée du <a href="http://www.abricocotier.fr/10829-script-shell-de-sauvegarde-quotidienne-des-bases-de-donnees-mysql">script de sauvegarde quotidienne des bases de données</a>, je me suis dis qu&#8217;il serait bon également de <strong>sauvegarder les fichiers associés au fonctionnement du site</strong>, parmi lesquels on peut citer (pour un blog WordPress) les images uploadées, les différents plugins installés, les fichiers du thèmes, etc. Le problème vient quand on a <strong>plusieurs sites sur le même serveur</strong>, et donc il est à mon avis compliqué de gérer au cas par cas ce qu&#8217;il faut sauvegarder ou non. Notez également que, en terme de place, les fichiers texte (tous les fichiers de code source en premier lieu) <strong>se compressent très bien</strong>, donc il n&#8217;est pas un problème de les sauvegarder tous.<br />
<span id="more-11013"></span></p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/05/Serveurs_dell.jpg" alt="" title="Serveurs_dell" width="580" style="border: 2px solid black;"  /></p>
<p>Or, comme chacun sait, au fur et à mesure de l&#8217;utilisation de tel ou tel CMS (ex : WordPress, Dotclear, Joomla, etc), CRM (VtigerCRM) ou autre logiciel installé sur un serveur, <strong>on finit par rajouter des personnalisations <a href="http://www.abricocotier.fr/6635-remplacer-la-page-error-establishing-a-database-connection-de-votre-wordpress-par-le-cache-google">ici</a> et <a href="http://www.abricocotier.fr/682-probleme-de-reglage-du-serveur-de-mails-sortant-outgoing-serveur-sous-vtiger-crm-la-solution">là</a></strong>, et bien sûr on ne se souvient jamais de l&#8217;intégralité de ce que l&#8217;on a fait.</p>
<p>Pour ma part, j&#8217;ai donc choisi de <strong>sauvegarder l&#8217;intégralité du dossier /var/www, même si c&#8217;est assez lourd en terme d&#8217;espace disque</strong>. A cela, j&#8217;ai ajouté les fichiers de configuration de chaque serveur fonctionnant sur le serveur (pour moi, Apache et Nginx).</p>
<p>Le script shell suivant fait en fait d&#8217;abord une copie des dossiers/fichiers à sauvegarder dans un répertoire temporaire (qu&#8217;il aura créé juste avant), puis les mets dans une archive gzipée. J&#8217;attire votre attention sur le fait que chez moi, avec un dossier /var/www de 740Mo (c&#8217;est pas tant que ça), <strong>le script a fait tourner le CPU à 100% pendant environ 8 minutes</strong>. Pendant ce temps là, les pages ont très bien été servies (j&#8217;ai fait le test), et d&#8217;après ce que je voyais sur <em>htop</em>, il y avait une gestion des processus permettant à Apache et Nginx de fonctionner correctement, laissant au script le reste du CPU disponible. Toutefois, <strong>les quelques observations que je note ici sont à prendre avec des pincettes,</strong> elles ne sont le fruit d&#8217;aucune étude sérieuse, c&#8217;est pourquoi je recommande de n&#8217;exécuter le script qu&#8217;au milieu de la nuit (entre 3h00 et 6h00), pour avoir un impact éventuel sur les performances aussi limité que possible. De même, il faut bien voir que la quantité de fichiers associés peut être assez importante, et la taille de l&#8217;archive également, donc si vous n&#8217;avez pas beaucoup d&#8217;espace disque sur votre serveur, évitez de multiplier les backups (pour ma part, je pense qu&#8217;une à deux fois par semaine me suffiront amplement).</p>
<p>Voilà le script shell :</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

#User Variables
DATE=/bin/date;
NOW=`$DATE '+%Y-%m'-%d_04_30`;
NBBACKUP=4;
BACKUPDIR=/home/the_user/filesbackup;
BACKUPTEMPDIR=/home/the_user/filesbackup/tmp;

APACHECONFDIR=/etc/apache2;
NGINXCONFDIR=/etc/nginx;
WWWDIR=/var/www;

#Command Variables
RM=/bin/rm;
CP=/bin/cp;
MKDIR=/bin/mkdir;
MV=/bin/mv;
TAR=/bin/tar;
SCP=/bin/scp

$MKDIR $BACKUPTEMPDIR;
$CP -R $APACHECONFDIR $BACKUPTEMPDIR;
$CP -R $NGINXCONFDIR $BACKUPTEMPDIR;
$CP -R $WWWDIR $BACKUPTEMPDIR;
$TAR -czf $BACKUPDIR/files_backup.$NOW.0.tgz $BACKUPTEMPDIR/;
$RM -R $BACKUPTEMPDIR/

#$SCP -P 50000 $BACKUPDIR/*0.tgz user@ndd.com:/chemin

i=$(($NBBACKUP-1))
j=$NBBACKUP
$RM -f $BACKUPDIR/*$NBBACKUP.tgz
while [ $i -ge 0 ];
do
     for f in $BACKUPDIR/*.$i.tgz;
     do
         $MV $f ${f/.$i.tgz/.$j.tgz};
     done
     j=$(($j-1))
     i=$(($i-1))
done
</pre>
<p>Veuillez noter que celui-ci n&#8217;est pas optimisé pour le listing des opérations à réaliser. J&#8217;ai tenté le <em>for i in chemin_1 chemin_2</em>, mais l&#8217;interpréteur shell n&#8217;a pas voulu dans la mesure où il considérait les chemin comme des dossiers, et ne voulait apparemment pas boucler dessus.</p>
<p>Vers la fin, vous pourrez voir <strong>une ligne commentée, celle pour la commande scp</strong>, qui nécessite que vous ayez un serveur supplémentaire sous la main (ou un hébergement web) qui accepte les connexions scp.</p>
<p><em>Pour ce qui est de la sauvegarde d&#8217;un nombre défini de backups, je remercie <a href="http://www.tym-project.fr/blog">Tym</a>, c&#8217;est lui qui a donné <a href="http://www.abricocotier.fr/10829-script-shell-de-sauvegarde-quotidienne-des-bases-de-donnees-mysql#comment-7115">la solution</a>.</em></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress">Permalien</a> |
<a href="http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress#comments">6 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/serveur" rel="tag">Serveur</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/11013-script-shell-de-sauvegarde-des-fichiers-associes-a-un-blog-wordpress/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Nginx + PHP-FPM et WP-Super-Cache ?</title>
		<link>http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache</link>
		<comments>http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache#comments</comments>
		<pubDate>Wed, 21 Apr 2010 16:35:24 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=10557</guid>
		<description><![CDATA[Bastien l&#8217;a évoqué dans les commentaires d&#8217;un précédent billet sur Nginx : plutôt que de mettre Nginx en reverse proxy avec Apache derrière, pourquoi ne pas faire gérer les requètes PHP directement par Nginx ? Après tout, ce serait la &#8230; <a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bastien l&#8217;a évoqué dans les commentaires d&#8217;un précédent billet sur Nginx : plutôt que de mettre Nginx en reverse proxy avec Apache derrière, pourquoi ne pas faire gérer les requètes PHP directement par Nginx ? Après tout, ce serait la solution la plus efficace, la plus rapide, et elle n&#8217;est pas difficile à mettre en place. Après avoir regardé cet article &laquo;&nbsp;<a href="http://interfacelab.com/nginx-php-fpm-apc-awesome/">NGINX + PHP-FPM + APC = Awesome</a>&laquo;&nbsp;, j&#8217;ai dû reconnaitre que l&#8217;idée me tentait, mais je n&#8217;étais pas certain de la compatibilité totale entre la situation actuelle et la situation envisagée.</p>
<p><span id="more-10557"></span></p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/04/nginx_wordpress_logo.jpg" alt="" title="nginx_wordpress_logo" width="580" /></p>
<p>En effet, une des choses qui me font peur est la différence de prise en charge des règles de rewrite d&#8217;URL par Nginx et Apache. Apache a un mod dédié à cela (mod_rewrite), et il a l&#8217;avantage d&#8217;être la configuration standard pour beaucoup d&#8217;applications web, ce qui permet de les prendre et de les utiliser sans rien connaitre à la technique derrière.</p>
<p>Le problème vient donc quand on souhaite faire fonctionner ces applications web sur Nginx tout seul alors qu&#8217;elles sont prévues (via leur .htaccess notamment) pour tourner sur Apache.</p>
<p>Une solution intermédiaire est celle, donc, de pousser au maximum le traitement des fichiers statiques par Nginx.</p>
<p>D&#8217;abord, on peut lui confier les fichiers &#8216;habituellement considérés comme statiques&#8217;&#8230;</p>
<pre class="brush: plain; title: ; notranslate">
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|srt|swf)$ {
root  /var/www/yoursite/;
access_log  /var/log/nginx/static-yoursite-access.log;
error_log   /var/log/nginx/static-yoursite-error.log;
expires           30d;
}
</pre>
<p>(tiré du <a href="http://www.papygeek.com/software/optimiser-son-serveur-web-avec-nginx/">post de PapyGeek</a>)</p>
<p>&#8230; mais il faut faire très attention à cela, notamment si vous construisez/utilisez une application qui peut générer des fichiers (par exemple, des images) à la demande. Ainsi, si votre application prévoit de créer tel ou tel fichier au moment où il est appelé (par exemple, une application de création de captcha), là Nginx n&#8217;enverra pas la requète à Apache, alors qu&#8217;il faudrait. La solution est donc de laisser à Apache le traitement des requètes quand celles-ci occasion des erreurs 404 chez Nginx, ou plus exactement quand la ressource n&#8217;existe pas directement :</p>
<pre class="brush: plain; title: ; notranslate">
# si la ressource demandée existe, Nginx la retourne directement
if (-f $request_filename) {
break;
}

# toutes les autres requètes sont passées à Apache
if (!-e $request_filename) {
proxy_pass http://127.0.0.1:8080/;
include /etc/nginx/conf.d/proxy.conf;
}
</pre>
<p>Pour le reste, et pour que Nginx ne prenne que les requètes dont il existe un cache déjà créé, j&#8217;ai cherché et essayé plusieurs configurations, mais aucune de celles-ci ne fonctionnaient (pour être sûr que ça fonctionne, j&#8217;ai pris les URL des pages en cache, éteint Apache2, et restesté. MAlheureusement, ça ne fonctionnait jamais, et je n&#8217;avais que des erreurs 502 BAd GEtaway, ce qui signifie que Nginx me redirigeait sur Apache2, mais comme celui-ci était éteint, cela envoyait une 502 ; alors que bien évidemment, Nginx n&#8217;aurait pas dû avoir besoin de Apache2 pour traiter la requète.).</p>
<p>Sources :</p>
<ul>
<li><a href="http://wiki.nginx.org/NginxHttpRewriteModule">Documentation Nginx sur le HttpRewriteModule</a></li>
<li><a href="http://forum.slicehost.com/comments.php?DiscussionID=2087">Un thread bien pratique sur le forum Slicehost.</a></li>
</ul>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache">Permalien</a> |
<a href="http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache#comments">7 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/10557-nginx-php-fpm-et-wp-super-cache/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nginx en reverse proxy pour plusieurs blogs WordPress</title>
		<link>http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress</link>
		<comments>http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress#comments</comments>
		<pubDate>Mon, 19 Apr 2010 18:34:51 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=10503</guid>
		<description><![CDATA[J&#8217;ai installé aujourd&#8217;hui Nginx sur un serveur que je loue (non auto-administré), ce car je voulais depuis longtemps voir ce qu&#8217;il en était en terme de performances par rapport à un hébergement classique sur Apache. Pour cela, j&#8217;ai pris d&#8217;un &#8230; <a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai installé aujourd&#8217;hui <strong>Nginx sur un serveur</strong> que je loue (non auto-administré), ce car je voulais depuis longtemps voir ce qu&#8217;il en était en terme de performances par rapport à un <strong>hébergement classique sur Apache</strong>. Pour cela, j&#8217;ai pris d&#8217;un côté un site témoin (abricocotier.fr) qui fonctionne &laquo;&nbsp;seulement&nbsp;&raquo; sur un Apache et un autre site (on l&#8217;appellera deuxieme-serveur.fr) qui est derrière un Nginx et un Apache (Nginx se chargeant de traiter l&#8217;envoi de tous les fichiers considérés comme statiques : images, javascripts, feuilles de styles, Apache tout le reste).</p>
<p>Pour ceux qui demandent, je n&#8217;ai pas inventé tout seul la façon de mettre tout cela en place. J&#8217;ai tenté de suivre au mieux les <strong>conseils donnés par <a href="http://www.papygeek.com/software/optimiser-son-serveur-web-avec-nginx/">Papygeek pour installer Nginx</a></strong>. Je vous recommande son billet si vous souhaitez également tenter l&#8217;aventure.</p>
<p><span id="more-10503"></span></p>
<p style="text-align: center;"><img title="nginx_passenger_eyecatcher" src="http://www.abricocotier.fr/wp-content/uploads/2010/04/nginx_passenger_eyecatcher.jpg" alt="" width="580" /></p>
<p style="text-align: center;">Cette image n&#8217;a pas grand chose à voir avec l&#8217;article, mais je la trouvais très jolie, d&#8217;où son placement ici <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<ul>
<li>La mise en place fonctionnelle de Nginx en reverse proxy, devant Apache, a pris en tout et pour tout 1h30 (temps pour régler les divers problèmes compris), après lecture complète du billet. C&#8217;est donc 1h30 de tests et de résolutions de problèmes.</li>
<li>L&#8217;erreur 502 Bad Gateway signifiait pour moi que Nginx transmettait bien les requêtes, mais Apache n&#8217;était pas correctement configuré pour les traiter.</li>
<li>L&#8217;erreur 403 signifiait en gros que Nginx n&#8217;avait pas les droits pour renvoyer le fichier demandé, ou ne le trouvait pas (si le chemin vers les fichiers n&#8217;est pas correctement configuré dans le fichier de configuration par exemple) ou n&#8217;en était pas capable (par exemple si le fichier est un *.php et que Nginx n&#8217;est pas configuré pour le traiter, ça va lui poser problème).</li>
</ul>
<h2><strong>Niveau temps de réponse.</strong></h2>
<p>J&#8217;attire l&#8217;attention sur le fait que les deux serveurs comparés n&#8217;ont pas du tout la même configuration, et que donc si comparaison il y a, elle est à prendre avec beaucoup de pincettes.</p>
<blockquote><p>Édit : La configuration du serveur sur lequel est AbriCoCotier est la suivante : Athlon 3800+ (2 coeurs à 2ghz), 4Go de RAM. La configuration sur l&#8217;autre serveur est un AMD Opteron à 2,1Ghz (d&#8217;après cat /proc/cpuinfo ) et 2Go de RAM (d&#8217;après top ou free -m).</p></blockquote>
<p>Sur le serveur où est AbriCoCotier, je n&#8217;ai qu&#8217;un Apache. Le temps de réponse d&#8217;une page d&#8217;accueil WordPress en cache (avec wp-super-cache) est le suivant :</p>
<ul>
<li> Pour le fichier HTML de la page : 216ms de latence.</li>
<li> Pour le fichier CSS du thème : 84ms de latence.</li>
<li> Pour la première image chargée : 181ms de latence.</li>
</ul>
<p>Sur l&#8217;autre serveur, la configuration est un couple Nginx en reverse proxy, et Apache derrière. Le temps de réponse d&#8217;une page en cache également est le suivant :</p>
<ul>
<li> Pour le fichier HTML de la page : 412ms de latence.</li>
<li> Pour le fichier CSS du thème : 153ms de latence.</li>
<li> Pour la première image chargée : 75ms de latence.</li>
</ul>
<p>Même si la deuxième page est plus légère que la première, et que donc, toute proportion gardée, j&#8217;aurais tendance à dire que ce test va dans le sens d&#8217;Apache, j&#8217;ai fait un second test, avec une page égale (la page de Readme.html de WordPress).</p>
<p>Pour le serveur d&#8217;AbriCoCotier, on a (j&#8217;ai pris le meilleur temps total sur 10 tests):</p>
<ul>
<li> Total : 264ms.</li>
<li> readme.html : 58ms de latence, 113ms de download</li>
<li> install.css : 85ms de latence, 1ms de download</li>
<li> wordpress-logo.png : 78ms de latence, 14ms de download</li>
</ul>
<p>Pour l&#8217;autre serveur, et sachant que le HTML a été traité par Apache, alors que le CSS et le PNG ont été traité par Nginx (pareil : j&#8217;ai pris le meilleur sur une dizaine de tests) :</p>
<ul>
<li> Total : 215ms.</li>
<li> readme.html : 56ms de latence, 21ms de download</li>
<li> install.css : 110ms de latence, 16ms de download</li>
<li> wordpress-logo.png : 125ms de latence, 13ms de download</li>
</ul>
<p>Donc là, le test tend à donner une légère avance à Nginx+Apache par rapport à Apache tout seul.</p>
<p>Mais je le répète : <strong>les deux serveurs ne sont pas matériellement comparables</strong> (celui sur lequel est AbriCoCotier doit être plus puissant), donc je ne sais pas vraiment ce que l&#8217;on peut conclure de ces tests.</p>
<blockquote><p>Edit n°2 : au vu de ce que j&#8217;ai donné ci-dessus pour les performances &laquo;&nbsp;matérielles&nbsp;&raquo;, il est compréhensible que l&#8217;Apache tienne correctement la route.</p></blockquote>
<p>Cela dit, j&#8217;ai fait un test de la home pour chacun des sites (200 requêtes), et voilà ce que cela me donne :</p>
<p>Pour le premier serveur (avec <strong>abricocotier.fr</strong> dessus) :</p>
<pre class="brush: plain; title: ; notranslate">
coucou# ab -n 200 -c 5 http://www.abricocotier.fr/
This is ApacheBench, Version 2.0.40-dev &lt;$Revision: 1.146 $&gt; apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking www.abricocotier.fr (be patient)
Completed 100 requests
Finished 200 requests

Server Software:        Apache
Server Hostname:        www.abricocotier.fr
Server Port:            80

Document Path:          /
Document Length:        47548 bytes

Concurrency Level:      5
Time taken for tests:   8.147451 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      9564400 bytes
HTML transferred:       9509600 bytes
Requests per second:    24.55 [#/sec] (mean)
Time per request:       203.686 [ms] (mean)
Time per request:       40.737 [ms] (mean, across all concurrent requests)
Transfer rate:          1146.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    1   1.1      1      10
Processing:    86  200  78.4    183     499
Waiting:       72  181  76.5    165     469
Total:         88  202  78.5    184     500

Percentage of the requests served within a certain time (ms)
  50%    184
  66%    226
  75%    253
  80%    266
  90%    318
  95%    351
  98%    396
  99%    410
 100%    500 (longest request)
</pre>
<p>Pour le deuxième serveur (appelons le <strong>deuxieme-serveur.fr</strong> ):</p>
<pre class="brush: plain; title: ; notranslate">
coucou:~# ab -n 200 -c 5 deuxieme-serveur.fr
This is ApacheBench, Version 2.0.40-dev &lt;$Revision: 1.146 $&gt; apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking deuxieme-serveur.fr (be patient)
Completed 100 requests
Finished 200 requests

Server Software:        nginx/0.5.33
Server Hostname:        deuxieme-serveur.fr
Server Port:            80

Document Path:          /
Document Length:        4813 bytes

Concurrency Level:      5
Time taken for tests:   3.885465 seconds
Complete requests:      200
Failed requests:        195
   (Connect: 0, Length: 195, Exceptions: 0)
Write errors:           0
Total transferred:      1031170 bytes
HTML transferred:       966500 bytes
Requests per second:    51.47 [#/sec] (mean)
Time per request:       97.137 [ms] (mean)
Time per request:       19.427 [ms] (mean, across all concurrent requests)
Transfer rate:          259.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   9.8      0      98
Processing:    10   95 266.8     55    1832
Waiting:        9   69 263.1     26    1797
Total:         10   96 274.9     55    1890

Percentage of the requests served within a certain time (ms)
  50%     55
  66%     59
  75%     62
  80%     64
  90%     71
  95%     79
  98%   1794
  99%   1832
 100%   1890 (longest request)
</pre>
<p>Au final, et si je lis correctement ce qui est retourné par le benchmark d&#8217;Apache, le serveur d&#8217;AbriCoCotier est capable de traiter 24 requêtes par secondes contre 51 pour celui avec Nginx+Apache.</p>
<p>Je ne suis pas certain que ce test soit correct, dans la mesure où je ne maitrise pas bien les outils abordés ici, mais je serais preneur d&#8217;un conseil ou de plusieurs si vous en avez.</p>
<p><strong>Édit du 20 mai 2010 :</strong> Une chose qui peut être assez énervante, c&#8217;est de se faire &laquo;&nbsp;prendre&nbsp;&raquo; sa bande passante par d&#8217;autres sites, qui vont afficher sur leurs sites des images ou d&#8217;autres documents qui sont hébergés chez vous. Cela s&#8217;appelle le <strong>hotlinking</strong> (on parle d&#8217;image hotlinking).</p>
<p>Sur le site de Nginx, on trouve <a href="http://nginx.org/pipermail/nginx/2007-June/001082.html">cela</a> :<br />
<em>If you need to redirect referers from spefic site only, then you may use map:</em></p>
<pre class="brush: plain; title: ; notranslate">
http {

    map  $referer  $forbidden {

         hostnames;
         default           0;

         *.hotlink1.com    1;
         www.hotlink2.com/ 1;
         .hotlink3.com/    1;

         include   hotlink.conf;
    }

    server {

         set $referer &quot;&quot;;
         if ($http_referer ~* '^&lt;a href=&quot;http://%28[%5E/&quot;&gt;http://([^:/&lt;/a&gt;]+)') {
             set $referer $1;
         }

         location ...

         location ~* ^.+\.(jpg|jpeg|gif ... {

             if ($forbidden) {
                 rewrite  ^  &lt;a href=&quot;http://.../;&quot;&gt;http://...;&lt;/a&gt;
             }

             root  ...
             ...
         }
</pre>
<p>hotlink.conf:</p>
<pre class="brush: plain; title: ; notranslate">
*.hotlink4.com    1;
www.hotlink5.com/ 1;
.hotlink6.com/    1;
</pre>
<p>[<a href="http://blog.phusion.nl/2009/04/16/phusions-one-year-anniversary-gift-phusion-passenger-220/">Image</a>]</p>
<blockquote><p>Edit du 20 juillet 2010 : Mise à jour de Nginx avec le configure suivant : </p>
<blockquote><p>./configure &#8211;with-http_gzip_static_module &#8211;with-http_ssl_module &#8211;with-http_dav_module &#8211;with-http_sub_module </p></blockquote>
</blockquote>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress">Permalien</a> |
<a href="http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress#comments">11 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/nginx" rel="tag">Nginx</a>, <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/10503-nginx-en-reverse-proxy-pour-plusieurs-blogs-wordpress/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

