Tutorial

Como instalar o Linux, o Nginx, o MySQL, o PHP (pilha LEMP) no Ubuntu 18.04

NginxMySQLPHPLEMPUbuntu 18.04Databases

Introdução

A pilha de software LEMP é um grupo de software que pode ser usado para atender páginas e aplicativos Web dinâmicos. Este é um acrônimo que descreve um sistema operacional Linux, com um servidor Web Nginx (se pronuncia “Engine-X). Os dados backend são armazenados no banco de dados MySQL e o processamento dinâmico é tratado pelo PHP.

Este guia demonstra como instalar uma pilha LEMP em um servidor Ubuntu 18.04. O sistema operacional Ubuntu cuida do primeiro requisito. Vamos descrever como colocar o resto dos componentes em funcionamento.

Pré-requisitos

Antes de completar este tutorial, será necessário ter uma conta de usuário regular e sem root no seu servidor com privilégios sudo. Configure esta conta completando nosso guia de configuração inicial do servidor para o Ubuntu 18.04 .

Assim que tiver seu usuário disponível, você está pronto para iniciar as etapas delineadas neste guia.

Passo 1 — Como instalar o servidor Web Nginx

Para mostrar páginas Web aos visitantes de nosso site, vamos usar o Nginx, um moderno e eficiente servidor Web.

Todo software usado neste procedimento virão dos repositórios de pacote padrão do Ubuntu. Isso significa que podemos usar o conjunto de gerenciamento de pacotes apt para completar as instalações necessárias.

Uma vez que essa é a primeira vez que vamos usar o apt para esta sessão, atualize o índice de pacotes do seu servidor. Em seguida, instale o servidor:

  • sudo apt update
  • sudo apt install nginx

No Ubuntu 18.04, o Nginx está configurado para começar a executar após a instalação.

Se tiver o firewall ufw funcionando como descrito no guia de configuração inicial, será necessário permitir as conexões ao Nginx. O Nginx registra-se com o ufw após a instalação, então o procedimento é bastante simples.

É recomendável que habilite o perfil mais restritivo que ainda assim permitirá o tráfego que quiser. Como ainda não configurou o SSL para seu servidor neste guia, será necessário apenas permitir o tráfego na porta 80.

Habilite isso digitando:

  • sudo ufw allow 'Nginx HTTP'

Verifique a mudança executando:

  • sudo ufw status

Este comando irá mostrar que o tráfego HTTP é permitido:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Com essas novas regras adicionadas no firewall, você pode testar se o servidor está funcionando acessando o nome do domínio do seu servidor ou endereço IP público no seu navegador Web.

Se você não tiver um nome de domínio apontando no seu servidor e você não sabe o endereço IP público do seu servidor, é possível encontrá-lo executando o seguinte comando:

  • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Isso irá mostrar na tela alguns endereços IP. Você pode testar cada um deles em seu navegador Web.

Como uma alternativa, verifique qual endereço IP está acessível, como visto por outras locações na internet:

  • curl -4 icanhazip.com

Digite o endereço que receber no seu navegador Web e ele irá levá-lo para a página inicial do Nginx:

http://server_domain_or_IP

Nginx default page

Se ver a página acima, você instalou o Nginx com sucesso.

Passo 2 — Como instalar o MySQL para gerenciar dados do site

Agora que você tem um servidor Web, será necessário instalar o MySQL (um sistema de gerenciamento de banco de dados) para armazenar e gerenciar os dados para seu site.

Instale o MySQL digitando:

  • sudo apt install mysql-server

O software de banco de dados MySQL agora está instalado, mas sua configuração ainda não está completa.

Para proteger a instalação, o MySQL vem com um script que irá perguntar se queremos modificar alguns padrões não-seguros. Inicie o script digitando:

  • sudo mysql_secure_installation

Este script irá perguntar se deseja configurar o VALIDATE PASSWORD PLUGIN.

Aviso: Ativar esta característica é uma decisão sua. Se habilitada, as senhas que não corresponderem o critério especificado serão rejeitadas pelo MySQL com um erro. Isso causará problemas caso utilize uma senha fraca em conjunto com o software que configura automaticamente as credenciais de usuário do MySQL, como os pacotes Ubuntu para o phpMyAdmin. É seguro deixar a validação desativada, mas sempre utilize senhas fortes e únicas para as credenciais do banco de dados.

Responda Y para sim, ou qualquer outra coisa para continuar sem a habilitar.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

Se tiver habilitado a validação, o script também irá pedir a você para selecionar um nível de validação de senha. Lembre-se de que se digitar 2 para o níveis mais forte – receberá erros ao tentar definir qualquer senha que não contenha números, letras maiúsculas e minúsculas, e caracteres especiais, ou que se baseiam em palavras do dicionário comuns.

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Em seguida, será solicitado que envie e confirme uma senha root:

Please set the password for root here.

New password:

Re-enter new password:

Para o resto das perguntas, pressione Y e clique na tecla ENTER em cada prompt. Isso removerá alguns usuários anônimos e o banco de dados teste, desativará os logins remotos ao root, e carregará essas novas regras para que o MySQL respeite imediatamente as alterações que fizemos.

Note que os sistemas Ubuntu que rodam o MySQL 5.7 (e as versões posteriores), o usuário root MySQL está definido para autenticar usando o plug-in do auth_socket por padrão ao invés de um com uma senha. Isso permite maior segurança e a usabilidade na maioria dos casos, mas também pode complicar as coisas quando for necessário permitir que um programa externo (por exemplo, o phpMyAdmin) acesse o usuário.

Se usar o plug-in auth_socket para acessar o MySQL se encaixar com seu fluxo de trabalho, vá para o Passo 3. Se, no entanto, preferir usar uma senha quando se conectar ao MySQL como root, será necessário alterar seu método de autenticação do auth_socket para o mysql_native_password. Para fazer isso, abra o prompt do MySQL do seu terminal:

  • sudo mysql

Em seguida, verifique quais os métodos de autenticação cada conta de usuário do seu MySQL utilizam com o seguinte comando:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

Neste exemplo, é possível ver que o usuário root autenticou usando o plug-in auth_socket. Para configurar a conta root para autenticar com uma senha, execute o comando ALTER USER. Certifique-se de trocar a senha por uma senha forte de sua escolha:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Então, execute o comando FLUSH o qual diz para o servidor recarregar as tabelas de permissões e colocar as suas alterações em vigor:

  • FLUSH PRIVILEGES;

Verifique novamente os métodos de autenticação utilizados por cada um dos seus usuários para confirmar que *root *já não autentica utilizando o plug-in do auth_socket:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

Neste exemplo, é possível ver o resultado que agora o usuário root MySQL autentica utilizando uma senha. Assim que confirmar isso no seu servidor, saia do shell MySQL:

  • exit

Nota: Após configurar seu usuário root MySQL para autenticar com uma senha, você já não será capaz de acessar o MySQL com o comando sudo mysql usado anteriormente. Ao invés disso, execute o seguinte:

  • mysql -u root -p

Após digitar a senha que acabou de definir, você verá o prompt do MySQL.

Neste ponto, seu sistema de banco de dados está configurado e você pode seguir em frente para a instalação do PHP.

Passo 3 — Como instalar o PHP e configurar o Nginx para usar o Processo do PHP

Agora você tem o Nginx instalado para servir suas páginas e o MySQL instalado para armazenar e gerenciar seus dados. No entanto, você ainda não tem nada instalado que possa gerar conteúdo dinâmico. Aqui é onde o PHP entra em jogo.

Uma vez que o Nginx não contém o processamento nativo do PHP como outros servidores Web, você precisará instalar o php-fpm, que significa "gerenciador de processos fastCGI”. Diremos ao Nginx para passar os pedidos PHP para este software para processamento.

Nota: Dependendo do seu fornecedor de nuvem, talvez seja necessário adicionar o repositório universe do Ubuntu que inclui o software de código aberto mantido pela comunidade Ubuntu, antes de instalar o pacote php-fpm. Faça isso digitando:**

  • sudo add-apt-repository universe

Instale o módulo php-fpm junto com um pacote auxiliar adicional, php-mysql, que permitirá que o PHP se comunique com seu backend do banco de dados. A instalação irá puxar os arquivos principais e necessários do PHP. Faça isso digitando:

  • sudo apt install php-fpm php-mysql

Agora você tem todos os componentes de pilha LEMP necessários instalados, mas ainda assim será necessário fazer algumas alterações de configuração para dizer ao Nginx para usar o processador PHP para conteúdo dinâmico.

Isto é feito no nível de bloco do servidor ( os blocos do servidor são semelhantes aos hosts virtuais do Apache). Para fazer isso, abra um novo arquivo de configuração de bloco de servidor dentro do diretório /etc/nginx/sites-available/. Neste exemplo, o novo arquivo de configuração de bloco de servidor se chama example.com, embora você possa dar o nome que quiser:

  • sudo nano /etc/nginx/sites-available/example.com

Ao editar um novo arquivo de configuração de bloco de servidor, ao invés de editar o padrão, você será capaz de restaurar facilmente a configuração padrão caso seja necessário.

Adicione o seguinte conteúdo, que foi tomado e ligeiramente modificado do arquivo de configuração padrão do bloco de servidor, ao seu novo arquivo de configuração de bloco de servidor:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

Aqui está o que cada um desses blocos de localização e diretrizes fazem:

  • listen — Define o que a porta Nginx irá escutar. Neste caso, ele irá escutar na porta 80, a porta padrão para o HTTP.
  • root— Define o documento root onde os arquivos apresentados pelo site são armazenados.
  • index— Configura o Nginx para dar prioridade a arquivos de serviço designados index.php quando um arquivo index é solicitado, se eles estiverem disponíveis.
  • server_name— Define qual bloco de servidor deve ser usado para um dado pedido ao seu servidor.** Aponte esta diretriz para o nome de domínio do seu servidor ou endereço IP público.**
  • location /— O primeiro bloco de localização inclui uma diretriz try_files, que verifica a existência de arquivos que correspondam a um pedido URI. Se o Nginx não puder encontrar o arquivo apropriado, ele irá retornar um erro 404.
  • location ~ \.php$— Este bloco de localização lida o processamento atual do PHP apontando o Nginx para o arquivo de configuração fastcgi-php.conf e o arquivo php7.2-fpm.sock que declara qual soquete está associado ao php-fpm.
  • location ~ /\.ht — O último bloco de localização lida com os arquivos .htaccess, que o Nginx não processa. Ao adicionar a diretriz deny all, se algum arquivo .htaccess encontrar seu caminho para a root do documento ele não será apresentado aos visitantes.

Após adicionar este conteúdo, salve e feche o arquivo. Habilite seu novo bloco de servidor criando um link simbólico do seu novo arquivo de configuração de bloco de servidor (no diretório /etc/nginx/sites-available/) para o diretório /etc/nginx/sites-enabled/:

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Então, desvincule o arquivo de configuração padrão do diretório /sites-enabled/:

  • sudo unlink /etc/nginx/sites-enabled/default

Nota: Se for necessário restaurar a configuração padrão, recrie o link simbólico, desta forma:

  • sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Teste seu novo arquivo de configuração para erros de sintaxe digitando:

  • sudo nginx -t

Se algum erro for reportado, volte e verifique novamente seu arquivo antes de continuar.

Quando estiver pronto, recarregue o Nginx para fazer as alterações necessárias:

  • sudo systemctl reload nginx

Isto conclui a instalação e configuração da sua pilha LEMP. No entanto, é prudente confirmar que todos os componentes podem se comunicar uns com os outros.

Passo 4 — Como criar um arquivo PHP para testar a configuração

Sua pilha LEMP agora deve estar configurada completamente. Teste ela para validar que o Nginx pode passar corretamente os arquivos .php para o processador PHP.

Para fazer isso, utilize seu editor de texto para criar um arquivo de teste PHP chamado info.php na sua root do documento:

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

Digite as linhas a seguir para o novo arquivo. Este é um código PHP válido que irá retornar informações sobre seu servidor:

/var/www/html/info.php
<?php
phpinfo();

Quando você terminar, salve e feche o arquivo.

Agora, visite esta página no seu navegador Web visitando o nome de domínio do seu servidor ou endereço IP público seguido por /info.php:

http://your_server_domain_or_IP/info.php

Você deve ver uma página Web que foi gerada pelo PHP com informações sobre seu servidor:

PHP page info

Se você ver uma página que se pareça com essa, o processamento PHP com o Nginx foi configurado com sucesso.

Após verificar que o Nginx renderiza a página corretamente, é melhor remover o arquivo que você criou uma vez que ele pode de fato dar a usuários não autorizados algumas dicas sobre sua configuração que podem ajudá-los a tentar invadir. Você sempre pode gerar novamente este arquivo se precisar dele mais tarde.

Agora, remova o arquivo digitando:

  • sudo rm /var/www/html/info.php

Com isso, você agora tem uma pilha LEMP totalmente configurada e funcionando no seu servidor Ubuntu 18.04.

Conclusão

Uma pilha LEMP é uma plataforma poderosa que permitirá que você configure e apresente quase qualquer site ou aplicativo do seu servidor.

Há um número de passos que você pode tomar a partir daqui. Por exemplo, certifique-se de que as conexões para seu servidor estejam seguras. Para isso, você pode proteger sua instalação Nginx com o Let’s Encrypt. Ao seguir este guia, você receberá um certificado TLS/SSL gratuito para seu servidor, permitindo que apresente conteúdo sobre o HTTPS.

Creative Commons License