Instalar uma stack LEMP num VPS Linux com AlmaLinux 9

2 min
Alojamento VPS/VDS

Uma stack LEMP (Linux, Nginx, MariaDB, PHP-FPM) é uma alternativa rápida e leve ao Apache para servir sites PHP. No AlmaLinux 9, tudo vem do repositório oficial AppStream, mas o SELinux e o firewalld exigem alguma atenção. Este guia acompanha-o numa instalação limpa no seu VPS Linux Infrawire; os mesmos passos funcionam no Rocky Linux 9.

📋 Pré-requisitos

  • Um VPS KVM com AlmaLinux 9 (o IP e a palavra-passe root estão na sua área de cliente)
  • Acesso SSH como root
  • Um domínio example.com a apontar para VPS_IP

1. Atualizar o sistema e instalar as ferramentas

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

O policycoreutils-python-utils fornece o semanage, usado na secção do SELinux.

2. Instalar o Nginx e abrir a firewall

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

3. Instalar o MariaDB

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

Responda ao assistente para definir a palavra-passe do root, remover os utilizadores anónimos, proibir o login remoto do root e eliminar a base de dados de teste. Depois crie uma base de dados e um utilizador dedicados:

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. Instalar o PHP 8.3 a partir do módulo AppStream

O AppStream oferece vários fluxos de PHP. Escolha o pretendido antes de instalar:

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

Por predefinição, o pool do PHP-FPM corre como apache. Como o Nginx corre como nginx, alinhe o pool e as diretorias de sessões:

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

O pool escuta no socket Unix /run/php-fpm/www.sock.

5. Criar o server block

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. Configurar o SELinux

Mantenha o SELinux em modo enforcing (getenforce). Os ficheiros criados em /var/www já recebem a etiqueta httpd_sys_content_t, mas os movidos com mv de outro local mantêm a antiga. Reetiquete-os e conceda escrita apenas às diretorias que precisam:

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

Ative os booleanos apenas se a sua aplicação precisar deles:

Bash
# O PHP liga-se a uma base de dados por TCP (servidor remoto ou 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # O PHP ou o Nginx fazem ligações de saída (APIs, proxy_pass para uma aplicação) setsebool -P httpd_can_network_connect 1

Um MariaDB local acedido pelo seu socket não precisa de nenhum deles. Para ver o que o SELinux bloqueia, execute ausearch -m avc -ts recent. Nunca "resolva" um problema com setenforce 0.

7. Testar o PHP e apagar o ficheiro de teste

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

Espere HTTP/1.1 200 OK. A página phpinfo() revela a sua configuração, por isso remova-a de imediato. Por fim, verifique os serviços:

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ Resolução de problemas

502 Bad Gateway. O PHP-FPM está parado ou o caminho do socket em fastcgi_pass está errado. Execute systemctl status php-fpm, verifique ls -l /run/php-fpm/www.sock e leia /var/log/nginx/error.log. Se o registo indicar Permission denied no socket, procure uma recusa AVC com ausearch.

403 Forbidden ou Permission denied. Verifique o proprietário (nginx:nginx) e a etiqueta SELinux com ls -Z /var/www/example.com/public. Deve ser httpd_sys_content_t; se não for, execute restorecon -Rv.

"File not found." ou página em branco. O caminho root ou a linha SCRIPT_FILENAME está incorreto. Verifique ambos e depois nginx -t.

Não consegue ligar a uma base de dados ou API externa. O SELinux bloqueia por predefinição as ligações de saída: ative httpd_can_network_connect_db ou httpd_can_network_connect como indicado acima.


🎉 Nginx, MariaDB e PHP-FPM estão a funcionar no AlmaLinux 9, com o SELinux ainda em modo enforcing.

Fique a par das últimas ofertas, descontos e promoções especiais.

Ver promoções

Utilizamos cookies

Utilizamos cookies analíticos para melhorar a sua experiência no nosso site. Nenhum dado é vendido a terceiros. Saiba mais na nossa política de privacidade.