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-fpm
. FastCGI 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:
[email protected]:~$ 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.