LEMP Stack · 14 min read · Oct 21, 2025
Como Instalar a Pilha LEMP (Nginx, PHP e MariaDB) no Debian 12

A pilha LEMP do Linux é um pacote de software popular para desenvolvimento e hospedagem de aplicações web. Ela consiste em quatro componentes principais: Linux, Nginx (pronunciado “Engine-X”), MySQL ou MariaDB (um banco de dados relacional) e PHP (uma linguagem de programação web popular). Neste setup, o Linux é o sistema operacional, e o Nginx é o servidor web que lida com requisições HTTP e serve conteúdo estático como imagens e arquivos .css. O MySQL, ou neste caso, o MariaDB é usado como sistema de banco de dados. O PHP é a linguagem de script usada para gerar conteúdo web e interagir com o banco de dados dinamicamente. Esses componentes formam um ambiente robusto e escalável para construir e implantar sites e aplicações web.
Este guia ensinará você a instalar uma Pilha LEMP em um servidor Debian 12 (bookworm) lançado há poucos dias. Você também aprenderá a instalar aplicações como o phpMyAdmin.
Pré-requisitos
- Um servidor rodando Debian 12.
- Um usuário não-root com privilégios sudo.
- Um nome de domínio totalmente qualificado (FQDN) como
example.comapontando para o servidor. - O Firewall Descomplicado (UFW) está habilitado e em execução.
- Tudo está atualizado.
$ sudo apt update && sudo apt upgrade - Alguns pacotes que seu sistema precisa.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yAlguns desses pacotes podem já estar instalados em seu sistema.
Passo 1 - Configurar o Firewall
O primeiro passo antes de instalar qualquer pacote é configurar o firewall para permitir conexões HTTP e HTTPS.
Verifique o status do firewall.
$ sudo ufw status
Você deve ver algo como o seguinte.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Permita as portas HTTP e HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Verifique o status novamente para confirmar.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Passo 2 - Instalar o PHP
O Debian 12 vem com o PHP 8.2 por padrão. Você pode instalá-lo executando o seguinte comando.
$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd
Instalamos as extensões MySQL, CLI, GD, Mbstring e XML do PHP. Você pode instalar quaisquer extensões extras conforme suas necessidades.
Para sempre ficar na versão mais recente do PHP ou se você quiser instalar várias versões do PHP, adicione o repositório PHP do Ondrej.
Primeiro, importe a chave GPG do repositório PHP do Sury.
$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Adicione o repositório PHP do Ondrej Sury.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Atualize a lista de repositórios do sistema.
$ sudo apt update
Agora, você pode instalar qualquer versão do PHP.
$ sudo apt install php8.1-fpm php8.1-cli
Verifique a versão do PHP instalada.
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
Passo 3 - Instalar o MariaDB
O Debian 12 não vem com o MySQL por padrão e eles ainda não lançaram um pacote oficial para isso. Portanto, usaremos o MariaDB para isso. O MariaDB também não tem um pacote oficial para o Debian 12, mas o Debian vem com ele. Portanto, instale-o usando o seguinte comando.
$ sudo apt install mariadb-server
Verifique a versão do MySQL.
$ mysql --version
mysql Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
Execute o script de instalação segura do MariaDB.
$ sudo mysql_secure_installation
Você será solicitado a fornecer a senha root. Pressione Enter porque não definimos nenhuma senha para isso.
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
Em seguida, você será perguntado se deseja mudar para o método de autenticação de socket Unix. O plugin unix_socket permite que você use suas credenciais do sistema operacional para se conectar ao servidor MariaDB. Como você já tem uma conta root protegida, digite n para prosseguir.
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
Em seguida, você será perguntado se deseja alterar sua senha root. No Debian 12, a senha root está intimamente ligada à manutenção automatizada do sistema, portanto, deve ser deixada em paz. Digite n para prosseguir.
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
Em seguida, você será perguntado sobre certas questões para melhorar a segurança do MariaDB. Digite Y para remover usuários anônimos, proibir logins remotos de root, remover o banco de dados de teste e recarregar as tabelas de privilégios.
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB 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? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB 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? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Você pode entrar no shell do MariaDB digitando sudo mysql ou sudo mariadb na linha de comando.
Passo 4 - Configurar o MariaDB
Faça login no shell do MariaDB.
$ sudo mysql
Crie um banco de dados de exemplo.
MariaDB> CREATE DATABASE exampledb;
Crie uma conta de usuário SQL.
MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';
Conceda todos os privilégios no banco de dados ao usuário.
MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
Como não estamos modificando o usuário root, você deve criar outro usuário SQL para realizar tarefas administrativas que utilizem autenticação por senha. Escolha uma senha forte para este.
MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;
Atualize os privilégios do usuário.
MariaDB> FLUSH PRIVILEGES;
Saia do shell.
MariaDB> exit
Vamos fazer login novamente no shell do MySQL usando o usuário recém-criado.
$ sudo mysql -u exampleuser -p
Crie uma tabela de teste.
MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );
Insira dados de teste.
MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");
Repita o comando acima várias vezes para adicionar mais entradas. Execute o seguinte comando para verificar o conteúdo da tabela.
MariaDB> SELECT * FROM exampledb.name_list;
Você receberá a seguinte saída.
+-----+---------+
| sno | content |
+-----+---------+
| 1 | Navjot |
| 2 | Adam |
| 3 | Josh |
| 4 | Peter |
+-----+---------+
4 rows in set (0.00 sec)
Saia do shell do MySQL.
MariaDB> exit
Passo 5 - Instalar o Nginx
O Debian 12 vem com uma versão mais antiga do Nginx. Para instalar a versão mais recente, você precisa baixar o repositório oficial do Nginx.
Importe a chave de assinatura do Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Adicione o repositório para a versão estável do Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Atualize os repositórios do sistema.
$ sudo apt update
Instale o Nginx.
$ sudo apt install nginx
Verifique a instalação. Em sistemas Debian, o seguinte comando só funcionará com sudo.
$ sudo nginx -v
nginx version: nginx/1.24.0
Inicie o Nginx.
$ sudo systemctl start nginx
Verifique o status do serviço.
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago
Docs: https://nginx.org/en/docs/
Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 2258 (nginx)
Tasks: 2 (limit: 1108)
Memory: 1.8M
CPU: 6ms
CGroup: /system.slice/nginx.service
??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??2259 "nginx: worker process"
Passo 6 - Configurar o PHP-FPM
Abra php.ini para edição.
$ sudo nano /etc/php/8.2/fpm/php.ini
Para definir os tamanhos de upload de arquivos, altere os valores das variáveis upload_max_filesize e post_max_size.
upload_max_filesize = 50M
...
post_max_size = 50M
Configure o limite de memória do PHP dependendo dos recursos e requisitos do seu servidor.
memory_limit = 256M
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Você também pode usar os seguintes comandos para fazer as edições sem precisar abrir o arquivo.
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini
Abra o arquivo /etc/php/8.0/fpm/pool.d/www.conf.
$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Precisamos definir o usuário/grupo Unix dos processos PHP como nginx. Encontre as linhas user=www-data e group=www-data no arquivo e altere-as para nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = nginx
group = nginx
...
Além disso, encontre as linhas listen.owner=www-data e listen.group=www-data no arquivo e altere-as para nginx.
listen.owner = nginx
listen.group = nginx
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o processo PHP-fpm.
$ sudo systemctl restart php8.2-fpm
Passo 7 - Instalar o phpMyAdmin
Baixe o arquivo de arquivo do phpMyAdmin para o idioma inglês. Pegue o link para a versão mais recente na página de Download do phpMyAdmin.
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz
Crie um diretório público para o site.
$ sudo mkdir /var/www/html/example.com -p
Extraia o arquivo para o diretório público.
$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com
Mude para o diretório público.
$ cd /var/www/html/example.com
Renomeie o diretório extraído para algo obscuro para melhorar a segurança.
$ sudo mv phpMyAdmin-5.2.1-english sm175
Passo 8 - Configurar o phpMyAdmin
Copie o arquivo de configuração de exemplo.
$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php
Abra o arquivo de configuração para edição.
$ sudo nano sm175/config.inc.php
Encontre a linha $cfg['blowfish_secret'] = ''; e insira uma string aleatória de 32 caracteres para autenticação baseada em cookie.
Você pode usar o gerador de blowfish online do phpSolved ou fazer isso via linha de comando.
Copie o valor e cole-o como mostrado.
$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Altere a propriedade do site e do phpMyAdmin para o servidor Nginx.
$ sudo chown -R nginx:nginx /var/www/html/example.com
Exclua o diretório de configuração do phpMyAdmin.
$ sudo rm -rf /var/www/html/example.com/sm175/setup
Passo 9 - Configurar o Opcache
O Opcache é o sistema de cache do PHP. Ele funciona salvando o bytecode do script pré-compilado na memória, para que toda vez que um usuário visita uma página, ela carregue mais rápido. O Opcache é instalado por padrão. Para verificar, confira a versão do PHP.
$ php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
Isso nos diz que o Opcache está instalado e disponível. Caso não apareça aqui, você pode instalá-lo manualmente executando o seguinte comando.
$ sudo apt install php-opcache
Para alterar as configurações do Opcache, abra o arquivo /etc/php/8.2/fpm/conf.d/10-opcache.ini para edição.
$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
As seguintes configurações devem ajudá-lo a começar a usar o Opcache e são geralmente recomendadas para um bom desempenho. Você pode habilitá-lo adicionando as seguintes linhas no final.
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o PHP-FPM.
$ sudo systemctl restart php8.2-fpm
Passo 10 - Instalar o Certbot para SSL
Precisamos instalar o Certbot para gerar certificados SSL gratuitos oferecidos pelo Let’s Encrypt.
Você pode instalar o Certbot usando o repositório do Debian ou pegar a versão mais recente usando a ferramenta Snapd. Usaremos a versão Snapd.
O Debian 12 não vem com o Snapd instalado. Instale o pacote Snapd.
$ sudo apt install snapd
Execute os seguintes comandos para garantir que sua versão do Snapd esteja atualizada.
$ sudo snap install core
$ sudo snap refresh core
Instale o Certbot.
$ sudo snap install --classic certbot
Use o seguinte comando para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifique se o Certbot está funcionando corretamente.
$ certbot --version
certbot 2.6.0
Passo 11 - Testar um site de demonstração
Criar o site
Crie e abra uma página de teste para edição.
$ sudo nano /var/www/html/example.com/index.php
Cole o seguinte código nela.
Lista de Membros";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "- " . $row['content'] . "
";
}
echo "
";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "
";
die();
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Criar um Certificado SSL
Execute o seguinte comando para gerar um Certificado SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
O comando acima fará o download de um certificado para o diretório /etc/letsencrypt/live/example.com em seu servidor.
Gere um certificado de grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Verifique o serviço agendador de renovação do Certbot.
$ sudo systemctl list-timers
Você encontrará snap.certbot.renew.service como um dos serviços agendados para execução.
NEXT LEFT LAST PASSED UNIT ACTIVATES
.....
Sun 2023-02-26 06:32:00 UTC 9h left Sat 2023-02-25 18:04:05 UTC 2h 59min ago snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-02-26 06:43:20 UTC 9h left Sat 2023-02-25 10:49:23 UTC 10h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2023-02-26 09:00:06 UTC 11h left Sat 2023-02-25 20:58:06 UTC 5min ago apt-daily.timer apt-daily.service
Faça um teste do processo para verificar se a renovação do SSL está funcionando bem.
$ sudo certbot renew --dry-run
Se você não ver erros, está tudo pronto. Seu certificado será renovado automaticamente.
Configurar o Nginx
Crie e abra o arquivo /etc/nginx/conf.d/example.conf para edição.
$ sudo nano /etc/nginx/conf.d/example.conf
Cole o seguinte código nele.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
root /var/www/html/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Pass PHP Scripts To FastCGI Server
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #depends on PHP versions
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Abra o arquivo /etc/nginx/nginx.conf para edição.
$ sudo nano /etc/nginx/nginx.conf
Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Verifique sua configuração do Nginx.
$ sudo nginx -t
Se você não ver erros, significa que está tudo pronto. Inicie o servidor Nginx.
$ sudo systemctl start nginx
Carregue seu site visitando https://example.com em seu navegador e você verá a seguinte página.

Você pode acessar sua instalação do phpMyAdmin visitando a URL https://example.com/sm175 em seu navegador. Você pode inserir seu usuário administrativo ou o usuário criado anteriormente para fazer login.
Conclusão
Isso conclui nosso tutorial onde você aprendeu como configurar uma pilha LEMP em um servidor Debian 12 e criou um site de demonstração. Se você tiver alguma dúvida, poste nos comentários abaixo.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.