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.
A continuación voy a explicar cómo lo he hecho.
- Registro del dominio puerto53.com.
- Compra del certificado SSL.
- Crear un VPC.
- Creación de las instancias EC2 y grupos de seguridad.
- Creación de la base de datos MySQL.
- Creación de un bucket S3 para guardar las copias de seguridad.
- Configuración del sistema operativo (Centos 7):
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
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:
- Configuración del balanceador de carga.
- Configuración de WordPress.
- ¿Por qué he migrado mi hosting de WordPress de Amazon a Sered?
- Comparativa VPS Administrados