Ubuntu 22.04 Server / Como instalar Apache, PHP e MariaDB
No Ubuntu 22.04 Server, instale Apache, seu módulo PHP, MariaDB e a extensão de banco de dados do PHP para preparar um ambiente Web básico. Depois, separe a conta de administração do MariaDB da conta da aplicação e verifique se o PHP consegue ler um valor do banco.
Escopo da instalação e pacotes
Este guia executa Apache e MariaDB em um único servidor novo, usando os repositórios padrão do Ubuntu 22.04. É preciso ter privilégios sudo e acesso à Internet para baixar os pacotes. Em um servidor existente, faça primeiro backup da configuração Web e dos bancos e confira se os nomes de arquivos, contas e bancos do exemplo estão disponíveis. Se já usa PHP-FPM, não misture esta configuração de módulo do Apache com a existente.
- Atualize o índice de pacotes e instale os componentes.
libapache2-mod-phpprocessa PHP no Apache, enquantophp-mysqlfornece as extensões para acessar o MariaDB. Instale tambémphp-clipara as verificações na linha de comando. Consulte o guia de instalação do PHP do Ubuntu sobre essa configuração.
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- Inicie os serviços e habilite a inicialização automática. Confira se o teste da configuração do Apache informa
Syntax OKe reinicie o Apache para carregar o módulo PHP.
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
O último comando exibe active para cada serviço em execução. Veja as versões instaladas com apache2 -v, php -v e mariadb --version. Servidores com repositórios adicionais podem instalar uma versão de PHP diferente daquela dos repositórios padrão.
Verificar a autenticação administrativa do MariaDB
Os pacotes padrão do MariaDB no Ubuntu geralmente usam autenticação por socket Unix na administração local. Ela verifica a identidade do usuário do sistema operacional; não significa que qualquer pessoa possa se conectar com uma senha root vazia. Abra a sessão administrativa abaixo e examine a conta e a configuração atuais.
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
A autenticação de root pode variar conforme a configuração existente. Este exemplo mantém a autenticação por socket e cria uma conta separada para a aplicação, seguindo a explicação sobre autenticação do MariaDB a partir da versão 10.4. Não faça UPDATE direto no valor plugin de mysql.user nem use root em uma aplicação Web.
A ferramenta abaixo permite revisar os ajustes de segurança da instalação inicial. O texto e a ordem das perguntas variam com a versão e a configuração atual; não responda Y automaticamente a tudo.
sudo mariadb-secure-installation
- Se já administra o banco por autenticação via socket, pode mantê-la. A documentação oficial da ferramenta MariaDB explica que normalmente não é necessário definir uma nova senha root nessa configuração.
- Em um servidor novo, é adequado remover usuários anônimos e o banco test desnecessário, além de restringir o login remoto de root. Se houver serviços existentes, verifique se esses recursos estão em uso antes de decidir. Aplique as mudanças quando a ferramenta perguntar sobre recarregar as tabelas de privilégios.
Criar banco e conta exclusivos para a aplicação
Conecte-se novamente com sudo mariadb --protocol=socket e execute o SQL abaixo. lampdemo e lamp_app são nomes novos para este exercício. Se já existirem, escolha outros nomes e ajuste os exemplos seguintes de forma consistente; não sobrescreva nem exclua objetos existentes. Troque o marcador da senha por uma senha longa e exclusiva e use o mesmo valor na configuração PHP. Senhas com aspas simples devem seguir as regras de escape de strings do SQL e do PHP, respectivamente.
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
O administrador cria a tabela; a aplicação recebe apenas permissões de consulta, inserção, atualização e exclusão nesse banco. Se um instalador precisar criar tabelas, avalie essa permissão separadamente. Depois de conceder permissões com GRANT, não é necessário executar um FLUSH PRIVILEGES adicional.
Consulte pelo terminal usando a conta da aplicação e confira se aparece database-ok. Não escreva a senha após -p; informe-a quando solicitada.
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
Criar os arquivos PHP do exemplo de integração
O diretório de documentos Web do site Apache padrão do Ubuntu normalmente é /var/www/html. Para um host virtual existente, examine sudo apache2ctl -S e a configuração DocumentRoot do site e adapte o caminho do arquivo Web. Se algum arquivo abaixo já existir, use outro nome. Guarde a configuração com a senha fora do diretório Web.
- Crie o diretório de configuração e abra um editor. As permissões abaixo pressupõem que o Apache execute com o usuário e grupo padrão do Ubuntu,
www-data.
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
Salve todo o conteúdo abaixo em /etc/lamp-demo/database.php. Substitua o valor de password pela senha da aplicação definida antes. Como explica a documentação de conexão PDO_MYSQL do PHP, host=localhost usa um socket em Unix. Alterar para 127.0.0.1 seleciona TCP e pode mudar a correspondência da conta e os requisitos da conexão.
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- Mantenha root como proprietário da configuração, com leitura apenas para o proprietário e o grupo do Apache. Em seguida, abra o arquivo Web de verificação.
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
Salve todo o conteúdo abaixo em /var/www/html/lamp-check.php. PDO (PHP Data Objects) é uma interface de acesso a bancos a partir do PHP. O código verifica o valor real da tabela antes de mostrar sucesso. Se falhar, retorna HTTP 500 e uma mensagem genérica e registra a causa detalhada no log do servidor.
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Defina permissões de leitura para o arquivo Web e verifique a sintaxe PHP dos dois arquivos.
No syntax errors detectedindica apenas sintaxe válida, não uma conexão bem-sucedida com o banco.
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
Um usuário comum pode não conseguir ler a configuração, por isso a verificação de sintaxe desse arquivo usa sudo. Não é necessário dar escrita a todo o diretório Web nem aplicar chmod 777.
Verificar a resposta HTTP e a conexão com o banco
Solicite a URL abaixo no próprio servidor. Se não houver curl, instale com sudo apt install curl. O status HTTP 200 e as duas linhas abaixo no corpo da resposta indicam que o Apache executou PHP e que o PHP leu o registro de exemplo no MariaDB.
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
Em outro computador, abra http://SERVER-IP/lamp-check.php no navegador. Para um host virtual, use o nome de host configurado. Ver apenas a página inicial padrão ou executar php -v não verifica essa integração.
Se funcionar localmente, mas não a partir de outro computador, confira sudo ufw status verbose, os grupos de segurança da nuvem e o roteamento. Em uma rede privada de testes com UFW já ativo, a regra abaixo permite HTTP na porta 80 somente a partir da sub-rede prevista. Substitua 192.168.10.0/24 pela sua sub-rede confiável. Não desative o firewall nem o ative pela primeira vez sem permitir SSH remoto para este teste.
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHP e MariaDB se comunicam por socket no mesmo servidor, portanto não é necessário expor a porta 3306. Faça este exercício HTTP em um ambiente confiável. Antes de transmitir credenciais ou outros dados em produção, configure separadamente o domínio, o host virtual e o certificado HTTPS.
Diagnosticar erros e limpar os testes
Para isolar falhas de conexão, confira nesta ordem: serviços, módulos PHP, contas e permissões de arquivos. Os comandos abaixo mostram a configuração e os módulos do Apache e os logs recentes dos dois serviços. Os logs podem conter informações operacionais; não os publique sem revisão.
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- O código PHP aparece ou é baixado: interrompa o acesso público e confira a ativação do módulo PHP no Apache e o reinício do serviço. Se instalar
libapache2-mod-phpnão resolver, examine também a configuração existente de PHP-FPM e dos hosts virtuais. - could not find driver: confira se a extensão
php-mysqlcorrespondente ao PHP usado pelo Apache está instalada e ativa, depois reinicie o Apache. O PHP da linha de comando e o do Apache podem usar configurações diferentes. - Access denied: confira a senha da aplicação, a conta
'lamp_app'@'localhost'e suas permissões. Não altere a autenticação de root nem conceda privilégios globais como contorno. Se o socket não for encontrado, compare o resultado deSHOW VARIABLES LIKE 'socket';no MariaDB com a configuração de socket do PHP. - Permission denied ou 404: confira se o usuário do Apache consegue ler a configuração e se o arquivo Web está no DocumentRoot do site solicitado. Verifique também as permissões de acesso ao diretório
/etc/lamp-demo.
Ao terminar, use o comando abaixo para excluir somente o arquivo Web de teste criado neste guia e confirme que a mesma URL não retorna mais a mensagem de sucesso. Não deixe arquivos que exponham informações do ambiente, como um phpinfo.php existente. Se uma aplicação real usar a configuração, mantenha-a fora do diretório Web com permissões restritas.
sudo rm -- /var/www/html/lamp-check.php
Para apagar também os dados do exercício, confirme primeiro que nenhum outro serviço os utiliza e execute o SQL abaixo em uma sessão administrativa. Excluir um banco é irreversível; faça backup do que precisar antes. Aplique apenas aos nomes criados neste exercício.
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
Em uma instalação no mesmo servidor, mantenha a configuração de escuta local do MariaDB. Se precisar de acesso remoto ao banco, não remova simplesmente bind-address: planeje em conjunto o endereço de escuta, as origens permitidas, a conta dedicada e a conexão criptografada.



