Instalación y configuración de componentes en infraestructura de Amazon para sitio web www.lacuarta.com con CMS WordPress
Contenido Control de actualizaciones de documento.......................................................... 3 1.
Acceso y servicios .................................................................................... 4
1.1 2.
Esquema de los servicios. ................................................................... 5
Instalación componentes SO ..................................................................... 6
2.1
Servicio web nginx ............................................................................ 6
2.2
Servicio de aplicación con PHP-FPM ..................................................... 6
2.3
Modulo de PHP para acceso a mysql .................................................... 6
2.4
Módulo de aceleración de PHP ............................................................. 7
2.5
Módulo de PHP para caracteres multibyte ............................................ 7
2.6
Módulo de PHP para tratamiento de imágenes ....................................... 7
2.7
Módulo de memcached ....................................................................... 7
2.8
Puntos de montaje ............................................................................ 8
3.
Configuración componentes SO ................................................................ 9
3.1
Nginx ............................................................................................... 9
3.2
PHP-FPM .........................................................................................16
4.
Configuración Amazon CloudFront ............................................................18
4.1
Origen ............................................................................................18
4.2
Dominios .........................................................................................18
4.3
Comportamientos .............................................................................19
5.
Configuración Amazon S3 ........................................................................23
6.
Plugins de WordPress ..............................................................................25
6.1
Plugin Memcached Object Cache ........................................................25
6.2
Plugin HyperDB ................................................................................27
6.3
Plugin WordPress MU Domain Mapping ................................................29
6.4
Plugin Amazon Web Services (AWS) ...................................................30
6.5
Plugin WP Offload S3 Lite ..................................................................31
7.
Despliegue ............................................................................................33
7.1
Fuentes ...........................................................................................33
7.2
Base de datos ..................................................................................35 2
8.
Tareas programadas. Cron. ..................................................................37
8.1
Cron general ....................................................................................37
8.2
Generación html de diario versión digital .............................................38
9.
Referencias.........................................................................................39
Control de actualizaciones de documento
Versión 1 2
Fecha 21-07-2016 26-10-2016
Descripción modificación Versión inicial del documento Cambios de cache Redis a Memcached, cambios en capas de servicios
Revisado por Evelio Martínez Evelio Martínez
3
1. Acceso y servicios
El acceso a los servidores lo hacemos a través de la instancia NAT y desde ahí al resto de elementos de la arquitectura.
Instancia NAT: ssh -i lacuarta-qa.pem
[email protected] IP interna: 10.0.1.85 Instancia Edición:
sudo ssh -i lacuarta-qa.pem
[email protected]
Instancia Frontal 01: sudo ssh -i lacuarta-qa.pem
[email protected] Instancia Frontal 02: sudo ssh -i lacuarta-qa.pem
[email protected] Instancia PHP-FPM1: sudo ssh -i lacuarta-qa.pem
[email protected] Instancia PHP-FPM2: sudo ssh -i lacuarta-qa.pem
[email protected]
Servicio de base de datos RDS MySql Master: lacuartaqa.ctjej6q76uia.us-east-1.rds.amazonaws.com RDS MySql Read:
readqa.ctjej6q76uia.us-east-1.rds.amazonaws.com
[ec2-user@ip-10-0-1-85 ~]$ sudo mysql -u root -p -h lacuartaqa.ctjej6q76uia.us-east1.rds.amazonaws.com lacuartaqa Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11501 Server version: 5.6.27-log MySQL Community Server (GPL)
Servicio de cache de memoria Elasticache: l4-memcached.9s8juh.cfg.use1.cache.amazonaws.com:11211 Tipo de nodo: cache.m3.large Zona: cache.m3.large
Almacenamiento estático S3 bucket: static-lacuarta-qa.s3-website-us-east-1.amazonaws.com
Proxy inverso y CDN CloudFront: d2mhmd1y9dvsiv.cloudfront.net
4
Servicio de DNS Route 53: dominio lacuarta.com
Servicio WAF Gestión de acceso a la parte administrativa de WordPress y a servicios como
xmlrpc
Servicio EFS Servicio de NFS de Amazon. Se está usando para alojar el contenido del directorio de uploads de WP y para backups de BBDD.
1.1 Esquema de los servicios.
5
2. Instalación componentes SO
A continuación se enumeran los paquetes del sistema operativo que se han instalado en los frontales cuya distribución es Amazon Linux AMI release 2016.03
2.1 Servicio web nginx # yum install nginx Installed: nginx.x86_64 1:1.8.1-1.26.amzn1 Dependency Installed: GeoIP.x86_64 0:1.4.8-1.5.amzn1 libs.x86_64 0:2.0-11.5.amzn1
gd.x86_64 0:2.0.35-11.10.amzn1 libXpm.x86_64 0:3.5.10-2.9.amzn1
gperftoolslibunwind.x86_64
0:1.1-10.8.amzn1
2.2 Servicio de aplicación con PHP-FPM
# yum install php56-fpm.x86_64 Dependency Installed: json-c.x86_64 0:0.11-6.8.amzn1 common.x86_64
0:5.6.22-1.125.amzn1
php56-cli.x86_64 0:5.6.22-1.125.amzn1 php56-jsonc.x86_64
0:1.3.6-1.19.amzn1
php56php56-
process.x86_64 0:5.6.22-1.125.amzn1 php56-xml.x86_64 0:5.6.22-1.125.amzn1
2.3 Modulo de PHP para acceso a mysql # yum install php56-mysqlnd.x86_64 Dependency Installed: php56-pdo.x86_64 0:5.6.22-1.125.amzn1
Dependency Installed: php56-pdo.x86_64 0:5.6.22-1.125.amzn1
6
2.4 Módulo de aceleración de PHP # yum install php56-opcache.x86_64
2.5 Módulo de PHP para caracteres multibyte # yum install php56-mbstring.x86_64
2.6 Módulo de PHP para tratamiento de imágenes # yum install php56-gd.x86_64 # yum install php56-pecl-imagick.x86_64
2.7 Módulo de memcached
Se instala el modulo cliente para uso del servicio de cache de memcached # yum install php56-pecl-memcache.x86_64 Installed: php56-pecl-memcache.x86_64 0:3.0.8-6.17.amzn1
Reinicio del servicio de PHP-FPM # /etc/init.d/php-fpm restart
7
2.8 Puntos de montaje
El directorio de imágenes de WordPress /usr/share/nginx/html/lacuarta/wp-content/uploads es un enlace simbólico a un punto de montaje NFS (Amazon EFS) lrwxrwxrwx 1 root
root
29 Jul 26 13:54 uploads -> /IMAGENES/wp-content/uploads/
Puntos de montaje definidos en /etc/fstab # LABEL=/ tmpfs devpts
/
ext4
/dev/shm /dev/pts
defaults,noatime 1
tmpfs
defaults
0
1 0
devpts gid=5,mode=620 0
sysfs
/sys
sysfs
defaults
0
0
proc
/proc
proc
defaults
0
0
0
# 24-7-2016 Para uploads de WP /dev/xvdf
/mnt/wpuploads ext4
defaults,nofail
0
2
# 24-7-2016 para el FTP us-east-1a.fs-4696500f.efs.us-east-1.amazonaws.com:/
/DATOS nfs defaults,vers=4.1 0 0
# 25-7-2016 (orion) IMAGENES us-east-1a.fs-8b2fe9c2.efs.us-east-1.amazonaws.com:/
/IMAGENES
nfs
defaults,vers=4.1 0 0
8
3. Configuración componentes SO
3.1 Nginx
Renombramos o borramos el fichero, por defecto, /etc/nginx.conf.default
El fichero /etc/nginx.conf le comentamos la parte de las directivas server.
Creamos
fichero
de
configuración
para
el
sitio
virtual
en
/etc/nginx/conf.d/lacuarta.conf con los siguientes valores: Frontal de edición upstream php { server internal-Internal-ELB-947962625.us-east-1.elb.amazonaws.com:9000; } server { listen
80;
server_name
www.lacuarta.com
lacuarta.com prueba1.lacuarta.com www.lareinadeamerica.cl lareinadeamerica.cl 10.0.0.77; root index
/usr/share/nginx/html/lacuarta; index.php index.html index.htm;
client_max_body_size 70M; fastcgi_ignore_client_abort on; # ------- INICIO 11-8-2016 fastcgi_buffer_size 4K; fastcgi_buffers 128 4k; # ------- FIN 11-8-2016 # registra error de fichero no encontrado en error_log log_not_found off; # registra subpeticiones en acces_log log_subrequest off;
9
rewrite_log off; ### habilitamos compresion gzip on; gzip_types
text/css
text/x-component
application/x-javascript
application/javascript
text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; # Obtener IP's de clientes finalesa, no de balanceador real_ip_header X-Forwarded-For; # Ignore trusted IPs real_ip_recursive on; set_real_ip_from 10.0.0.0/16; set_real_ip_from 52.84.0.0/15; set_real_ip_from 54.182.0.0/16; set_real_ip_from 54.192.0.0/16; set_real_ip_from 54.230.0.0/16; set_real_ip_from 54.239.128.0/18; set_real_ip_from 54.239.192.0/19; set_real_ip_from 54.240.128.0/18; set_real_ip_from 204.246.164.0/22; set_real_ip_from 204.246.168.0/22; set_real_ip_from 204.246.174.0/23; set_real_ip_from 204.246.176.0/20; set_real_ip_from 205.251.192.0/19; set_real_ip_from 205.251.249.0/24; set_real_ip_from 205.251.250.0/23; set_real_ip_from 205.251.252.0/23; set_real_ip_from 205.251.254.0/24; set_real_ip_from 216.137.32.0/19;
#access_log /var/log/nginx/lacuarta.com-access.log combined; error_log /var/log/nginx/lacuarta.com-error.log info; # Antiguas URL's de lacuarta.com rewrite
^/noticias/.+/[0-9]+/[0-9]+/[0-9]+-[0-9]+-[0-9]-(.+)\.shtml$
http://www.lacuarta.com/noticia/$1/ permanent; #expiración de 5 minutos para estáticos location ~* \.(png|jpg|jpeg|gif|ico)$ {
10
expires 5m; log_not_found off; add_header Cache-Control: max-age=300; } # Evita subida de archivos .php a los directorios de carga de ficheros location ~* /(?:uploads|files)/.*\.php$ { deny all; } location = /favicon.ico { log_not_found off; access_log off; }
# 7-7-2016 Evitar mensaje de error en politica de cross site origin para fuentes en navegadores location ~* \.(eot|ttf|woff|otf|svg)$ { add_header Access-Control-Allow-Origin *; } # Paso de los ficheros .php al servidor php-fpm/php-fcgi location ~ [^/]\.php(/|$) { include fastcgi.conf; fastcgi_pass php; #
fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_read_timeout 300; fastcgi_intercept_errors on; add_header Delivery "PE1"; } location /wp-admin { rewrite ^/wp-admin$ /wp-admin/ redirect; } rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ redirect; if (-e $request_filename){ rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 break; } rewrite ^/([_0-9a-zA-Z-]+/)?(.*\.php)$ /$2 break; rewrite ^(.*)$ /index.php?$args break; location / { if (!-e $request_filename) { rewrite ^/(.+)$ /index.php?q=$1 last;
11
} } }
Frontales públicos La principal diferencia entre el frontal de edición y los 2 públicos es que estos últimos tienen -
activado el cache de nginx para fastcgi.
-
Alguna reescritura de subdominio
upstream php { server internal-Internal-ELB-947962625.us-east-1.elb.amazonaws.com:9000; } #-------------------------------- INICIO 4-8-2016 fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; #-------------------------------- FIN 4-8-2016 server { server_name mobile.lacuarta.com; rewrite ^/(.*)$ $scheme://www.lacuarta.com/$1 permanent; } server { server_name lacuarta.com; rewrite ^/(.*)$ $scheme://www.lacuarta.com/$1 permanent; } server { listen
80;
server_name
www.lacuarta.com
prueba1.lacuarta.com www.lareinadeamerica.cl 10.0.0.19; root index
/usr/share/nginx/html/lacuarta; index.php index.html index.htm;
client_max_body_size 70M; fastcgi_ignore_client_abort on; # registra error de fichero no encontrado en error_log #
log_not_found on; # registra subpeticiones en acces_log log_subrequest off;
12
rewrite_log off; gzip on; gzip_types
text/css
text/x-component
application/x-javascript
application/javascript
text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon; # END W3TC Browser Cache ### habilitamos compresion gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; # Obtener IP's de clientes finales real_ip_header X-Forwarded-For; # Ignore trusted IPs real_ip_recursive on; set_real_ip_from 10.0.0.0/16; set_real_ip_from 52.84.0.0/15; set_real_ip_from 54.182.0.0/16; set_real_ip_from 54.192.0.0/16; set_real_ip_from 54.230.0.0/16; set_real_ip_from 54.239.128.0/18; set_real_ip_from 54.239.192.0/19; set_real_ip_from 54.240.128.0/18; set_real_ip_from 204.246.164.0/22; set_real_ip_from 204.246.168.0/22; set_real_ip_from 204.246.174.0/23; set_real_ip_from 204.246.176.0/20; set_real_ip_from 205.251.192.0/19; set_real_ip_from 205.251.249.0/24; set_real_ip_from 205.251.250.0/23; set_real_ip_from 205.251.252.0/23; set_real_ip_from 205.251.254.0/24; set_real_ip_from 216.137.32.0/19;
# Comentado -12-9-2016, sin acceso a visitas #
access_log /var/log/nginx/lacuarta.com-access.log combined; error_log /var/log/nginx/lacuarta.com-error.log info;
#
access_log /var/log/nginx/nginx_cache.log nginx_cache;
#-------------------------------- INICIO 4-8-2016 set $skip_cache 0; # Las solicitudes POST y las URLs con parámetros deben ir al PHP
13
if ($request_method = POST) { set $skip_cache 1; } if ($query_string != "") { set $skip_cache 1; } # No cachess URI's que contengan lo siguiente if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { set $skip_cache 1; } # No usar cache para usuarios logados o comentadores recientes (aunque aquí no se usan los comentarios de WP) if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") { set $skip_cache 1; } #-------------------------------- FIN 4-8-2016
# expiración de 5 minutos para estáticos location ~* \.(jpg|jpeg|gif|ico)$ { expires 5m; log_not_found off; add_header Cache-Control: max-age=300; } # expiracion CSS y Javascript location ~* \.(?:css|js)$ { expires 1d; access_log off; add_header Cache-Control "public"; }
location = /loaderio-94e8e026d2433e4f5052ac8b6424867a.txt { rewrite
^/loaderio-94e8e026d2433e4f5052ac8b6424867a.txt
http://$server_name/loaderio-94e8e026d2433e4f5052ac8b6424867a.txt permanent; } # Antiguas URL's de lacuarta.com rewrite
^/noticias/.+/[0-9]+/[0-9]+/[0-9]+-[0-9]+-[0-9]-(.+)\.shtml$
http://www.lacuarta.com/noticia/$1/ permanent; # Evita subida de archivos .php a los directorios de carga de ficheros location ~* /(?:uploads|files)/.*\.php$ { deny all;
14
} location = /favicon.ico { log_not_found off; access_log off; } # 7-7-2016 Evitar mensaje de error en politica de cross site origin para fuentes en navegadores location ~* \.(eot|ttf|woff|otf|svg)$ { add_header Access-Control-Allow-Origin *; } # Paso de los ficheros .php al servidor php-fpm/php-fcgi location ~ [^/]\.php(/|$) { include fastcgi.conf; #-------------------------------- INICIO 4-8-2016 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; fastcgi_cache WORDPRESS; fastcgi_cache_valid 200 5m;
# cachea solo respuestas 200 durante 5 minutos
add_header X-Fastcgi-Cache $upstream_cache_status; #-------------------------------- FIN 4-8-2016 fastcgi_pass php; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_read_timeout 300; fastcgi_intercept_errors on; add_header Delivery "PF1"; } location /wp-admin { rewrite ^/wp-admin$ /wp-admin/ redirect; } rewrite ^/([_0-9a-zA-Z-]+/)?wp-admin$ /$1wp-admin/ redirect; if (-e $request_filename){ rewrite ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) /$2 break; } rewrite ^/([_0-9a-zA-Z-]+/)?(.*\.php)$ /$2 break; rewrite ^(.*)$ /index.php?$args break; location / { if (!-e $request_filename) { rewrite ^/(.+)$ /index.php?q=$1 last; } } }
15
3.2 PHP-FPM Inicialmente los frontales de edición y públicos tenían el servicio web y de PHP-FPM corriendo en cada servidor, posteriormente se cambió a una infraestructura para tener el servicio web con NGINX separado del servicio de aplicación con PHP-FPM. Los frontales 10.0.0.13 y 10.0.0.38 tienen el servicio de PHP-FPM, al que acceden los 2 frontales públicos y el frontal de edición.
Modificación valores /etc/php-fpm.conf include=/etc/php-fpm-5.6.d/*.conf error_log = /var/log/php-fpm/5.6/error.log
Modificación de los valores por defecto de /etc/php.ini max_execution_time = 240 memory_limit = 1024M post_max_size = 10M upload_max_filesize = 10M error_log = /var/log/php-fpm/php_errors.log expose_php = Off zlib.output_compression = Off
Modificación
de
valores,
por
defecto,
del
pool
en
/etc/php-
fpm.d/www.conf listen = 0.0.0.0:9000 user = nginx group = nginx listen.owner = nginx listen.group = nginx listen.mode = 0660 listen.acl_users = apache,nginx pm.max_children = 70 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 35 pm.max_requests = 1000 php_flag[display_errors] = off
16
php_admin_value[error_log] = /var/log/php-fpm/5.6/www-error.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 1024M
Verificar que el servicio de php-fpm está a la escucha en el 9000 Reinicio de /etc/init.d/php-fpm restart # netstat -tln |grep 9000 tcp
0
0 127.0.0.1:9000
0.0.0.0:*
LISTEN
El directorio /var/log/php-fpm y descendientes deben tener permisos de escritura para el usuario nginx.
17
4. Configuración Amazon CloudFront
El objetivo de CloudFront es doble, por una parte, disminuir la latencia o tiempo de respuesta entre la solicitud del cliente desde su navegador debido a la duplicidad de contenidos y la cercanía desde donde se sirve y, por otra parte, liberar de carga a los servidores origen brindando los contenidos sin llegar al mismo.
4.1 Origen
La configuración de CloudFront
que actúa como CDN y proxy inverso tiene
definidos 3 orígenes que podemos denominar: Edición, S3 y frontales públicos. Sus denominaciones son respectivamente las siguientes:
4.2 Dominios Los dominios a los que puede servir son los siguientes:
18
4.3 Comportamientos Los comportamientos definidos en base a patrones de ruta son los que se indican abajo. Indican un orden de precedencia, un patrón, y el origen al que debe encaminarse la petición de la URL en función del patrón. Son los siguientes:
Precedencia Patrón de ruta /wp-admin/* 0
Origen edicionqa
Reenvío de cadenas GET si
1
wp-login.php
edicionqa
si
2
/wp-content/uploads/*
S3-static-lacuarta-qa
No
3
/wp-content/themes/lacuarta/css/*
S3-static-lacuarta-qa
No
4
/wp-content/themes/lacuarta/fonts/*
S3-static-lacuarta-qa
No
5
/wp-content/themes/lacuarta/img/*
S3-static-lacuarta-qa
No
6
/wp-content/themes/lacuarta/js/*
S3-static-lacuarta-qa
No
7
/noticia/*
ELB-ELB-QA-611640515
si
8
Default (*)
ELB-ELB-QA-611640515
si
19
Relevante la lista blanca de cookies que no debe ignorar CloudFront, que es la siguiente: PHPSESSID wordpress_* wp-saving-post 20
wp-settings-* Para el patrón /wp-admin/* y wp-login.php se tiene la misma configuración de comportamiento. Para el patrón /wp-content/uploads/* que hace referencia a contenido subido estático desde el CMS, por lo general, imágenes, documentos, etc.
se añade la
cabecera Origin y el tiempo de vida de los objetos antes de que se consulten de nuevo al origen es de 5 minutos pero podría ampliarse a más tiempo.
21
22
Los siguientes 4 patrones hacen referencia a los elementos estáticos del tema de WordPress, a saber, /wp-content/themes/lacuarta/css/* /wp-content/themes/lacuarta/fonts/* /wp-content/themes/lacuarta/img/* /wp-content/themes/lacuarta/js/* No tienen definido reenvío de cookies, ni de query strings. El patrón /noticia/* solo tiene como patrón permitido GET y HEAD. La lista blanca de cabeceras es Host y Origin. El tiempo de vida de los objetos es de 20 minutos. Las query string se envían todas y se cachean. La lista blanca de cookies es la misma que en casos anteriores. El patrón por defecto (*) que aplica si no se aplicó ninguno de los anteriores, permite todos los métodos HTTP, reenvía cabeceras Host y Origin y el TTL de los objetos es de 5 minutos. La lista blanca de cookies es la misma y se reenvían las query strings y se cachean.
5. Configuración Amazon S3
Es necesario configurar CORS (Cross-Origin Resource Sharing, compartición de recursos de origen cruzado) para evitar que los navegadores de última generación eviten el mensaje de aviso o error indicando que se está intentando cargar un recurso ajeno al dominio solicitado. Esto se hace desde el panel de Amazon S3 en el apartado permisos y en la edición de la configuración de CORS. Abajo se indican que Origen y que métodos HTTP se permiten.
23
http://www.lacuarta.com GET PUT POST DELETE HEAD 3000 * http://*.lacuarta.com GET PUT POST DELETE HEAD 3000 * http://d2mhmd1y9dvsiv.cloudfront.net GET PUT POST DELETE HEAD 3000 *
24
6. Plugins de WordPress WordPress usa plugins para extender la funcionalidad de la aplicación. La personalización del portal de lacuarta.com usa alguno más pero los que aquí se enumeran están relacionados con el funcionamiento de la infraestructura del sitio tal como se ha diseñado bajo Amazon AWS.
6.1 Plugin Memcached Object Cache Este plugin gestiona el almacenamiento persistente de objetos de WordPress en memoria en vez de hacerlo en base de datos. Hace que los tiempos de respuesta de la aplicación bajen en un grado de magnitud de 10.
Bajar el plugin de https://downloads.wordpress.org/plugin/memcached.3.0.1.zip
Descomprimir el zip en directorio de plugins y copiar el archivo object-cache.php al directorio wp-content $ cp memcached/object-cache.php ../../wp-content/
Solo con esto y asignando los valores en wp-config.php ya se activa. No hay que activar el plugin en el entorno de network porque dará error.
Asignamos configuración del servicio de memcached en el fichero wpconfig.php $memcached_servers = array( 'default' => array( 'l4-memcached.9s8juh.cfg.use1.cache.amazonaws.com:11211' ) );
Para verificar la actividad de memcached acceder a las estadísticas del servicio. telnet l4-memcached.9s8juh.cfg.use1.cache.amazonaws.com 11211 Connected to l4-memcached.9s8juh.cfg.use1.cache.amazonaws.com. Escape character is '^]'. stats STAT pid 1
25
STAT uptime 93739 STAT time 1470249388 STAT version 1.4.24 STAT libevent 1.4.13-stable STAT pointer_size 64 STAT rusage_user 7.736000 STAT rusage_system 20.904000 STAT curr_connections 4 STAT total_connections 28 STAT connection_structures 25 STAT reserved_fds 10 STAT cmd_get 186074 STAT cmd_set 160756 STAT cmd_flush 0 STAT cmd_touch 0 STAT cmd_config_get 6244 STAT cmd_config_set 1 STAT get_hits 172963 STAT get_misses 13111 STAT delete_misses 711342 STAT delete_hits 1501 STAT incr_misses 0 STAT incr_hits 4 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 346685182 STAT bytes_written 1136772339 STAT limit_maxbytes 6396313600 stats slabs stats ítems
26
6.2 Plugin HyperDB
Este plugin se usa para la gestión de acceso a la base de datos de la aplicación. De manera transparente encamina las peticiones de escritura y lectura a la base de datos maestra y las de lectura solo a la base de datos réplica o esclava. De manera que las peticiones de inserción, borrado o actualización irán al maestro y las de selección a las réplicas. Gestiona también la conexión en función del estado de salud de la base de datos.
Bajar el plugin y dejarlo en directorio de plugins de WP /usr/share/nginx/html/lacuarta/wp-content/plugins
wget https://downloads.wordpress.org/plugin/hyperdb.1.1.zip
y descomprimir unzip hyperdb.1.1.zip
Se modifica el fichero db-config.php para incluir la configuración de acceso a las bases de datos que existen en la infraestructura. Se incluyen las referencias a maestro y esclavos que puedan existir. Se asigna el número de conexiones que puede haber máximas desde los frontales de PHP-FPM: $wpdb->max_connections = 100;
En el frontal de edición se asigna los datos del maestroescritura y lectura $wpdb->add_database(array( 'host'
=> DB_HOST,
'user'
=> DB_USER,
// If port is other than 3306, use host:port.
'password' => DB_PASSWORD, 'name'
=> DB_NAME,
));
$wpdb->add_database(array( 'host'
=> 'lacuartaqa.ctjej6q76uia.us-east-1.rds.amazonaws.com',
// If port is
other than 3306, use host:port. 'user'
=> ‘usuario’,
'password' => 'clave', 'name'
=> 'basededatos',
'write'
=> 1,
27
'read'
=> 1,
'dataset' => 'global', 'timeout' => 0.2, ));
En los frontales públicos se incluye la referencia a la base de datos maestra y a la base de datos réplica o esclava solo en modo lectura. $wpdb->add_database(array( 'host'
=> DB_HOST,
'user'
=> DB_USER,
// If port is other than 3306, use host:port.
'password' => DB_PASSWORD, 'name'
=> DB_NAME,
)); $wpdb->add_database(array( 'host'
=> 'readqa.ctjej6q76uia.us-east-1.rds.amazonaws.com',
// If port is
other than 3306, use host:port. 'user'
=> ‘usuario’,
'password' => 'clave', 'name'
=> 'lacuartaqa',
'write'
=> 0,
'read'
=> 1,
'dataset' => 'global', 'timeout' => 0.2, ));
Copiamos el fichero modificado al directorio donde está el fichero de configuración wp-config.php. cp db-config.php ../../../
Puede dejarse en cualquier sitio al que acceda el servidor web, en ese caso, hay que definirlo con la constante `DB_CONFIG_FILE` en el fichero wpconfig.php.
Se despliega db.php en el directorio /wp-content/.
Simplemente dejarlo
en dicho directorio lo activa. Para desactivarlo basta con moverlo de dicho sitio o borrar el fichero de configuración. cp db.php ../../../wp-content/
28
6.3 Plugin WordPress MU Domain Mapping Este plugin se usa para la asignación/gestión en un WordPress en modo multisite de distintos dominios a una misma instancia de WordPress.
Bajar el plugin y dejarlo en directorio de plugins de WP /usr/share/nginx/html/qalatercera/wp-content/plugins, wget https://downloads.wordpress.org/plugin/wordpress-mu-domain-mapping.0.5.5.1.zip
Descomprimir unzip wordpress-mu-domain-mapping.0.5.5.1.zip
Mover el archivo sunrise.php al directorio /wp-content/
/usr/share/nginx/html/qalatercera/wp-content/plugins/wordpress-mu-domain-mapping mv sunrise.php ../../../wp-content/
Añadimos su activación en wp-config.php define( 'SUNRISE', 'on' );
Ir a la gestión de plugins de red y activar
29
6.4 Plugin Amazon Web Services (AWS) Este plugin se usa para la gestión de servicios en Amazon. Es requerido por el que se comenta en el siguiente punto para el servicio de almacenamiento de imágenes en el servicio Amazon S3.
Se instala el plugin requerido por otro estando en directorio /usr/share/nginx/html/lacuarta/wp-content/plugins
Descargar el plugin, descomprimir y asignar permiso # wget https://downloads.wordpress.org/plugin/amazon-web-services.zip # unzip amazon-web-services.zip # chown -R ec2-user:nginx amazon-web-services # chmod -R 775 amazon-web-services
Activación en el entorno de red de WP
Asignar claves de activación en el fichero wp-config.php Nota de seguridad: Tener en cuenta no incluir el fichero en cuestión en un gestor de control de fuentes. define( 'DBI_AWS_ACCESS_KEY_ID', '********************' ); define( 'DBI_AWS_SECRET_ACCESS_KEY', '****************************************' );
30
6.5 Plugin WP Offload S3 Lite
Descarga, descompresión y asignación de permisos. # wget https://downloads.wordpress.org/plugin/amazon-s3-and-cloudfront.1.0.4.zip # unzip amazon-s3-and-cloudfront.1.0.4.zip # sudo chown -R ec2-user:nginx amazon-s3-and-cloudfront # chmod -R 775 amazon-s3-and-cloudfront
Se asigna el bucket creado en Amazon S3. Nombre de bucket: static-lacuarta-qa Se asignan los siguientes valores en el plugin: -
Se copian los ficheros a S3
-
Se reescriben las URL’s del media file
-
Reemplazo de dominio con el de CloudFront d2mhmd1y9dvsiv.cloudfront.net
-
Ruta por defecto: wp-content/uploads/
-
Añade Año/mes en la ruta
-
Borrar ficheros del servidor. Activar Una vez subido la imagen o contenido digital al S3 lo borra del frontal. Podría tener algún efecto colateral con algún plugin que pudiera necesitar la imagen en local.
-
Desactivar el versionado de objetos.
El plugin tiene un formulario en el backend para la gestión de la configuración pero finalmente se optó por asignarlo con los valores deseados en el fichero de configuración wp-config.php, ya que en etapas iniciales del proyecto, la desconfiguración automática no humana del plugin asignaba valores, por defecto, que no eran los deseados.
define( 'AS3CF_BUCKET', 'static-lacuarta-qa'); define( 'WPOS3_SETTINGS', serialize( array( // bucket S3 al que subir los archivos 'bucket' => 'static-lacuarta-qa', // Copiar los ficheros automaticamente al S3 cuando se suban 'copy-to-s3' => true, // Reescirbir la URL del fichero a S3 'serve-from-s3' => true, // S3 URL format to use ('path', 'cloudfront')
31
'domain' => 'cloudfront', // Custom domain if 'domain' set to 'cloudfront' 'cloudfront' => 'd2mhmd1y9dvsiv.cloudfront.net', // Enable object prefix, useful if you use your bucket for other files 'enable-object-prefix' => true, // Prefijo de Objeto para usar si 'enable-object-prefix' es 'true' 'object-prefix' => 'wp-content/uploads/', // Organizar ficheros S3 en directorios YYYY/MM 'use-yearmonth-folders' => true, // Servir ficheros con HTTPS 'force-https' => false, // Borrar la version local una vez subido a S3 'remove-local-file' => false, // Añadir carpeta con marca de tiempo a la ruta de archivo subida al S3 'object-versioning' => false, ) ) );
32
7. Despliegue A continuación se enumeran los pasos para el despliegue de la aplicación cuando se pasa a otro servidor. Estamos asumiendo que la aplicación estaba desplegada bajo un dominio accesible desde internet y que se copia/mueve a otra infraestructura bajo otro dominio.
7.1 Fuentes
Se copian los fuentes en los 3 frontales, el de edición y los 2 públicos. Instancia EC2 edición: 10.0.0.77 Instancia EC2 frontal 1: 10.0.0.19,
10.0.0.57
Edición [ec2-user@ip-10-0-1-85~]$ sudo scp -i lacuarta-qa.pem lacuarta.20160608.tar.bz2
[email protected]:/home/ec2-user Publicos [ec2-user@ip-10-0-1-85~]$ sudo scp -i lacuarta-qa.pem lacuarta.20160608.tar.bz2
[email protected]:/home/ec2-user [ec2-user@ip-10-0-1-85~]$ sudo scp -i lacuarta-qa.pem lacuarta.20160608.tar.bz2
[email protected]:/home/ec2-user
Creación del subdirectorio /usr/share/nginx/html/lacuarta
Se descomprime en el directorio raíz del sitio virtual # cd /usr/share/nginx/html/lacuarta # tar xvfj /home/ec2-user/lacuarta.20160608.tar.bz2
Se asignan permisos a los ficheros en directorio raíz de fuentes chown –R ec2-user:ec2-user *
Cambio de fichero de configuración de WP wp-config.php define('DB_NAME', 'nombrebasededatos'); define('DB_USER', 'usuario'); define('DB_PASSWORD', 'clave'); define('DB_HOST', 'lacuartaqa.ctjej6q76uia.us-east-1.rds.amazonaws.com'); define('DB_CHARSET', 'utf8'); define('WP_ALLOW_MULTISITE', true);
33
define('MULTISITE', true); define('SUBDOMAIN_INSTALL', true); define('DOMAIN_CURRENT_SITE', 'lacuarta.com'); define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1); define('AUTOSAVE_INTERVAL', 300); define('WP_POST_REVISIONS', false); define( 'SUNRISE', 'on' ); define('DISABLE_WP_CRON', true); // Offload S3/CloudFront Lite define( 'DBI_AWS_ACCESS_KEY_ID', ‘iddeclave’ ); define('DBI_AWS_SECRET_ACCESS_KEY', 'clave'); define( 'AS3CF_BUCKET', 'static-lacuarta-qa'); define( 'WPOS3_SETTINGS', serialize( array( 'bucket' => 'static-lacuarta-qa', 'copy-to-s3' => true, 'serve-from-s3' => true, 'domain' => 'cloudfront', 'cloudfront' => 'd2mhmd1y9dvsiv.cloudfront.net', 'enable-object-prefix' => true, 'object-prefix' => 'wp-content/uploads/', 'use-yearmonth-folders' => true, 'force-https' => false, 'remove-local-file' => false, 'object-versioning' => false, ) ) ); define('WP_CACHE', true); $memcached_servers = array( 'default' => array( 'l4-memcached.9s8juh.cfg.use1.cache.amazonaws.com:11211' ) );
Asignación de registro en /etc/hosts para verificar
10.0.0.77
www.lacuarta.com
lacuarta.com
admin.lareinadeamerica.cl
www.lareinadeamerica.cl
34
7.2 Base de datos
La exportación de la base de datos del sitio original bajo un nombre de dominio implica que al desplegarlo bajo otro dominio haya que realizar sustituciones en las URL’s almacenadas en la base de datos con el nuevo nombre. A continuación, ejemplo de los pasos
Sustitución de cadenas [ec2-user@ip-10-0-1-85 ~]$ sed -i.bak -e
's/http:\/\/52.201.206.60/http:\/\/www.lareinadeamerica.cl/g' wp_cuarta.20160609.dump
Restauración de la base de datos [ec2-user@ip-10-0-1-85 ~]$ time
mysql
-u
root
-p
lacuartaqa
lacuartaqa.ctjej6q76uia.us-east-1.rds.amazonaws.com
-h
update wp_site set domain='admin.lareinadeamerica.cl' where id=1; mysql>
update
wp_blogs
set
domain='admin.lareinadeamerica.cl'
where
site_id=1;
Importación de los Custom Post Types del servidor origen. Implica que previamente se exportaron o copiaron del sitio original en formato JSON los valores de los tipos de Post personalizados. Tras la importación, activar el plugin Custom Post Type UI en el backend de WP. 35
A continuación, ir a la opción del menú del plugin Import/Export del subsitio, http://www.lacuarta.com/wpadmin/admin.php?page=cptui_importexport y copiar la estructura de tipos de post “Post Types” del servidor origen para importar al nuevo servidor y pinchar en el botón de Importar. Antes de realizar la importación realizar la sustitución del host y parte de la ruta de los iconos personalizados que están en formato absoluto. En este ejemplo:
36
8. Tareas programadas. Cron.
Existen unas tareas que se realizan con una frecuencia periódica para el sitio de www.lacuarta.com. Son las siguientes:
8.1 Cron general
Por una parte, la llamada a las tareas periódicas de WordPress se hace con independencia de que haya visitantes o no. Esto implica que la constante de WP siguiente lo desactive, que lo está a nivel de fichero de wp-config.php define('DISABLE_WP_CRON', true);
y por otra parte que su invocación esté mediante un cron asociado en este caso al usuario ec2-user. Como se puede ver se invoca cada 5 minutos. Está en el frontal de edición. Por ejemplo, las noticias con publicación programada en el futuro necesitan de esta tarea programada mediante cron. */5 * * * *
wget -q -O - --header="Host: www.lacuarta.com"
"http://www.lacuarta.com/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
37
8.2 Generación html de diario versión digital
El script genera un html que apunta a la versión digital del periódico impreso en papel y que usa el dominio de http://papeldigital.info/lacuarta/ Se invoca cada 6 horas mediante este script en el frontal de edición: 0 */6 * * *
curl http://www.lacuarta.com/wp-
content/themes/lacuarta/inc/diario_v_digital.php
Genera un HTML con el siguiente aspecto que aparece en la parte superior de la home y en la parte inferior de las ficha de noticia.
38
9. Referencias
WordPress https://codex.wordpress.org/Main_Page
Aseguramiento WordPress https://codex.wordpress.org/Hardening_WordPress
Actualización de WordPress https://codex.wordpress.org/Updating_WordPress https://codex.wordpress.org/Upgrading_WordPress_-_Extended_Instructions
NGINX http://nginx.org/en/docs/
PHP-FPM http://php.net/manual/en/install.fpm.configuration.php http://php.net/manual/es/install.fpm.php
Memcached https://memcached.org/ http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/BestPractices.html
Mysql https://dev.mysql.com/doc/ https://dev.mysql.com/doc/refman/5.5/en/
Amazon CloudFront (CDN, proxy inverso, combinado con WAF) https://aws.amazon.com/es/documentation/cloudfront/
Amazon RDS (Relational Database Service) https://aws.amazon.com/es/documentation/rds/
Amazon Elastic Cloud Compute (EC2) https://aws.amazon.com/es/documentation/ec2/
Amazon S3 (Simple Storage Service) https://aws.amazon.com/es/documentation/s3/
Amazon WAF (Web Application Firewall) https://aws.amazon.com/es/documentation/waf/
Amazon ELB (Elastic Load Balancing) https://aws.amazon.com/es/documentation/elastic-load-balancing/
Amazon EFS (Elastic File System) https://aws.amazon.com/es/documentation/efs/
39