Alex Junio
Voltar para o Blog
WordPress

Configurando Nginx PHP MySQL e Let’s Encrypt Hospedagem WordPress

admin

admin

Engenheiro Cloud & DevOps

Publicado em

25/04/2022

Compartilhe

No capítulo 1 do nosso guia, apresentei etapas iniciais para configuração e segurança de um servidor na Vultr com Ubuntu 20:04 para hospedagem WordPress. Neste capítulo, vou te guiar pelo processo de configuração do LEMP (Linux, Nginx, MySQL e PHP), como também instalarmos o SSL com Let’s Encrypt em nosso domínio.

Antes de prosseguir, já realize a conexão SSH no seu servidor utilizando o usuário criado no capítulo 1, caso não esteja com o terminal aberto.

Instalando o Nginx no Ubuntu

O Nginx é disparado um dos web servers mais rápidos que temos, e seu poder de processar milhares de requisições e conexões é surpreendente. Quando pensamos em uma hospedagem WordPress logo pensamos no Nginx, uma vez que performance e velocidade se tornou cada vez mais um fator determinante em projetos web.

Para instalarmos o Nginx vamos utilizar o repositório de pacotes mantido por Ondřej Surý que inclui os pacotes estáveis ​​mais recentes do Nginx.

Para instalar o Nginx, primeiramente adicione o repositório e atualize as listas de pacotes:

bash
sudo add-apt-repository ppa:ondrej/nginx -y
sudo apt update
sudo apt dist-upgrade -y

Agora instale o Nginx:

bash
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Você pode verificar a versão do Nginx executando o comando:

bash
nginx -v

Agora o Nginx está instalado em nosso servidor. E pelo menos nesse capítulo não vamos realizar nenhuma configuração avançada, isso será feito nos próximos capítulos onde iremos otimizar e realizar alguns ajustes para ter uma maior performance no nosso WordPress.

Instalação do PHP 8

Para instalarmos o PHP 8 em nosso servidor WordPress vamos utilizar novamente o repositório mantido por Ondřej Surý.

Adicione o repositório e atualize as listas de pacotes:

bash
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

Agora instale o PHP 8 e todas as extensões do PHP que o WordPress precisa para executar corretamente.

bash
sudo apt install php8.0-fpm php8.0-common php8.0-mysql \
php8.0-xml php8.0-xmlrpc php8.0-curl php8.0-gd \
php8.0-imagick php8.0-cli php8.0-dev php8.0-imap \
php8.0-mbstring php8.0-opcache php8.0-redis \
php8.0-soap php8.0-zip php8.0-intl -y

Note que estamos instalando também o php-fpmFastCGI Process Manager (FPM) é uma implementação alternativa do PHP FastCGI com alguns recursos adicionais que funcionam muito bem com o Nginx. É o gerenciador de processos recomendado para usar ao instalar o PHP com Nginx.

Configurando o PHP 8 e PHP-FPM

Agora que temos instalado o Nginx e o PHP 8 precisamos configurar o usuário e o grupo sob o qual o serviço será executado. Para essa tarefa, precisamos alterar o arquivo de configuração de pool padrão do PHP.

bash
sudo nano /etc/php/8.0/fpm/pool.d/www.conf

Altere todas as linhas que contém o usuário www-data, para o nome de usuário que você criou no capítulo 1.

bash
user = www-data
group = www-data

listen.owner = www-data
listen.group = www-data
bash
user = alex
group = alex

listen.owner = alex
listen.group = alex

Agora salve o arquivo para finalizar. Pressione CTRL + X seguido de Y e Enter.

Podemos agora reiniciar o nosso PHP 8 com o comando abaixo:

bash
sudo service php8.0-fpm restart

Testando o Nginx e PHP

Nesse momento já podemos realizar um teste rápido para verificar se o Nginx está se comunicando corretamente com o PHP. Para isso, vamos editar o arquivo de configuração do nginx e habilitar os scripts PHP.

bash
sudo nano /etc/nginx/sites-available/default

Encontre a seção onde os scripts PHP são configurados:

bash
# pass PHP scripts to FastCGI server
#
#location ~ \.php$ {
#       include snippets/fastcgi-php.conf;
#
#       # With php-fpm (or other unix sockets):
#       fastcgi_pass unix:/run/php/php8.0-fpm.sock;
#       # With php-cgi (or other tcp sockets):
#       fastcgi_pass 127.0.0.1:9000;
#}

Podemos alterar deixando assim:

bash
# pass PHP scripts to FastCGI server

location ~ \.php$ {
       include snippets/fastcgi-php.conf;

       # With php-fpm (or other unix sockets):
       fastcgi_pass unix:/run/php/php8.0-fpm.sock;
}

Salve o arquivo usando CTRL + X seguido de Y e Enter.

Agora altere o usuário que o nginx irá utilizar, pois isso vai tornar o gerenciamento de permissões muito mais tranquilo no futuro.

bash
sudo nano /etc/nginx/nginx.conf

E troque o nome do usuário configurado no arquivo pelo usuário que você configurou:

bash
user alex;
worker_processes auto;
pid /run/nginx.pid;

Salve o arquivo usando CTRL + X seguido de Y e Enter.

Reiniciamos o Nginx:

bash
sudo service nginx restart

Vamos criar um arquivo de PHP simples na raiz da nossa hospedagem WordPress:

bash
sudo nano /var/www/html/info.php

E inserimos o conteúdo abaixo para que quando acessemos pelo IP no navegador, possamos verificar todas as diretivas e informações do PHP. A execução desse arquivo corretamente significará que o PHP está em execução e em comunicação com o Nginx.

bash
<?php
phpinfo();
?>

Salve o arquivo usando CTRL + X seguido de Y e Enter.

Agora abra o navegador e insira o IP ou o nome do host configurado para visualizar o conteúdo:

bash
ip_server/info.php
ou
wpserver.seudominio.com/info.php

Depois de testar e ver que está funcionando bem, você pode excluir esse arquivo, por motivos de segurança, pois ele expõe informações sobre o servidor.

bash
rm -r /var/www/html/info.php

Emitindo SSL com Let’s Encrypt

Para emitir certificados SSL com o Let’s Encrypt é necessário que você tenha configurado os apontamentos de DNS para o IP do seu servidor. Na CloudFlare eu configurei o apontamento de um subdomínio, pois irei instalar o WordPress em um subdomínio:

Se você vai instalar o WordPress no seu domínio principal, em Nome digite apenas “@”, ou edite a linha onde o seu domínio está apontado para um IP e insira o IP do seu servidor contratado. Lembre também de desativar a nuvem de Proxy, por default ela estará com a cor laranja.

Agora que você configurou o apontamento, podemos instalar o Let’s Encrypt no nosso servidor WordPress. Execute os comandos abaixo:

bash
sudo apt install -y software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install -y certbot python3-certbot-nginx

Para obter um certificado, agora você pode usar o plug-in Nginx Certbot, executando o seguinte comando. 

bash
sudo certbot --nginx certonly -d seusite.com -d www.seusite.com

Após inserir seu endereço de e-mail e concordar com os termos e condições, o cliente Certbot gerará o certificado solicitado. Lembre de anotar onde o arquivo de certificado fullchain.pem e o arquivo de chave privkey.pem foram armazenados, pois você pode precisar deles em algum momento.

bash
NOTAS IMPORTANTES: 
 - Parabéns! Seu certificado e cadeia foram salvos em: 
   /etc/letsencrypt/live/blog.alexjunio.com.br/fullchain.pem 
   Seu arquivo de chave foi salvo em: 
   /etc/letsencrypt/live/blog.alexjunio.com.br/privkey.pem

Nginx Bloco de Servidor p/ WordPress

Para que o nosso servidor hospede um site WordPress corretamente, precisamos criar um arquivo de configuração do Nginx com foco em WordPress. Para essa atividade, execute os passos abaixo:

Limpe todo o conteúdo que está inserido no arquivo de configuração default:

bash
sudo nano /etc/nginx/sites-available/default

Agora insira todo o conteúdo abaixo e substitua tudo o que está em negrito, colocando o nome do seu domínio.

bash
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name blog.alexjunio.com.br www.blog.alexjunio.com.br;
    
    ####################################################################################
    # SSL
    ssl_certificate /etc/letsencrypt/live/blog.alexjunio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.alexjunio.com.br/privkey.pem;
    ####################################################################################    
    #### Logs
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    ####################################################################################    
    root /var/www/html;
    index index.php;
    ####################################################################################
    #### Locations
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #fastcgi_pass unix:/var/run/php7.4-fpm.sock;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location = /favicon.ico {
        access_log off;
        log_not_found off;
        expires max;
    }
    location = /robots.txt {
            access_log off;
            log_not_found off;
    }
    ####################################################################################
    # Cache Static Files For As Long As Possible
    location ~*
    \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$
    {
            access_log off;
            log_not_found off;
            expires max;
    }
    # Security Settings For Better Privacy Deny Hidden Files
    location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
    }
    # Return 403 Forbidden For readme.(txt|html) or license.(txt|html)
    if ($request_uri ~* "^.+(readme|license)\.(txt|html)$") {
        return 403;
    }
    # Disallow PHP In Upload Folder
    location /wp-content/uploads/ {
            location ~ \.php$ {
                    deny all;
            }
    }

    

}

####################################################################################
##### Redirect http to https
server {
    listen 80;
    listen [::]:80;
    server_name blog.alexjunio.com.br www.blog.alexjunio.com.br;
    return 301 https://blog.alexjunio.com.br$request_uri;
}
####################################################################################

Salve o arquivo usando CTRL + X seguido de Y e Enter. Você pode validar se o Nginx está configurado corretamente executando: sudo nginx -t . Se visualizar uma mensagem como a imagem abaixo, significa que configurou corretamente.

Agora você já pode acessar o seu domínio pelo navegador, e inclusive verá o SSL instalado.

Por último, defina as permissões do diretório root do WordPress corretamente:

bash
chown -R alex:alex /var/www/html/

Instalando o WP-CLI

O WP-CLI é uma ferramenta bem interessante, com ela podemos gerenciar o nosso site WordPress pela linha de comando. Podemos realizar tarefas como: atualização de plugins, atualizações do WordPress, desabilitar plugins, criar usuários e muito mais.

Siga os passos abaixo para instalar o WP-CLI:

bash
cd ~/
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Agora digite no terminal o comando wp e veja se a ferramenta está executando corretamente.

Instalando o MariaDB

O MariaDB é um substituto imediato para o MySQL. Decidimos instalar o MariaDB no nosso servidor WordPress por oferecer mais recursos e melhorias de velocidade em relação ao MySQL.

Para instalar o MariaDB, adicione o repositório e atualize as listas de pacotes:

bash
sudo apt-get install software-properties-common
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.up.pt/pub/mariadb/repo/10.4/ubuntu focal main'

Agora instale o MariaDB Server:

bash
sudo apt install mariadb-server -y

Execute o script abaixo para configurar corretamente uma senha para o administrador do MariaDB e realizar algumas configurações:

bash
sudo mysql_secure_installation

Siga as instruções e responda às perguntas. Aqui estão minhas respostas:

bash
alex@wpserver.alexjunio.com.br:~$ sudo mysql_secure_installation 


Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Agora precisamos criar um usuário, uma database e deixa-lo configurado com seus devidos privilégios.

Criando uma base de dados

Para criar a base de dados e um usuário para a base do WordPress você precisa logar no MySQL utilizando o usuário root e a senha configurada anteriormente. No terminal digite o comando abaixo para login:

bash
mysql -uroot -p

Uma vez logado, execute os comandos baixo para criar a database, usuário e definir os privilégios. Lembre de trocar as informações em negrito.

bash
# Criando a database
CREATE DATABASE dbwordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

# Criando um usuário 
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'senha';

# Dando permissões para o usuário 

GRANT ALL PRIVILEGES ON dbwordpress.* TO 'wpuser'@'localhost';

# Liberando os privilégios
FLUSH PRIVILEGES;

# Saindo do shell do MySQL
exit;

Muito bem! Já temos a nossa base de dados e um usuário para poder utilizar no processo de instalação do WordPress.

Conclusão

Neste capítulo configuramos o Nginx, PHP com PHP-FPM, MariaDB para nosso banco de dados, WP-CLI e habilitamos o SSL Let’s Encrypt para nosso domínio.

admin

Escrito por admin

Engenheiro Cloud & DevOps com mais de 10 anos de experiência construindo e escalando infraestruturas de alto tráfego em AWS, DigitalOcean e Servidores Dedicados.

Conhecer Serviços →

Comentários (4)

Deixe seu comentário

U
Thiago Moreira
Thiago Moreira
Há 2 dias

Excelente artigo, Alex! Estávamos exatamente com esse problema de overprovisioning na nossa startup. Aplicar os Savings Plans salvou quase 30% da nossa conta mensal.

Alex Junio
Alex JunioAutor
Há 1 dia

Fico feliz que ajudou, Thiago! Essa economia faz total diferença no longo prazo. Se precisarem de ajuda para escalar o banco de dados depois, me deem um toque.

Juliana Costa
Juliana Costa
Há 4 dias

Não tinha pensado em usar Spot para as filas do SQS. Existe algum risco do Spot ser finalizado no meio de um processamento pesado de vídeo?

Alex Junio
Alex JunioAutor
Há 4 dias

Sim, Juliana! A AWS te avisa com 2 minutos de antecedência. O segredo é sua aplicação capturar o evento de interrupção e colocar a mensagem de volta na fila (visibility timeout) antes da máquina morrer.

Roberto Freitas
Roberto Freitas
Há 1 semana

Muito bom o conteúdo técnico. Falta só mais detalhes sobre instâncias Graviton.

Carla Mendes
Carla Mendes
Há 1 semana

Sensacional! Usei as dicas de Right-Sizing e deu muito certo no meu e-commerce.