Configurando Nginx PHP MySQL e Let’s Encrypt Hospedagem WordPress

hospedagem wordpress configuracoes nginx letsencrypt ssl php fpm mariadb wpcli

Written by

in

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:

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

Agora instale o Nginx:

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

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

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:

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.

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.

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.

user = www-data
group = www-data

listen.owner = www-data
listen.group = www-data
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:

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.

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

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

# 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:

# 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.

sudo nano /etc/nginx/nginx.conf

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

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

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

Reiniciamos o Nginx:

sudo service nginx restart

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

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.

<?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:

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.

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:

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. 

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.

 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:

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.

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:

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:

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:

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:

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:

sudo mysql_secure_installation

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

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:

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.

# 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.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *