Mi rendimiento de WordPress y la pila de almacenamiento en caché
Esta es una gran pila de rendimiento de WordPress para un servidor único o VPS de rango bajo a medio. Estoy clasificando el rango medio como núcleo único con alrededor de 1G de memoria y unidades bastante rápidas.
En su caja, esto sería capaz de servir más de 10 mil visitas a la página por hora.
Pila del servidor
- Linux: Debian Lenny o Ubuntu
- Nginx: configurado como caché de archivos estáticos de proxy inverso
- Apache: Apache manejará el PHP descargado por Nginx en un puerto alternativo
- MySql: requerido por WP, asegúrese de ejecutar la última versión estable
- PHP: última versión estable de la rama 5.2 o 5.3
Caché PHP
- APC: configúrelo con memoria mmap y tamaño shm de al menos 128M
Pila de plugins de rendimiento de WordPress
- Integrador de caché proxy Nginx
- W3 Total Cache : establece la memoria caché de la página en el disco mejorado, minimiza en el disco y objeta y db en APC.
- CDN autohospedado: cree 4 alias de cname que apuntan al dominio en el servidor configurado solo para servir archivos estáticos
Con W3 Total Cache estamos usando el disco para el caché de páginas y minify porque Nginx servirá nuestros archivos estáticos muy rápido.
Cómo configurar Nginx para servir archivos estáticos y pasar PHP a Apache
El problema con el uso de Apache solo es que abre una conexión y golpea php en cada solicitud, incluso para archivos estáticos. Esto desperdicia conexiones porque Apache las mantendrá abiertas y cuando tenga mucho tráfico sus conexiones se empantanarán incluso si no se están utilizando.
De forma predeterminada, Apache escucha las solicitudes en el puerto 80, que es el puerto web predeterminado. Primero vamos a hacer cambios en nuestros archivos Apache conf y hosts virtuales para escuchar en el puerto 8080.
Configuración de Apache
httpd.conf
establecer KeepAlive en apagado
ports.conf
NameVirtualHost *:8080
Listen 8080
Por host virtual de sitio
<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>
También debe instalar mod_rpaf para que sus registros contengan las direcciones IP reales de sus visitantes. Si no, sus registros tendrán 127.0.0.1 como la dirección IP de origen.
Nginx Config
En Debian puede usar los repositorios para instalar, pero solo contienen la versión 0.6.33. Para instalar una versión posterior, debe agregar los paquetes de lenny backports
$ nano /etc/apt/sources.list
Agregue esta línea al archivo deb http://www.backports.org/debian lenny-backports main
$ nano /etc/apt/preferences
Agregue lo siguiente al archivo:
Package: nginx
Pin: release a=lenny-backports
Pin-Priority: 999
Emita los siguientes comandos para importar la clave de backports.org para verificar paquetes y actualizar la base de datos de paquetes de su sistema:
$ wget -O - http://backports.org/debian/archive.key | apt-key add -
$ apt-get update
Ahora instale con apt-get
apt-get install nginx
Esto es mucho más fácil que compilar desde la fuente.
Configuración de Nginx conf y server files
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/*;
}
Ahora deberá configurar su alojamiento virtual Nginx. Me gusta usar el método habilitado para sitios con cada símbolo de host v vinculado a un archivo en el directorio de sitios disponibles.
$ 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
Nota:
La configuración de caché estática en los siguientes archivos solo funcionará si el complemento integrador de caché proxy Nginx está habilitado.
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;
}
Según la configuración del sitio de WordPress (para sitios múltiples solo necesitará un vhost)
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 autohospedado
Para su conf CDN autohospedado solo necesita configurarlo para servir archivos estáticos sin el pase de 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;
}
}
Ahora inicia los servidores
$ /etc/init.d/apache2 restart
$/etc/init.d/nginx start
Los resultados de referencia
En Apache Bench, esta configuración teóricamente puede atender 1833.56 solicitudes por segundo
$ ab -n 1000 -c 20 http://yoursite.com/