Configurando um servidor de aplicação PHP e MySQL com Apache e mod_php.

Eu sou um programador apaixonado por aprender e ensinar. Nos últimos 16 anos tenho focado minhas atenções ao desenvolvimento web Fullstack, mas sou bastante entusiasta das plataformas mobile.
Existem diversas formas de executar uma aplicação PHP em um servidor, como, por exemplo, utilizando Nginx + PHP-FPM, FrankenPHP, Apache + PHP-FPM, Apache + mod_php, entre outras combinações possíveis. Cada uma dessas abordagens possui suas próprias vantagens e desvantagens, especialmente quando falamos de desempenho, escalabilidade e facilidade de configuração.
Para este tutorial, optaremos pela forma mais tradicional de instalação do PHP, que é utilizando Apache + mod_php. Essa não é a opção mais performática para ambientes de produção de grande escala, porém é extremamente simples de configurar e ideal para quem está tendo o primeiro contato com administração de servidores.
Além disso, se a aplicação que você está publicizando não exige alto poder de processamento ou grande volume de tráfego de dados, essa configuração atende perfeitamente e, na maioria dos casos, dá e sobra para projetos pequenos e médios.
Atualizando a lista de Pacotes do SO
Nosso primeiro passo será atualizar a lista de pacotes do servidor, para isso execute o comando abaixo:
sudo apt update && sudo apt upgrade
Importante!!! Sempre que o Ubuntu exibe um prompt como:
After this operation, 4570 kB of additional disk space will be used. Do you want to continue? [Y/n]
Perceba que o Y está maiúsculo, isso indica que ao pressionar Enter, você está informando “SIM (Yes)”, pois esse é o valor padrão.
Em alguns casos pode ser exibido em seu terminal um prompt para configuração do SSH, se isso aparecer, aceite a opção “keep the local version currently installed” dando um Enter.

Instalando o Apache Server
Antes de partirmos para a instalação, é importante entender o que é o Apache Server e qual o seu papel dentro da nossa arquitetura. O Apache HTTP Server, muitas vezes chamado apenas de Apache ou também conhecido como httpd, é um dos servidores web mais populares e utilizados do mundo. Ele é responsável por receber requisições HTTP feitas pelos navegadores e devolver respostas, como páginas HTML, arquivos CSS, imagens e, no nosso caso, executar aplicações PHP em conjunto com módulos apropriados.
Vale destacar que o Apache não é apenas um programa isolado, mas um projeto mantido pela Apache Software Foundation, uma organização sem fins lucrativos que desenvolve e mantém diversos softwares amplamente utilizados no mercado, como Apache Kafka, Apache Tomcat, Apache Maven, Hadoop, entre muitos outros. Isso garante que o Apache HTTP Server seja um software maduro, estável, seguro e constantemente atualizado pela comunidade.
Em resumo, o Apache será o componente responsável por disponibilizar nossa aplicação para a internet, funcionando como a “porta de entrada” dos acessos dos usuários ao servidor.
Para instalar o Apache, execute o comando a seguir:
sudo apt install apache2
Precisamos agora configurar o nosso Firewall. Geralmente o Ubuntu já vem com uma ferramenta padrão de configuração de firewall chamada UFW (Uncomplicated Firewall). Ele tem diferentes perfis de aplicação que a gente pode aproveitar. Para listar todos os perfis de aplicações disponíveis, execute o comando:
sudo ufw app list
Você obterá uma resposta parecida com:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
Apache indica que o trafego será feito pela porta 80
Apache Full indica que o trafego será feito pela porta 80 e 443
Apache Secure indica que o trafego será feito apenas pela porta 443
Por enquanto vamos manter as coisas simples, então vamos trabalhar apenas com a porta 80 e a porta 22 (Para acesso via SSH). Para isso execute os comandos:
sudo ufw allow in "Apache"
sudo ufw allow ssh
A resposta será algo como:
Rules updated
Rules updated (v6)
Na sequência vamos analisar o status do UFW com o comando:
sudo ufw status
Se a resposta foi algo como:
Status: inactive
Você precisa ativar o UFW, nesse caso precisamos rodar o comando:
sudo ufw enable
Importante!!! Pode ser que você receba o seguinte prompt:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
Aqui o Ubuntu está informando que existe a possibilidade de a sua conexão SSH cair. Mas por quê?
Em outras palavras, o Ubuntu está te avisando algo como: “Você está prestes a aplicar alterações nas regras de rede (como firewall). Essas regras controlam quais portas podem ser acessadas. Eu não sei exatamente quais mudanças você fez, então existe a chance de que, ao aplicar essas novas regras, o acesso à porta 22 (SSH) seja bloqueado. Se isso acontecer, sua conexão pode ser interrompida.”
Ou seja, o sistema não está dizendo que a conexão vai cair, apenas alertando que pode cair, dependendo das regras configuradas.
Aceite digitando y e dando Enter.
Você receberá a seguinte mensagem:
Firewall is active and enabled on system startup
Isso quer dizer que além de você ter iniciado o serviço do Firewall, ele agora está configurado para iniciar junto com o SO caso você desligue e religue ou reiniciei o Droplet.
Importante!!! Caso você não tenha rodado o comando sudo ufw allow ssh você perdará acesso ao seu Droplet.
Se você executar novamente o comando sudo ufw status você terá uma resposta diferente agora:
Status: active
To Action From
-- ------ ----
Apache ALLOW Anywhere
22/tcp ALLOW Anywhere
Apache (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
Se você acessar o IP do seu Droplet via navegador, ele já exibirá a página de boas vindas do Apache Server.

Com essa configuração você já pode hospedar páginas estáticas feitas em HTML, CSS e Javascript em seu servidor, porém o nosso objetivo é hospedar sistemas desenvolvidos em PHP e MySQL, para isso precisamos de mais alguns passos.
Instalando o MySQL
O PHP oferece suporte a uma quantidade gigantesca de bancos de dados, como, por exemplo, Oracle, MySQL, MariaDB, SQL Server, SQLite, MongoDB, entre muitos outros.
Para este tutorial, precisamos escolher um SGBD (Sistema Gerenciador de Banco de Dados), e a opção mais comum acaba sendo o MySQL. Isso não significa que o MySQL seja necessariamente melhor ou mais aconselhável do que os demais, mas sim que ele é amplamente adotado pela comunidade PHP.
Grande parte dos desenvolvedores que trabalham com PHP opta pelo MySQL devido à enorme quantidade de livros, tutoriais, cursos e materiais disponíveis que utilizam esse SGBD como base, o que facilita bastante o aprendizado e a resolução de problemas.
Importante!!!
Instalar o MySQL no mesmo Droplet que o Apache + mod_php é uma opção que reduz significativamente o custo de hospedagem. Porém, essa abordagem pode gerar impacto na performance do sistema, visto que tanto o MySQL quanto o Apache e o PHP estarão “brigando” pelos mesmos recursos de CPU, RAM e SSD.
Se a sua aplicação possuir alto tráfego de dados ou fizer uso intensivo de CPU, memória ou I/O em disco, considere utilizar um Droplet separado para o MySQL ou optar por um serviço de banco de dados gerenciado. A própria DigitalOcean, assim como outras plataformas como AWS, Azure e GCP, dispõe de serviços desse tipo.
Em caso de dúvidas, consulte o manual da plataforma escolhida.
Para instalar o MySQL em seu Droplet execute o seguinte comando:
sudo apt install mysql-server
Assim que a instalação for finalizada precisamos configurar o nosso SGBD visando segurança, para isso execute o comando:
sudo mysql_secure_installation
Uma série de promps será exibida para você, vamos analisar cada um deles:
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT 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 component?
Press y|Y for Yes, any other key for No:
Basicamente aqui o MySQL está falando para você: “Cara, a gente precisa definir uma política de senhas para a nossa instalação, você quer definir a FORÇA dessas senhas”?
Digite y e pressione Enter.
Na sequência você terá esse próximo prompt:
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:
É nesse momento que você precisará definir qual a “Força” das senhas do seu MySQL. Eu aconselho que você escolha a opção MEDIUM, teclando 1 e pressionando Enter.
O próximo prompt será:
...
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL 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? (Press y|Y for Yes, any other key for No) :
Aqui ele está dizendo: “Cara, quer remover os usuários anônimos?” Vamos dizer que sim
Digite y e pressione Enter.
O próximo prompt perguntará se você deseja desabilitar o acesso remoto do usuário root.
Aqui existe uma “pegadinha”: ele não está falando do usuário root do sistema (Droplet/Linux), e sim do usuário root do MySQL.
Ou seja:
Mesmo que você desabilite esse acesso, ainda será possível acessar o servidor via SSH normalmente.
O que ficará bloqueado é o login direto com o usuário root do MySQL a partir de ferramentas externas, como MySQL Workbench ou Query Browser no seu computador local.
Essa configuração é uma boa prática de segurança, pois evita que o usuário root do MySQL seja exposto remotamente.
O MySQL por padrão pode trazer alguns banco de dados de teste, vamos agora remove-los:
By default, MySQL 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? (Press y|Y for Yes, any other key for No) :
Digite y e pressione Enter.
A por fim vamos recarregar os privilégios
loading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
Digite y e pressione Enter.
Se tudo der certo você receberá a mensagem:
All done!
Caso você queira testar se tudo foi instalado corretamente, digite sudo mysql a resposta será algo como:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.44-0ubuntu0.24.04.2 (Ubuntu)
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
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>
O prompt acima já é do MySQL. Digite "exit” para sair.
Instalando o PHP
Como eu comentei, é possível rodar o PHP de diversas formas, mas para esse tutorial vamos focar na opção Apache + mod_php.
Execute o seguinte comando:
sudo apt install php libapache2-mod-php php-mysql
Com esse comando vamos instalar o PHP, o mod_php e o conector do MySQL.
Após a instalação você pode confirmar se o PHP foi instalando, digitando:
php -v
Se tudo correu bem, a resposta será algo como:
PHP 8.3.6 (cli) (built: Jan 7 2026 08:40:32) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
Vamos aproveitar e instalar também o Composer:
sudo apt install composer
Uma configuração opcional, mas interessante de se fazer é definir que o arquivo index do Apache será o index.php, com isso ele sempre procurará primeiro um arquivo index.php no diretório e caso não ache ele procurará um index.html, e etc…
Vamos editar o arquivo de configuração com o nano.
sudo nano /etc/apache2/mods-enabled/dir.conf
O conteúdo do arquivo será algo como:
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
Você apenas moverá o index.php para o início da lista, facando:
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
Após a alteração, tecle: CONTROL + O e na sequência pressione Enter, para salvar as alterações. E logo após tecle: CONTROL + X para sair do nano.
Feito isso reinicie o Apache:
sudo systemctl restart apache2
Vamos agora instalar algumas extensões importantes do PHP, sinta-se à vontade para instalar a extensão que ficar mais sentido para a sua instalação, mas para a maioria das aplicações essas abaixo já suprem quase que 100% das necessidades.
sudo apt install php-cli php-common php-curl php-mbstring php-xml php-gd php-bcmath php-intl php-opcache php-zip
Para ver se tudo está funcionando vamos navegar até o diretório root do nosso apache e criar um arquivo .php:
sudo nano /var/www/html/index.php
O conteúdo do arquivo será:
<?php
phpinfo();
Após a alteração, tecle: CONTROL + O e na sequência pressione Enter, para salvar as alterações. E logo após tecle: CONTROL + X para sair do nano.
Acesse: http://IP_DO_SEU_DROPLET/info.php e o resultado será algo como:

Configurando um novo usuário para o MySQL
Para configurar um novo usuário, específico para a sua aplicação, vamos acessar o MySQL em modo sudo.
sudo mysql
E vamos criar um novo usuário executando o comando abaixo:
CREATE USER 'nome_do_usuario'@'%' IDENTIFIED BY 'senha_super_secreta';
GRANT ALL PRIVILEGES ON *.* TO 'nome_do_usuario'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Para testar, saia do MySQL digitando exit. E entre novamente, porém dessa vez sem o sudo:
mysql -u nome_do_usuario -p
Importante!!! Note que no comando anterior eu não informei a senha (ainda), isso é proposital. Você até poderia informar a senha e ele logaria sem problemas, porém sua senha ficaria visível e disponível no history do Ubuntu. Isso não é legal. Da forma como eu digitei, ele vai pedir a senha e você poderá informar de forma “escondida”. Num primeiro momento vai parecer que o Terminal travou, mas não se assuste, digite a senha normalmente e pressione Enter. O Linux faz isso para esconder a sua senha.
Prontinho, o seu Droplet já está com o Apache, PHP e MySQL instalados e configurados, prontos para receber sua aplicação. No próximo post, mostrarei como fazer o Deploy de uma aplicação e como configurar o Virtual host.


