Developer Advocate
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.
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.
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:
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
Aqui está o que cada um desses perfis significa:
80
(normal, tráfego web não criptografado).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
OutputStatus: 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:
Se ver essa página, seu servidor Web agora está instalado corretamente e é acessível através do seu firewall.
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.
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:
OutputWelcome 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.
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
OutputPHP 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.
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:
<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:
<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:
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.
DirectoryIndex
no ApacheCom 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
<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.
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:
<?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:
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.
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
:
<?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:
Isso significa que seu ambiente PHP está pronto para se conectar e interagir com seu servidor MySQL.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
very good…