¿Cómo he configurado mi blog en WordPress con Amazon AWS?

Hosting SSD

Ya llevo bastante tiempo hablando de Amazon AWS y WordPress. Este blog está hecho con WordPress y ubicado en servidores de Amazon configurados en alta disponibilidad para asegurarnos de que el blog siempre va a estar disponible.

Configuración de balanceadores de carga en Amazon EC2

A continuación voy a explicar cómo lo he hecho.

Configuración de la zona horaria

[root@prt53ws1 logs] # cp -p /usr/share/zoneinfo/Europe/Madrid  /etc/localtime

Instalación de PHP 7

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install -y mod_php71w php71w-cli php71w-common php71w-gd php71w-mbstring php71w-mcrypt php71w-mysqlnd php71w-xml

Más sobre el repositorio EPEL

Instalación de Apache

yum install -y httpd mod_ssl

Herramientas útiles de administración del sistema operativo

yum install -y wget nmap-ncat nmap lsof xfsdump xfsprogs lvm2 bind-utils

Desactivo SELinux

# cat /etc/selinux/config |grep disabled |grep -v "#"
SELINUX=disabled
#

Reboot del sistema para aplicar el cambio.

Actualizo todo el sistema operativo

yum update -y
reboot

Modifico el hostname

hostnamectl set-hostname puerto53

Creamos el grupo y el usuario para la aplicación “Puerto 53”

# groupadd -g 50000 puerto53
# useradd -u 50000 -g puerto53 -d /home/puerto53 -s /bin/bash -c "Aplicacion Puerto53" puerto53
# chage -E -1 -M -1 puerto53
# echo T3mp0r@l |passwd puerto53 --stdin

Configuración de la máscara del usuario 

$ grep -i umask .bash_profile
umask 077

Creación de la estructura de directorios de la aplicación 

# mkdir -p /app/puerto53/scripts
# mkdir -p /app/puerto53/html
# mkdir -p /app/puerto53/httpd

Montaje de los filesystems

Utilizo un recurso de NFS de Amazon (EFS), pensando en la alta disponibilidad o crecimiento del entorno:

# tail -1 /etc/fstab
fs-f17cdb38.efs.eu-west-1.amazonaws.com:/       /app/puerto53/html nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0
# df -hP /app/puerto53/html
Filesystem                                 Size  Used Avail Use% Mounted on
fs-f17cdb38.efs.eu-west-1.amazonaws.com:/  8.0E     0  8.0E   0% /app/puerto53/html

Copias de seguridad de la aplicación

Copiamos el contenido de la aplicación a un bucket S3.

$ cat /app/puerto53/scripts/Backups/backup.sh
PATH=$PATH:/usr/bin
/usr/bin/aws s3 cp /app/puerto53 s3://puerto53.com-backup/puerto53_$(date +%Y%m%d) --recursive
$ crontab -l
00 03 1,8 * 1 /app/puerto53/scripts/Backups/backup.sh > /dev/null 2>&1

Configuración de Apache

Copiamos el contenido de /etc/httpd a /app/puerto53/httpd, ya que personalizaremos la configuración de Apache para esta aplicación.

# cp -pr /etc/httpd/ .
# cd httpd/
# ll
total 0
drwxr-xr-x 2 root root  37 Sep 19 14:06 conf
drwxr-xr-x 2 root root  98 Sep 19 14:06 conf.d
drwxr-xr-x 2 root root 165 Sep 19 14:06 conf.modules.d
lrwxrwxrwx 1 root root  19 Sep 19 14:06 logs -> ../../var/log/httpd
lrwxrwxrwx 1 root root  29 Sep 19 14:06 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx 1 root root  10 Sep 19 14:06 run -> /run/httpd

También podemos copiar los módulos si queremos personalizarlos. Eso me ha ocurrido alguna vez con diferentes aplicaciones en el mismo servidor y una aplicación utilizaba una versión diferente de un módulo de Apache a la de la otra.

Fichero de configuración de Apache:

$ grep -v "#" httpd.conf |grep -v ^$
ServerRoot "/app/puerto53/httpd"
PidFile "/app/puerto53/httpd/run/httpd/httpd.pid"
DefaultRuntimeDir "/app/puerto53/httpd/run"
# Listen 80
Listen puerto53.com:5000
Include conf.modules.d/*.conf
Include conf/ssl.conf
User puerto53
Group puerto53
ServerAdmin puerto53@puerto53.com
ServerName puerto53.com:5000
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/app/puerto53/html"
<Directory "/app/puerto53">
AllowOverride None
Require all granted
</Directory>
<Directory "/app/puerto53/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
<Files «.ht*»>
Require all denied
</Files>
ErrorLog «logs/error_log»
LogLevel warn
<IfModule log_config_module>
LogFormat «%h %l %u %t \»%r\» %>s %b \»%{Referer}i\» \»%{User-Agent}i\»» combined
LogFormat «%h %l %u %t \»%r\» %>s %b» common
<IfModule logio_module>
LogFormat «%h %l %u %t \»%r\» %>s %b \»%{Referer}i\» \»%{User-Agent}i\» %I %O» combinedio
</IfModule>
CustomLog «logs/access_log» combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ «/var/www/cgi-bin/»
</IfModule>
<Directory «/app/puerto53/cgi-bin»>
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
<VirtualHost puerto53.com:5000>
   DocumentRoot «/app/puerto53/html»
   RewriteEngine On
   RewriteCond %{HTTPS} off
   RewriteRule (.*) https://%{HTTP_HOST}:443%{REQUEST_URI}
</VirtualHost>

El certificado SSL lo compré en Goaddy.

$ cat ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen puerto53.com:5001 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLCryptoDevice builtin

<VirtualHost puerto53.com:5001>
DocumentRoot «/app/puerto53/html»
RequestHeader set Front-End-Https «On»
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /app/puerto53/scripts/SSL/puerto53/puerto53.com.crt
SSLCertificateKeyFile /app/puerto53/scripts/SSL/puerto53/puerto53.com.key
SSLCACertificateFile /app/puerto53/scripts/SSL/puerto53/puerto53.com_ca.crt

# WordPress – Enlaces permanentes
<Directory /app/puerto53/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
###

<Files ~ «.(cgi|shtml|phtml|php3?)$»>
SSLOptions +StdEnvVars
</Files>

<Directory «/var/www/cgi-bin»>
SSLOptions +StdEnvVars
</Directory>

BrowserMatch «MSIE [2-5]» \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
«%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \»%r\» %b»
</VirtualHost>
  • Instalación de WordPress
[puerto53@prt53ws1 html]$ pwd
/app/puerto53/html
[puerto53@prt53ws1 html]$ wget https://wordpress.org/latest.tar.gz
[puerto53@prt53ws1 html]$ tar xvf latest.tar.gz
[puerto53@prt53ws1 html]$ rm latest.tar.gz
[puerto53@prt53ws1 html]$ cd wordpress/
[puerto53@prt53ws1 wordpress]$ mv * ../
[puerto53@prt53ws1 wordpress]$ cd ..
[puerto53@prt53ws1 html]$ rmdir wordpress
  • Configuración de Apache para que pare y arranque automáticamente con el sistema operativo:
[root@prt53ws1 /]# cat /usr/lib/systemd/system/httpd_puerto53.service
[Unit]
Description=Apache aplicacion Puerto53.com
After=network.target remote-fs.target nss-lookup.target

[Service]
ExecStart=/usr/bin/su – puerto53 -c «/app/puerto53/scripts/Apache/start_apache_puerto53.sh»
ExecStop=/usr/bin/su – puerto53 -c «/app/puerto53/scripts/Apache/stop_apache_puerto53.sh»

[Install]
WantedBy=multi-user.target
[root@prt53ws1 /]#

[root@prt53ws1 /]# systemctl enable httpd_puerto53
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd_puerto53.service to /usr/lib/systemd/system/httpd_puerto53.service.
[root@prt53ws1 /]#

Si prefieres utilizar NGINX a Apache, echa un vistazo al artículo Instalar WordPress manualmente en CentOS 7 con NGINX y PHP-FPM.

También te puede interesar:

COMPÁRTEME

Deja un comentario