Ubuntu 18.04 Server: instalar e configurar Nginx, PHP e MariaDB
Para usar Nginx, PHP-FPM e MariaDB juntos no Ubuntu 18.04, você precisa instalar cada pacote, encaminhar as requisições PHP do Nginx para o socket do PHP-FPM e, em seguida, configurar o banco de dados com contas separadas. O exemplo abaixo é apenas uma prática local que não altera sites existentes, e não utiliza a conta root do banco de dados para aplicações web.
Escopo da Prática e Preparação
O suporte de segurança geral para o Ubuntu 18.04 terminou. Verifique se a Manutenção de Segurança Estendida (ESM) do Ubuntu Pro está aplicada e o alcance do suporte para cada pacote em Ubuntu Security Maintenance Schedule, e é recomendável construir novos ambientes de operação com versões suportadas. Este artigo usa PHP 7.2 do repositório padrão como exemplo para entender um servidor 18.04 existente.
Prepare um servidor de teste separado com privilégios de administrador e acesso ao repositório. O Nginx lida com as requisições web, o PHP-FPM (FastCGI Process Manager) executa o código PHP, e o MariaDB armazena os dados. Os exemplos são recebidos apenas em 127.0.0.1:8080, portanto não é possível acessá-los diretamente de fora do servidor. Para acesso à internet pública, são necessários firewall separado, domínio, certificado TLS e revisão de segurança.
Em servidores com serviços ou dados existentes, prepare procedimentos de backup e recuperação antes de fazer alterações. Se os caminhos de prática, contas, nomes de banco de dados ou a porta 8080 abaixo já estiverem em uso, não prossiga como está; use um ambiente de teste separado. Você pode verificar o uso da porta com o seguinte comando. Se não houver saída, não há um listener TCP para essa porta.
sudo ss -lntp | grep ':8080 '
Instalação de pacotes e verificação de serviços
A instalação dos pacotes pode iniciar automaticamente o site padrão do Nginx, que pode escutar na porta 80. Limitar o site de teste à porta local 8080 não restringe o site padrão. Isole o servidor de teste com controles de rede e firewall antes da instalação e verifique o impacto nos serviços existentes.
Após atualizar a lista de pacotes, instale o Nginx, PHP 7.2 FPM com driver MySQL, servidor MariaDB e curl para verificação. Se os pacotes não puderem ser utilizados devido a problemas de repositório ou suporte, resolva os erros antes de prosseguir.
sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl
Após a instalação, verifique o status do serviço e o socket do PHP-FPM usando os seguintes comandos. Se o serviço não estiver em execução, identifique a causa e inicie o serviço. Se o caminho do socket for diferente, ajuste a configuração do Nginx abaixo para corresponder ao caminho real.
systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/
Verifique se cada um dos três serviços está active. Se php7.2-fpm.sock não existir, verifique a causa em systemctl status php7.2-fpm e os logs do serviço. Quando a versão do PHP for diferente, você deve alterar tanto o pacote quanto o caminho do socket juntos.
Conexão entre Nginx e PHP-FPM
Crie um novo diretório de prática e arquivo de configuração. Não sobrescreva /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo ou /etc/nginx/sites-enabled/lnmp-demo se eles já existirem. Execute os comandos de edição abaixo após confirmar que não há nenhum caminho existente em um servidor limpo.
sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo
Salve o seguinte bloco completo de servidor no editor. fastcgi_pass deve corresponder ao socket PHP-FPM confirmado anteriormente. snippets/fastcgi-php.conf é um trecho de configuração do pacote Nginx do Ubuntu; se o arquivo não existir, verifique as configurações FastCGI na distribuição.
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/lnmp-demo;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Ative e verifique o arquivo de configuração. Recarregue apenas se nginx -t for bem-sucedido. Se falhar, verifique e corrija erros, portas e caminhos de soquete, e então verifique novamente. Se ocorrer um problema, remova apenas os links simbólicos criados nesta prática, depois verifique e recarregue para manter a configuração existente do site.
sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx
As conexões FastCGI do Nginx também podem ser verificadas em Guia Oficial do Nginx.
Verifique a Execução do PHP
Verifique se não há nenhum arquivo no caminho abaixo e crie um novo arquivo. Salve o código abaixo em seu editor.
sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";
Execute o seguinte comando no mesmo servidor. Se PHP is working e SAPI: fpm-fcgi aparecerem, o Nginx executou o código através do PHP-FPM. Se o código PHP for exibido como está, a configuração não foi aplicada, então não exponha o arquivo de teste e verifique as configurações do FastCGI novamente.
curl http://127.0.0.1:8080/
Se houver um erro 502, verifique o serviço PHP-FPM, o caminho do socket e as permissões; se houver um erro 404, verifique o diretório de documentos e o caminho do arquivo. Não exponha a página phpinfo() que divulga configurações detalhadas do servidor.
Banco de Dados MariaDB e Conta Separada
A autenticação do administrador MariaDB depende do método de instalação. Se a autenticação de socket local estiver configurada, você pode abrir o console de gerenciamento com o seguinte comando. Se falhar, verifique o método de autenticação de administrador existente. MYSQL_HISTFILE=/dev/null especifica que esta sessão do cliente não deve deixar um arquivo de histórico de comandos.
sudo env MYSQL_HISTFILE=/dev/null mysql
O seguinte é SQL para criar um novo banco de dados de prática e uma conta apenas local. Se o mesmo nome já existir, não modifique a entrada existente; use um nome diferente. Antes da execução, substitua CHANGE_ME_STRONG_PASSWORD por uma senha longa e exclusiva, e assegure-se de que quaisquer aspas ou barras invertidas na string SQL estejam devidamente escapadas.
CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;
Esta conta de exemplo possui permissões apenas de leitura no banco de dados. Se um aplicativo real precisar de permissões de escrita ou de alteração de esquema, conceda apenas as permissões necessárias separadamente. Não modifique diretamente o plugin de autenticação da conta admin nem conceda privilégios de root ao aplicativo web. Para mais detalhes sobre contas e autenticação, consulte a documentação CREATE USER do MariaDB.
Verifique se a nova conta consegue se conectar localmente. Não digite a senha diretamente na linha de comando; insira-a quando solicitado. Após conectar, executar SELECT DATABASE(), CURRENT_USER(); exibirá o banco de dados e as contas autenticadas. Saia do console usando EXIT;.
mysql -u lnmp_demo -p lnmp_demo
Verifique a conexão com o banco de dados em PHP
O seguinte é um método de verificação temporário usando a conta criada acima. Mantenha as credenciais fora do diretório de documentos web. Se /etc/lnmp-demo já existir, não o substitua; use um ambiente de teste separado. Isso assume a configuração padrão onde o PHP-FPM é executado sob o grupo www-data.
sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php
Insira o seguinte conteúdo no arquivo e substitua a senha pelo valor definido para a conta do banco de dados. Se houver aspas ou barras invertidas na string PHP, escape-as corretamente. Como outros aplicativos executando com as mesmas permissões www-data também podem ler o arquivo, isolamento separado é necessário em servidores compartilhados.
<?php
return array(
'user' => 'lnmp_demo',
'password' => 'CHANGE_ME_STRONG_PASSWORD',
);
Certifique-se de que /var/www/lnmp-demo/db-check.php não exista e salve o seguinte código. Indique apenas o sucesso ou falha para evitar expor mensagens de erro ou senhas na resposta da web.
sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
$db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
$config['user'], $config['password'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Database connection OK\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php
Se HTTP 200 e Database connection OK aparecerem, a conexão PHP com o MariaDB foi bem-sucedida. Se falhar, verifique a extensão PHP MySQL, o status do serviço, a autenticação por socket e a conta/senha. Após a verificação, remova com segurança os arquivos PHP temporários e os arquivos de credenciais, e limpe as contas e bancos de dados de prática que não são mais necessários, verificando tanto os alvos reais quanto os backups.
Antes de aplicar ao ambiente de produção
A configuração prática é para verificação de conexão local. Antes de tornar os serviços reais públicos, migre para versões suportadas de OS e PHP, e configure o nome do servidor Nginx e a raiz do documento, certificados HTTPS, firewall e regras de rede em nuvem de acordo com o ambiente. Você também precisa revisar o escopo de upload/execução de arquivos PHP, separação de usuários do FPM e acesso à rede, backup e recuperação do MariaDB.
A ferramenta de configuração de segurança do MariaDB é fornecida como mysql_secure_installation ou mariadb-secure-installation dependendo da versão instalada. Como pode afetar serviços existentes, leia cada pergunta e escolha de acordo com seu ambiente. Itens detalhados podem ser encontrados em Descrição da Ferramenta de Configuração de Segurança do MariaDB.




