Ma pile de performance et de mise en cache pour WordPress
Il s'agit d'une excellente pile de performance WordPress pour un serveur simple ou un VPS de bas à moyen de gamme. Je classifie le milieu de gamme comme un simple cœur avec environ 1G de mémoire et des disques assez rapides.
Avec votre système, vous seriez capable de servir plus de 10 000 pages vues par heure.
Pile de serveurs
- Linux - soit Debian Lenny soit Ubuntu
- Nginx - Configuré comme reverse proxy cache de fichiers statiques
- Apache - Apache gérera le PHP déchargé par Nginx sur un autre port.
- MySql - Requis par WP, assurez-vous que vous utilisez la dernière version stable.
- PHP - Dernière version stable de la branche 5.2 ou 5.3
Cache PHP
- APC - Configurez-le avec de la mémoire mmap et une taille de shm d'au moins 128M
Pile de plugins de performance WordPress
- Intégrateur de cache proxy Nginx
-
W3 Total Cache - Définir le cache des pages sur le disque amélioré, le minage sur le disque, et l'objet et le db sur APC.
- Self Hosted CDN - Créez 4 alias cname qui pointent vers le domaine sur le serveur mis en place uniquement pour servir les fichiers statiques.
Avec W3 Total Cache, nous utilisons le disque pour le cache des pages et le minage car Nginx servira nos fichiers statiques très rapidement.
Comment configurer Nginx pour servir des fichiers statiques et passer PHP à Apache
Le problème de l'utilisation d'Apache seul est qu'il ouvre une connexion et utilise php à chaque demande, même pour les fichiers statiques. Cela gaspille les connexions car Apache les garde ouvertes et lorsque vous avez beaucoup de trafic, vos connexions sont bloquées même si elles ne sont pas utilisées.
Par défaut, Apache écoute les demandes sur le port 80, qui est le port web par défaut. Tout d'abord, nous allons modifier nos fichiers conf et virtual hosts d'Apache pour écouter le port 8080.
Configuration d'Apache
httpd.conf
Définir KeepAlive sur off
ports.conf
NameVirtualHost *:8080
Listen 8080
Hébergement virtuel par site
<VirtualHost 127.0.0.1:8080>
ServerAdmin info@yoursite.com
ServerName yoursite.com
ServerAlias www.yoursite.com
DocumentRoot /srv/www/yoursite.com/public_html/
ErrorLog /srv/www/yoursite.com/logs/error.log
CustomLog /srv/www/yoursite.com/logs/access.log combined
</VirtualHost>
Vous devez également installer mod_rpaf Ainsi, vos journaux contiendront les adresses IP réelles de vos visiteurs. Sinon, vos journaux auront 127.0.0.1 comme adresse IP d'origine.
Configuration de Nginx
Sous Debian, vous pouvez utiliser les dépôts pour installer mais ils ne contiennent que la version 0.6.33. Pour installer une version ultérieure, vous devez ajouter les paquets backports de Lenny.
$ nano /etc/apt/sources.list
Ajoutez cette ligne au fichier deb http://www.backports.org/debian lenny-backports main
$ nano /etc/apt/preferences
Ajoutez ce qui suit au fichier :
Package: nginx
Pin: release a=lenny-backports
Pin-Priority: 999
Exécutez les commandes suivantes pour importer la clé de backports.org afin de vérifier les paquets et de mettre à jour la base de données des paquets de votre système :
$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update
Maintenant, installez avec apt-get
apt-get install nginx
C'est beaucoup plus facile que de compiler à partir des sources.
Configuration des fichiers conf et serveur de Nginx
nginx.conf
user www-data;
worker_processes 4;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
client_body_temp_path /var/lib/nginx/body 1 2;
gzip_buffers 32 8k;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_comp_level 6;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/html text/css image/x-icon
application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Vous devez maintenant configurer votre hébergement virtuel Nginx. J'aime utiliser la méthode sites-enabled avec chaque sym d'hôte virtuel lié à un fichier dans le répertoire sites-available.
$ mkdir /etc/nginx/sites-available
$ mkdir /etc/nginx/sites-enabled
$ touch /etc/nginx/sites-available/yourservername.conf
$ touch /etc/nginx/sites-available/default.conf
$ ln -s /etc/nginx/sites-available /etc/nginx/sites-enabled
$ nano /etc/nginx/sites-enabled/default.conf
default.conf
Note :
Les paramètres de cache statique dans les fichiers suivants ne fonctionneront que si le plugin intégrateur de cache de proxy Nginx est activé.
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=staticfilecache:180m max_size=500m;
proxy_temp_path /var/lib/nginx/proxy;
proxy_connect_timeout 30;
proxy_read_timeout 120;
proxy_send_timeout 120;
#IMPORTANT - this sets the basic cache key that's used in the static file cache.
proxy_cache_key "$scheme://$host$request_uri";
upstream wordpressapache {
#The upstream apache server. You can have many of these and weight them accordingly,
#allowing nginx to function as a caching load balancer
server 127.0.0.1:8080 weight=1 fail_timeout=120s;
}
Par site WordPress conf (Pour les sites multiples, vous n'aurez besoin que d'un seul serveur virtuel).
server {
#Only cache 200 responses, and for a default of 20 minutes.
proxy_cache_valid 200 20m;
#Listen to your public IP
listen 80;
#Probably not needed, as the proxy will pass back the host in "proxy_set_header"
server_name www.yoursite.com yoursite.com;
access_log /var/log/nginx/yoursite.proxied.log;
# "combined" matches apache's concept of "combined". Neat.
access_log /var/log/apache2/nginx-access.log combined;
# Set the real IP.
proxy_set_header X-Real-IP $remote_addr;
# Set the hostname
proxy_set_header Host $host;
#Set the forwarded-for header.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
# If logged in, don't cache.
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
}
location ~* wp\-.*\.php|wp\-admin {
# Don't static file cache admin-looking things.
proxy_pass http://wordpressapache;
}
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
# Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
# whether logged in or not (may be too heavy-handed).
proxy_cache_valid 200 120m;
expires 864000;
proxy_pass http://wordpressapache;
proxy_cache staticfilecache;
}
location ~* \/[^\/]+\/(feed|\.xml)\/? {
# Cache RSS looking feeds for 45 minutes unless logged in.
if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
set $do_not_cache 1;
}
proxy_cache_key "$scheme://$host$request_uri $do_not_cache";
proxy_cache_valid 200 45m;
proxy_cache staticfilecache;
proxy_pass http://wordpressapache;
}
location = /50x.html {
root /var/www/nginx-default;
}
# No access to .htaccess files.
location ~ /\.ht {
deny all;
}
}
Conf. CDN auto-hébergée
Pour votre CDN hébergé par vos soins, il vous suffit de le configurer pour servir des fichiers statiques sans passer par le proxy.
server {
proxy_cache_valid 200 20m;
listen 80;
server_name yourcdndomain.com;
access_log /srv/www/yourcdndomain.com/logs/access.log;
root /srv/www/yourcdndomain.com/public_html/;
proxy_set_header X-Real-IP $remote_addr;
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
# Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header,
# whether logged in or not (may be too heavy-handed).
proxy_cache_valid 200 120m;
expires 7776000;
proxy_cache staticfilecache;
}
location = /50x.html {
root /var/www/nginx-default;
}
# No access to .htaccess files.
location ~ /\.ht {
deny all;
}
}
Maintenant, démarrez les serveurs
$ /etc/init.d/apache2 restart
$/etc/init.d/nginx start
Les résultats de l'évaluation comparative
Sur Apache Bench, cette configuration peut théoriquement servir 1833,56 requêtes par seconde.
$ ab -n 1000 -c 20 http://yoursite.com/
![alt text]()