Tutorial

Como Instalar Linux, Apache, MySQL, PHP (Pilha LAMP) no Ubuntu 20.04

UbuntuMySQLApachePHPLAMP StackUbuntu 20.04

Introdução

Uma pilha “LAMP” é um grupo de softwares de código aberto que normalmente é instalado em conjunto, para permitir que um servidor hospede sites dinâmicos e aplicativos web escritos em PHP. Este termo é uma sigla que representa o sistema operacional Linux com o servidor Web do Apache. Os dados do site são armazenados em uma base de dados MySQL e o conteúdo dinâmico é processado pelo PHP.

Neste guia, instalaremos uma pilha LAMP em um servidor Ubuntu 20.04.

Pré-requisitos

Para completar este tutorial, você precisa ter um servidor Ubuntu 20.04 com uma conta de usuário não root com o sudo habilitado e um firewall básico. Isso pode ser configurado usando nosso guia de configuração inicial de servidor para Ubuntu 20.04.

Passo 1 — Instalando o Apache e atualizando o firewall

O servidor Web Apache está entre os servidores Web mais populares no mundo. Ele está bem documentado, tem uma comunidade ativa de usuários e tem sido amplamente utilizado durante grande parte da história da web, o que o torna uma ótima escolha padrão para hospedar um site.

Instale o Apache usando o gerenciador de pacotes do Ubuntu, apt:

  • sudo apt update
  • sudo apt install apache2

Se essa é a primeira vez que você está usando o sudo nesta sessão, você será solicitado a fornecer a senha do seu usuário para confirmar que você tem os privilégios corretos para gerenciar os pacotes de sistema com o apt. Você também será solicitado a confirmar a instalação do Apache pressionando Y e, depois, ENTER.

Assim que a instalação terminar, você precisa ajustar suas configurações de firewall para permitir o tráfego HTTP e HTTPS. O UFW tem diferentes perfis de aplicações que você pode aproveitar para conseguir isso. Para listar todos os perfis de aplicações atualmente disponíveis no UFW, você pode executar:

  • sudo ufw app list

Você verá um resultado como este:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

Aqui está o que cada um desses perfis significa:

  • Apache: Este perfil abre apenas a porta 80 (normal, tráfego web não criptografado).
  • Apache Full: Este perfil abre ambas as portas 80 (normal, tráfego web não criptografado) e 443 (tráfego TLS/SSL criptografado).
  • Apache Secure: Este perfil abre apenas a porta 443 (tráfego TLS/SSL criptografado).

Por enquanto, é melhor permitir conexões apenas na porta 80, pois essa é uma nova instalação do Apache e você ainda não tem um certificado TLS/SSL configurado para permitir o tráfego HTTPS em seu servidor.

Para permitir apenas o tráfego na porta 80, use o perfil Apache:

  • sudo ufw allow in "Apache"

Você pode verificar a alteração com:

  • sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

O tráfego na porta 80 está agora autorizado através do firewall.

Você pode fazer uma verificação imediata para verificar se tudo correu como planejado visitando o endereço IP público do seu servidor no seu navegador web (veja a nota sob o título seguinte para descobrir qual é o seu endereço IP público, se você ainda não possui essas informações):

http://your_server_ip

Você verá a página web padrão do Apache para o Ubuntu 20.04,que está lá para fins informativos e de testes. Ela deve se parecer com isto:

Ubuntu 20.04 Apache default

Se ver essa página, seu servidor Web agora está instalado corretamente e é acessível através do seu firewall.

Como Encontrar o Endereço IP Público do seu Servidor

Se não sabe qual é o endereço IP público do seu servidor, há uma série de maneiras para encontrá-lo. Normalmente, este é o endereço que você usa para se conectar ao seu servidor através do SSH.

Existem algumas maneiras de fazer isso a partir da linha de comando. Primeiro, poderia usar as ferramentas iproute2 para obter seu endereço IP digitando:

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

Isso retornará a você duas ou três linhas. Todos os endereços são corretos, mas seu computador consegue usar apenas um deles, então sinta-se à vontade para testar cada um.

Um método alternativo é usar o utilitário curl para contatar uma entidade exterior para dizer a você como ela vê seu servidor. Isso é feito perguntando a um servidor específico qual é seu endereço IP:

  • curl http://icanhazip.com

Independentemente do método que você usa para obter seu endereço IP, digite-o na barra de endereço do seu navegador Web para ver a página padrão do Apache.

Passo 2 — Instalando o MySQL

Agora que você tem um servidor web funcionando, você precisa instalar um sistema de banco de dados, para conseguir armazenar e gerenciar os dados do seu site. O MySQL é um sistema de gerenciamento de banco de dados popular, usado em ambientes PHP.

Novamente, utilize o apt para adquirir e instalar este software:

  • sudo apt install mysql-server

Quando solicitado, confirme a instalação digitando Y e, depois, ENTER.

Quando a instalação terminar, é recomendável que você execute um script de segurança que vem pré-instalado com o MySQL. Esse script removerá algumas configurações padrão inseguras e irá bloquear o acesso ao seu sistema de banco de dados. Inicie o script interativo executando:

  • sudo mysql_secure_installation

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

Nota: 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. É 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 você responder “yes”, você será solicitado a selecionar um nível de validação por senha. Lembre-se de que se você digitar 2 para o nível mais forte você receberá erros ao tentar definir qualquer senha que não contenha números, letras maiúsculas e minúsculas e caracteres especiais, ou que baseiam-se em palavras comuns do dicionário.

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

Independentemente de você ter escolhido VALIDATE PASSWORD PLUGIN, seu servidor irá pedir a você para selecionar e confirmar uma senha para o.root user do MySQL. Isso não deve ser confundido com o root do sistema. O usuário raiz do banco de dados é um usuário administrativo com privilégios totais sobre o sistema de banco de dados. Embora o método de autenticação predefinido para o root user dispense o uso de uma senha, mesmo quando uma senha está definida, você deve definir uma senha forte aqui como uma medida de segurança adicional. Vamos falar sobre isso em breve.

Se você habilitar a validação por senha, será apresentado a você a força da senha para a senha root e o seu servidor perguntará se você deseja continuar com essa senha. Se estiver satisfeito com sua senha atual, digite Y para “yes” no prompt:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

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

Quando terminar, teste se você consegue fazer login no console do MySQL digitando:

  • sudo mysql

Isso conectará ao servidor MySQL como usuário administrativo root do banco de dados, o que é pressuposto pelo uso do sudo ao executar esse comando. Você deve ver um resultado como este:

Output
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

Para sair do console do MySQL, digite:

  • exit

Observe que você não precisa fornecer uma senha para se conectar como root user, embora você tenha definido uma ao executar o script mysql_secure_installation. Isso é porque o método de autenticação padrão para o usuário administrativo do MySQL é unix_socket, em vez de password Embora, num primeiro momento, isso possa parecer um problema de segurança, tal medida torna o servidor de banco de dados mais seguro, uma vez que que os únicos usuários autorizados a fazer login como usuário root do MySQL são os usuários do sistema com privilégios sudo que conectam-se pelo console ou através de uma aplicação executando com os mesmos privilégios. Em termos práticos, isso significa que você não conseguirá usar o usuário raiz do banco de dados administrativo para se conectar a partir do seu aplicativo PHP. Definir uma senha para a conta root do MySQL funciona como uma salvaguarda, caso o método de autenticação padrão seja alterado de unix_socket para password.

Para aumentar a segurança, o melhor é configurar contas de usuário dedicadas, com privilégios menos abrangentes em relação a cada banco de dados, especialmente se você planeja ter vários bancos de dados hospedados no seu servidor.

Nota: no momento em que este artigo foi escrito, a biblioteca nativa do PHP para o MySQL mysqlnd não suporta o cling_sha2_authentication, o método de autenticação padrão para o MySQL 8. Por essa razão, ao criar usuários de banco de dados para aplicações PHP no MySQL 8, você precisará garantir que eles estejam configurados para usar o mysql_native_password. Vamos demonstrar como fazer isso no Passo 6.

Agora, seu servidor MySQL está instalado e protegido. Em seguida, instalaremos o PHP, o componente final na pilha LAMP.

Passo 3 — Instalando o PHP

Você instalou o Apache para servir seu conteúdo e instalou o MySQL para armazenar e gerenciar seus dados. O PHP é o componente de nossa configuração que processará códigos para a exibição de conteúdo dinâmico para o usuário final. Além do pacote php, você precisará do php-mysql, um módulo PHP que permite que o PHP se comunique com os bancos de dados baseados em MySQL. Você também precisará do libapache2-mod-php para habilitar o Apache a lidar com arquivos PHP. Os pacotes básicos do PHP serão instalados automaticamente como dependências.

Para instalar esses pacotes, execute:

  • sudo apt install php libapache2-mod-php php-mysql

Assim que a instalação terminar, você pode executar o seguinte comando para confirmar sua versão PHP:

  • php -v
Output
PHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Neste ponto, sua pilha LAMP está totalmente operacional, mas antes de testar sua configuração com um script PHP, é melhor configurar um Apache Virtual Host para armazenar os arquivos e as pastas do seu site. Vamos fazer isso no próximo passo.

Passo 4 — Criando um Virtual Host para seu Website

Ao usar o servidor web Apache, você pode criar virtual hosts (similares a blocos de servidor no Nginx) para encapsular detalhes de configuração e hospedar mais de um domínio em um único servidor. Neste guia,vamos configurar um domínio chamado your_domain, mas você deve substituí-lo por seu próprio nome de domínio.

Nota: caso esteja usando a DigitalOcean como provedor de hospedagem DNS, você pode conferir nossos docs de produto para obter instruções detalhadas sobre como configurar um novo nome de domínio e apontá-lo para o seu servidor.

O Apache no Ubuntu 20.04 tem um bloco de servidor habilitado por padrão que está configurado para servir documentos do diretório /var/www/html. Enquanto isso funciona bem para um único site, ele pode tornar-se indevido se você estiver hospedando vários sites. Em vez de modificar o /var/www/html, vamos criar uma estrutura de diretórios dentro do /var/www para o site your_domain, deixando o /var/www/html intocado como o diretório padrão para ser servido se uma solicitação de cliente não corresponder a nenhum outro site.

Crie o diretório para o your_domain como segue:

  • sudo mkdir /var/www/your_domain

Em seguida, atribua a propriedade do diretório com a variável de ambiente $USER, que deve fazer referência ao seu usuário de sistema atual:

  • sudo chown -R $USER:$USER /var/www/your_domain

Em seguida, abra um novo arquivo de configuração no diretório sites-available do Apache usando seu editor de linha de comando preferido. Aqui, usaremos o nano:

  • sudo nano /etc/apache2/sites-available/your_domain.conf

Isso criará um novo arquivo em branco. Cole nele a seguinte configuração:

/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80>
    ServerName your_domain
    ServerAlias www.your_domain
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Com esta configuração de VirtualHost, estamos dizendo ao Apache para servir your_domain usando o /var/www/your_domain como o diretório web root. Se você quiser testar o Apache sem um nome de domínio, você pode remover ou comentar as opções ServerName e ServerAlias adicionando um caractere # no início da linha de cada opção.

Agora, você pode usar a2ensite para habilitar o novo virtual host:

  • sudo a2ensite your_domain

Você pode querer desativar o site padrão que vem instalado com o Apache. Isso é necessário se você não estiver usando um nome de domínio personalizado, pois, neste caso, a configuração padrão do Apache iria sobrepor seu virtual host. Para desativar o site padrão do Apache, digite:

  • sudo a2dissite 000-default

Para garantir que seu arquivo de configuração não contenha erros de sintaxe, execute:

  • sudo apache2ctl configtest

Por fim, recarregue o Apache para que essas alterações entrem em vigor:

  • sudo systemctl reload apache2

Agora, seu novo site está ativo, mas o web root /var/www/your_domain ainda está vazio. Crie um arquivo index.html naquele local para que possamos testar se o virtual host funciona conforme esperado:

  • nano /var/www/your_domain/index.html

Inclua o conteúdo a seguir neste arquivo:

/var/www/your_domain/index.html
<h1>It works!</h1>

<p>This is the landing page of <strong>your_domain</strong>.</p>

Agora, vá até seu navegador e acesse o nome de domínio ou o endereço IP do seu servidor novamente:

http://server_domain_or_IP

Você verá uma página como esta:

Teste do host virtual do Apache

Se você vir esta página, isso significa que seu virtual host do Apache está funcionando como esperado.

Você pode deixar esse arquivo funcionando como uma página principal temporária para sua aplicação até que você configure um arquivo index.php para substituí-lo. Assim que fizer isso, lembre-se de remover ou renomear o arquivo index.html de seu document root pois isso teria precedência sobre um arquivo index.php por padrão.

Uma Nota sobre o DirectoryIndex no Apache

Com as configurações padrão do DirectoryIndex no Apache, um arquivo chamado index.html sempre terá precedência sobre um arquivo index.php. Isso é útil para configurar páginas de manutenção em aplicações PHP, criando um arquivo index.html temporário contendo uma mensagem informativa para os visitantes. Como esta página terá precedência sobre a página index.php, ela se tornará a página principal para a aplicação. Assim que a manutenção terminar, o index.html é renomeado ou removido do document root, trazendo de volta a página regular da aplicação.

Caso queira alterar este comportamento, você precisa editar o arquivo /etc/apache2/mods-enabled/dir.conf e modificar a ordem na qual o arquivo index.php está listado na diretiva DirectoryIndex:

  • sudo nano /etc/apache2/mods-enabled/dir.conf
/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
        DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

Após salvar e fechar o arquivo, você precisará recarregar o Apache para que as alterações entrem em vigor:

  • sudo systemctl reload apache2

No próximo passo, criaremos um script PHP para testar se o PHP está corretamente instalado e configurado em seu servidor.

Passo 5 — Testando o Processamento do PHP em seu Servidor Web

Agora que você tem um local personalizado para hospedar os arquivos e pastas do seu site, criaremos um script PHP de teste para confirmar que o Apache consegue lidar e processar solicitações para arquivos PHP.

Crie um novo arquivo chamado info.php dentro de sua pasta web root personalizada:

  • nano /var/www/your_domain/info.php

Isso abrirá um arquivo em branco. Adicione o seguinte texto, que é um código válido do PHP, dentro do arquivo:

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

Quando você terminar, salve e feche o arquivo.

Para testar esse script, vá para seu navegador web e acesse o nome de domínio ou o endereço IP do seu servidor seguido pelo nome do script, que neste caso é info.php:

http://server_domain_or_IP/info.php

Você verá uma página parecida com esta:

Ubuntu 20.04 o PHP info

Esta página fornece algumas informações básicas sobre seu servidor na perspectiva do PHP. Ela é útil para a depuração e para garantir que suas configurações estejam sendo aplicadas corretamente.

Se você puder ver essa página no seu navegador, então seu PHP está funcionando como esperado.

Após verificar as informações relevantes sobre seu servidor PHP através dessa página, é melhor remover o arquivo que você criou, uma vez que ele contém informações confidenciais sobre seu ambiente PHP e seu servidor Ubuntu. Você pode usar o rm para fazer isso:

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

Você sempre pode recriar essa página se precisar acessar as informações novamente mais tarde.

Passo 6 — Testando a Conexão com o Banco de Dados pelo PHP (Opcional)

Se você quiser testar se o PHP é capaz de se conectar ao MySQL e executar consultas ao banco de dados, você pode criar uma tabela de teste, com dados fictícios, e fazer uma consulta em seu conteúdo, a partir de um script PHP. Antes que possamos fazer isso, precisamos criar um banco de dados de teste e um novo usuário do MySQL corretamente configurado para acessá-lo.

No momento em que este artigo foi escrito, a biblioteca mysqlnd nativa do PHP para o MySQL não suporta o claching_sha2_authentication, o método de autenticação padrão para o MySQL 8. Precisaremos criar um novo usuário com o método de autenticação mysql_native_password para conseguir se conectar ao banco de dados MySQL a partir do PHP.

Vamos criar um banco de dados chamado example_database e um usuário chamado example_user, mas você pode substituir esses nomes por valores diferentes.

Primeiro, conecte-se ao console do MySQL usando a conta root:

  • sudo mysql

Para criar um novo banco de dados, execute o seguinte comando a partir do seu console do MySQL:

  • CREATE DATABASE example_database;

Agora, crie um usuário e lhe conceda privilégios completos sobre o banco de dados personalizado que você acabou de criar.

O comando a seguir cria um novo usuário chamado example_user usando o mysql_native_password como o método de autenticação padrão. Vamos definir a senha do usuário como password, mas você deve substituir esse valor por uma senha segura de sua própria escolha:

  • CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Agora, precisamos dar a este usuário permissão para o banco de dados example_database:

  • GRANT ALL ON example_database.* TO 'example_user'@'%';

Isso dará ao usuário example_user privilégios totais sobre o banco de dados example_database, ao mesmo tempo que impedirá que esse usuário crie ou altere outros bancos de dados no seu servidor.

Agora, saia do shell do MySQL com:

  • exit

Você pode testar se o novo usuário tem as permissões adequadas fazendo login no console MySQL novamente, desta vez usando as credenciais de usuário personalizadas:

  • mysql -u example_user -p

Observe a flag -p neste comando, a qual irá solicitar a senha utilizada ao criar o usuário example_user. Após fazer login no console do MySQL, confirme se você tem acesso ao banco de dados example_database:

  • SHOW DATABASES;

Isso gerará o seguinte resultado:

Output
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)

Em seguida, criaremos uma tabela de teste chamada todo_list. A partir do console do MySQL, execute a seguinte instrução:

  • CREATE TABLE example_database.todo_list (
  • item_id INT AUTO_INCREMENT,
  • content VARCHAR(255),
  • PRIMARY KEY(item_id)
  • );

Insira algumas linhas de conteúdo na tabela de teste. Talvez queira repetir o próximo comando algumas vezes, usando valores diferentes:

  • INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Para confirmar se os dados foram salvos com sucesso em sua tabela, execute:

  • SELECT * FROM example_database.todo_list;

Você verá o seguinte resultado:

Output
+---------+--------------------------+ | item_id | content | +---------+--------------------------+ | 1 | My first important item | | 2 | My second important item | | 3 | My third important item | | 4 | and this one more thing | +---------+--------------------------+ 4 rows in set (0.000 sec)

Após confirmar que você tem dados válidos em sua tabela de teste, saia do console do MySQL:

  • exit

Agora, você pode criar o script PHP que se conectará ao MySQL e irá consultar seu conteúdo. Crie um arquivo do PHP no seu diretório raiz da Web personalizado, usando seu editor preferido. Usaremos o nano para isso:

  • nano /var/www/your_domain/todo_list.php

O script PHP a seguir se conecta ao banco de dados MySQL e consulta o conteúdo da tabela todo_list, mostrando os resultados em uma lista. Se houver um problema com a conexão do banco de dados, ele irá gerar uma exceção. Copie este conteúdo para seu script todo_list.php:

/var/www/your_domain/todo_list.php
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>";
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Salve e feche o arquivo quando terminar de editar.

Agora, você pode acessar essa página em seu navegador web visitando o nome de domínio ou endereço IP público para seu site, seguido de /todo_list.php:

http://your_domain/todo_list.php

Você deve ver uma página como esta, mostrando o conteúdo que você inseriu em sua tabela de teste:

Exemplo de todo list do PHP

Isso significa que seu ambiente PHP está pronto para se conectar e interagir com seu servidor MySQL.

Conclusão

Neste guia, construímos uma base flexível para servir sites e aplicações PHP aos seus visitantes, usando o Apache como servidor web e o MySQL como sistema de banco de dados.

0 Comments

Creative Commons License