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.com apontando 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 -y Alguns 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 "
  1. " . $row['content'] . "
  2. "; } 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.

Saída do Site de Teste LEMP

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.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.