AWS Partner Network (APN) Blog – Brasil

WordPress na AWS (Parte 1 de 3)

Por Angelo Carvalho, AWS Partner Solutions Architect


Neste tutorial de 3 partes, aprenderemos como configurar o WordPress na AWS, integrado ao CloudFront para distribuir o conteúdo do seu blog/website a partir de 53 pontos (edge locations) ao redor do planeta, numa arquitetura escalável e com alta disponibilidade. Dividiremos o tutorial da seguinte forma:

  • Parte 1, o básico: Arquitetura simples com dois servidores, um para a aplicação e outro para o banco de dados;
  • Parte 2, a CDN: Vamos adicionar o S3 e o CloudFront para a distribuição do conteúdo estático da aplicação, para que o seu blog/website fique super rápido;
  • Parte 3, escalabilidade e alta disponibilidade: Na última parte deste tutorial, vamos aprender como adicionar escalabilidade e alta disponibilidade ao WordPress, para garantir que o seu blog/website escale de acordo com a quantidade de requisições e seja tolerante a falhas, proporcionando a melhor experiência possível aos seus visitantes;

O primeiro passo é configurar um servidor LAMP (Linux, Apache, MySQL e PHP). Em vez de MySQL local, usaremos o Amazon RDS, que já se encarrega das tarefas administrativas do banco de dados, tais como backup e aplicação de patches de segurança, entre outras.

Vamos à configuração do servidor:

1)     Lance uma instância EC2 do tamanho t2.micro. Esta configuração é mais que suficiente para um pequeno blog ou website, e você poderá aumentar o tamanho no futuro se houver necessidade. Para lançar esta instância:

a.       Selecione a região da AWS onde pretende instalar a sua infraestrutura, usando o menu superior direito do console;

b.      Selecione o serviço EC2 (menu superior esquerdo “Service/Compute/EC2“ ou no meio da página do console);

c.       Clique no botão “Launch Instance“;

d.      Selecione a AMI “Amazon Linux AMI 20xx.xx (HVM), SSD Volume Type”, que geralmente é a primeira da lista;

e.       Selecione o tamanho “t2.micro“. Você poderá aumentar o tamanho no futuro se houver necessidade;

f.        No campo network, escolha uma VPC que possua uma subrede pública (que tenha rota para internet através de internet gateway). Pode ser a VPC default, por exemplo;

g.       No campo Subnet, escolha uma subrede pública da sua preferência. Se estiver usando a VPC default e não a tiver modificado, todas as suas subredes são públicas;

h.      Se estiver usando um volume do tipo General Purpose (SSD), sugiro que use no mínimo 30GB para garantir uma performance de no mínimo 90 IOPS de baseline, já que este tipo de volume fornece 3 IOPS pra cada gigabyte provisionado.

i.         Libere as seguintes portas no seu security group: SSH somente para o seu IP, HTTP para qualquer IP, HTTPS para qualquer IP.

 

2)     Agora vamos nos conectar a esta instância e instalar Apache e PHP:

a.       Associe um Elastic IP à sua instância. Isso vai garantir que o seu IP público não mude mais.

b.      Conecte-se à sua instância via ssh. Para se conectar, selecione a instância no console, clique no botão “connect“ e siga as instruções.

c.       Faça uma rápida atualização na sua instância para se certificar de que ela tenha os últimos pacotes de segurança instalados:

[ec2-user ~]$ sudo yum update -y

d.      Agora é hora de instalar os pacotes do Apache e PHP:

[ec2-user ~]$ sudo yum install -y httpd24 php56 php56-mysqlnd

e.       Inicie o Apache:

[ec2-user ~]$ sudo service httpd start
Starting httpd:                                        [  OK  ]

f.        Configure o Apache para iniciar automaticamente no boot da sua instância:

[ec2-user ~]$ sudo chkconfig httpd on

g.       Digite o seu Elastic IP no seu browser e navegue. Você deverá ver a página de teste do Apache. Se não conseguir, verifique se o Apache está sendo executado e se você liberou a porta HTTP (80) no security group;

h.      Agora é hora de modificar algumas permissões para garantir que o usuário ec2-user possa modificar os arquivos no document root do Apache. Adicione um grupo www e adicione o usuário ec2-user a este grupo:

[ec2-user ~]$ sudo groupadd www
[ec2-user ~]$ sudo usermod -a -G www ec2-user
[ec2-user ~]$ exit

i.         Reconecte-se na sua instância e verifique os seus grupos:

[ec2-user ~]$ groups
ec2-user wheel www

j.         Mude a propriedade de /var/www para o grupo www e adicione permissão de escrita para este grupo:

[ec2-user ~]$ sudo chown -R root:www /var/www

[ec2-user ~]$ sudo chmod 2775 /var/www

[ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} +

[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} +

k.       Agora, para testar nosso servidor PHP, vamos gerar um arquivo de teste e acessá-lo pelo navegador:

[ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

l.         Entre no navegador e digite:

http://seu_elastic_ip/phpinfo.php

m.    Se a página funcionou, o seu PHP está configurado corretamente. Apague esta página por razões de segurança:

[ec2-user ~]$ rm /var/www/html/phpinfo.php

3)     O próximo passo é criar uma instância MySQL. Se você quiser deixar a sua arquitetura bem econômica, pode instalar o banco de dados na mesma instância do WordPress. No entanto, esta configuração não é recomendada, pois não permite o uso de auto scaling e dificulta bastante uma arquitetura com alta disponibilidade. Vamos então fazer da melhor forma e criar uma instância no RDS exclusivamente para o nosso banco de dados:

 

a.       Selecione o RDS no menu principal do seu console AWS;

b.      Clique em “Instances”, e depois em “Launch DB Instance“;

c.       Escolha MySQL;

d.      Para fins de simplicidade e menor custo, não escolha a opção Multi-AZ ainda. Na parte 3 deste tutorial, ensinaremos como evoluir a arquitetura atual (Single-AZ) para uma arquitetura Multi-AZ escalável;

e.       Escolha o tamanho t2.micro para a instância. Você poderá aumentar o tamanho no futuro se houver necessidade;

f.        Coloque “No” para Multi-AZ Deployment;

g.       Use General Purpose (SSD) para o tipo de storage, e aloque ao menos 20GB de storage para o seu banco. Isso vai garantir uma performance mínima de 60 IOPS, com bursts de até 3000 IOPS para o storage do MySQL;

h.      Preencha os campos DB Instance Identifier, Master Username e Master Password com os valores adequados. Tome nota, pois você vai precisar destes valores ao configurar a conexão do WordPress com o MySQL;

i.         Avance e selecione a VPC (sugestão: use a VPC default) e a zona de disponibilidade. Selecione “No” para “Publicly Accessible”.
Se houver necessidade de acessar o banco de dados fora da AWS, marque “Yes”. Neste caso, também será preciso abrir a porta 3306 no security group para o seu IP de saída de internet (opção MyIP no seu security group)

j.         Preencha “Database Name” com o valor que achar adequado e clique em “Launch DB Instance”. Se quiser testar o seu banco de dados, espere até que a instância esteja pronta e conecte-se usando o MySQLWorkbench ou a sua ferramenta preferida;

k.       Verifique o security group do seu RDS recém criado, e certifique-se de que a porta 3306 esteja aberta para o ip privado do servidor web.

4)     Agora que nós temos um banco de dados funcional, vamos voltar ao nosso servidor web e instalar o WordPress:

a.       Faça o download da última versão do wordpress:

[ec2-user ~]$ wget https://wordpress.org/latest.tar.gz

b.      Descompacte o arquivo. O diretório descompactado se chamará “wordpress“:

[ec2-user ~]$ tar -xzf latest.tar.gz

c.       Vamos agora fazer a configuração do banco de dados. Mude para o diretório do wordpress e crie o arquivo de configuração:

[ec2-user ~]$ cd wordpress/
[ec2-user wordpress]$ cp wp-config-sample.php wp-config.php

d.      Edite o recém-criado arquivo wp-config.php:

[ec2-user wordpress]$ vi wp-config.php

e.       Modifique as linhas referentes à configuração do banco de dados. Entre o com os mesmos “Database Name”, “Master Username” e “Master Password” que você configurou no seu RDS recém-criado:

define('DB_NAME', 'wordpress-db');

define('DB_USER', 'wordpress-user');

define('DB_PASSWORD', 'your_strong_password');

define('DB_HOST', 'endpoint_do_seu_rds.rds.amazonaws.com');

f.        Agora encontre a sessão chamada “Authentication Unique Keys and Salts”. Ela é responsável por uma camada de criptografia para os cookies que o WordPress poderá gerar no navegador do cliente. Clique no link abaixo para gerar uma chave randomicamente. Depois copie o conteúdo gerado para o seu arquivo de configuração: https://api.wordpress.org/secret-key/1.1/salt/

define('AUTH_KEY',         ' #U$$+[RXN8:b^-L 0(WU_+ c+WFkI~c]o]-bHw+)/Aj[wTwSiZ<Qb[mghEXcRh-');
define('SECURE_AUTH_KEY',  'Zsz._P=l/|y.Lq)XjlkwS1y5NJ76E6EJ.AV0pCKZZB,*~*r ?6OP$eJT@;+(ndLg');
define('LOGGED_IN_KEY',    'ju}qwre3V*+8f_zOWf?{LlGsQ]Ye@2Jh^,8x>)Y |;(^[Iw]Pi+LG#A4R?7N`YB3');
define('NONCE_KEY',        'P(g62HeZxEes|LnI^i=H,[XwK9I&[2s|:?0N}VJM%?;v2v]v+;+^9eXUahg@::Cj');
define('AUTH_SALT',        'C$DpB4Hj[JK:?{ql`sRVa:{:7yShy(9A@5wg+`JJVb1fk%_-Bx*M4(qc[Qg%JT!h');
define('SECURE_AUTH_SALT', 'd!uRu#}+q#{f$Z?Z9uFPG.${+S{n~1M&%@~gL>U>NV<zpD-@2-Es7Q1O-bp28EKv');
define('LOGGED_IN_SALT',   ';j{00P*owZf)kVD+FVLn-~ >.|Y%Ug4#I^*LVd9QeZ^&XmK|e(76miC+&W&+^0P/');
define('NONCE_SALT',       '-97r*V/cgxLmp?Zy4zUU4r99QQ_rGs2LTd%P;|_e1tS)8_B/,.6[=UK<J_y9?JWG');

g.       Vamos agora mover a instalação do WordPress para o document root do Apache:

[ec2-user wordpress]$ mv * /var/www/html/

h.      Para permitir a utilização de permalinks no WordPress, edite o arquivo /etc/httpd/conf/httpd.conf e encontre a sessão que começa com “<Directory “/var/www/html”>”. Nesta sessão, mude a linha “AllowOverride None” para “AllowOverride All”:

AllowOverride All

i.         Algumas das funcionalidades do WordPress requerem acesso de escrita ao document root do Apache.

i.            Adicione o usuário apache ao grupo www:

[ec2-user wordpress]$ sudo usermod -a -G www apache

ii.            Mude o ownership de /var/www e seu conteúdo para o usuário apache:

[ec2-user wordpress]$ sudo chown -R apache /var/www

iii.            Mude o group ownership de /var/www e seu conteúdo para o grupo www:

[ec2-user wordpress]$ sudo chgrp -R www /var/www

iv.            Mude as permissões de diretório de /var/www e seus subdiretórios para adicionar permissões de escrita de grupo:

[ec2-user wordpress]$ sudo chmod 2775 /var/www
[ec2-user wordpress]$ find /var/www -type d -exec sudo chmod 2775 {} +

v.            Mude recursivamente as permissões de diretório de /var/www e seus subdiretórios para adicionar permissões de escrita de grupo:

[ec2-user wordpress]$ find /var/www -type f -exec sudo chmod 0664 {} +

vi.            Reinicie o Apache para pegar as novas permissões:

[ec2-user wordpress]$ sudo service httpd restart

vii.            Use o chkconfig para configurar o Apache para ser executado após cada reboot:

[ec2-user wordpress]$ sudo chkconfig httpd on

Agora é só digitar o IP ou domínio do seu servidor EC2 no seu navegador web e testar o seu WordPress!

http://my.public.dns.amazonaws.com
Seguindo esta primeira parte do nosso tutorial, já temos um WordPress funcional na AWS. Em breve publicaremos as partes 2 e 3, nas quais vamos mostrar como deixar o WordPress ainda mais rápido utilizando o CloudFront para distribuir o conteúdo estático, e também como adicionar alta disponibilidade e escalabilidade ao nosso blog. Até lá!

Referências:
Tutorial: Installing a LAMP Web Server on Amazon Linux: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html

Tutorial: Hosting a WordPress Blog with Amazon Linux: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hosting-wordpress.html

AWS re:Invent 2014 | (WEB302) Best Practices for Running WordPress on AWS