Servidor WEB NGINX + PHP + PostgreSQL + phpPgAdmin + Letsencrypt no Debian 11 Bullseye (LNPP)
Neste tutorial vamos configurar um servidor web com NGINX (lê-se “engine x”), o concorrente do Apache. NGINX é um servidor web (HTTP e IMAP/POP3/Proxy) rápido, leve e com inúmeras possibilidades de configuração para melhor performance. O Apache, sem dúvidas, é o servidor web mais popular. No entanto, o NGINX a cada ano ganha mais popularidade e está sendo a preferência dos novos projetos. Também estarei instalando o banco de dados PostgreSQL e phpPgAdmin como gerenciador web.
Distribuição utilizada: Debian 11 Bullseye / Instalação Limpa
NGINX 1.18
# apt install nginx
Acesse agora em seu navegador http://IP-SERVIDOR/
Se você acessar um diretório que não existe um erro dizendo que não existe, e junto informações que não é legal aparecer.
Vamos remover assinatura do nginx onde ele exibe a versão do mesmo. Ninguém precisa saber! Correto?
# sed -i 's/# server_tokens/server_tokens/' /etc/nginx/nginx.conf # systemctl restart nginx
Pronto nosso NGINX está rodando!
PostgreSQL
# apt install postgresql postgresql-contrib
Torne-se o usuário postgres, para poder criar o banco de dados.
# su - postgres
Execute para entrar no terminal de comandos do banco.
$ psql
Para definir a senha do usuário postgres e instalar o adminpack.
postgres=# \password postgres Digite nova senha para postgres: Digite-a novamente: postgres=# CREATE EXTENSION adminpack; CREATE EXTENSION postgres=# \q $ exit
Ajustes no pg_hba.conf, assim toda alteração será necessaria validação do postgres com a senha que acabou de definir.
# vim /etc/postgresql/13/main/pg_hba.conf
Altere as seguintes linhas:
local all postgres peer local all all peer
Para:
local all postgres md5 local all all md5
Reinicie o postgres
# systemctl restart postgresql
Volte para o postgres
# su - postgres
Agora para toda ação será necessário autenticar.
$ psql Senha para usuário postgres: !!SUA_SENHA!! psql (13.4 (Debian 13.4-0+deb11u1)) Type "help" for help. postgres-# \q
Para demonstração irei criar um banco/usuário teste, não esqueça de alterar a senha.
$ createuser --pwprompt teste Digite a senha para a nova role: << NOVA SENHA PARA O USUÁRIO TESTE Digite-a novamente: << REPITA Senha: << SENHA DO QUE SETOU ANTES NO COMANDO "\password postgres"
Agora crie o banco e vincule ao usuário.
$ createdb -O teste meubd Senha: <<< SENHA DO POSTGRES
Verifique se o mesmo foi criado.
$ psql -l Senha para usuário postgres: Lista dos bancos de dados Nome | Dono | Codificação | Collate | Ctype | Privilégios de acesso -----------+----------+-------------+-------------+-------------+----------------------- meubd | teste | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 | .... ....
Acessamos agora o bd teste.
$ psql -U teste -d meubd Senha para usuário postgres: psql (11.11 (Debian 11.11-0+deb10u1)) Digite "help" para ajuda. meubd=>
Vamos fazer uma "brincadeira" só para testar, criaremos uma tabela e inseriremos dados nela.
meubd=> CREATE TABLE doacao ( id int,nome text, valor text ); meubd=> INSERT INTO doacao (id,nome,valor) values (1,'Rudimar Remontti','R$ 5,00'); meubd=> SELECT * FROM doacao; id | nome | valor ----+------------------+--------- 1 | Rudimar Remontti | R$ 5,00 meubd=> \q
Se deseja remover o banco/usuário teste.
$ dropdb meubd Senha: << SENHA DO POSTGRES $ dropuser teste Senha: << SENHA DO POSTGRES
Volte para root
$ exit
PHP 7.4
Incluirei algumas extensões do PHP que são normalmente utilizada também na instalação.
# apt install php php-{fpm,cli,mysql,pear,gd,gmp,bcmath,mbstring,curl,xml,zip,json,pgsql}
Agora vamos fazer a "integração" do PHP com o NGINX. Moveremos o arquivo defaul.
# mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.original
Crie um novo:
# vim /etc/nginx/sites-available/default
Ajuste:
server { listen 80; listen [::]:80; root /var/www/html; index index.php index.html index.htm; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } }
Teste a configuração se não tem nada errado e restart os serviços:
# nginx -t # systemctl restart nginx php7.4-fpm
Vamos criar um arquivo em PHP para testa se nosso NGINX está interpretando o PHP.
# echo '<?php phpinfo();' >> /var/www/html/teste.php
Acesse em seu navegador http://IP-SERVIDOR/teste.php
🙂 Nosso servidor WEB com PHP está funcionando!
Exemplo para multiplos domínios/subdomínios
# vim /etc/nginx/sites-available/sub1.conf
Neste ex: vou representar o sub1.remontti.com.br
server { listen 80; listen [::]:80; root /var/www/sub1; index index.php index.html index.htm; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; server_name sub1.remontti.com.br; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } }
# vim /etc/nginx/sites-available/sub2e3.conf
Neste ex: vou representar o sub2.remontti.com.br e sub3.remontti.com.br
server { listen 80; listen [::]:80; root /var/www/sub2e3; index index.php index.html index.htm; server_name sub2.remontti.com.br sub3.remontti.com.br; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } }
Link os arquivos no diretório "/etc/nginx/sites-available" que será carregado as novas configurações
# ln -s /etc/nginx/sites-available/sub1.conf /etc/nginx/sites-enabled/ # ln -s /etc/nginx/sites-available/sub2e3.conf /etc/nginx/sites-enabled/
Crie os diretórios referente a cada server_name.
# mkdir /var/www/sub1 # mkdir /var/www/sub2e3 # echo '<?php echo "Olá mundo do sub1!"; ?>' >> /var/www/sub1/index.php # echo '<?php echo "Olá mundo do sub2e3!"; ?>' >> /var/www/sub2e3/index.php
Verifique se não tem nenhum erro e reinicie o serviço:
# nginx -t # systemctl restart nginx
phpPgAdmin
O phppgadmin finalmente foiu atualizado para uma versão recente no repositório então iremos insta-lo via apt.
# apt install phppgadmin
Ajustes no config.inc.php
# vim /usr/share/phppgadmin/conf/config.inc.php
Localize as linhas e ajuste:
$conf['extra_login_security'] = false; $conf['owned_only'] = true;
Para torna-lo acessível altere o arquivo de configuração do seu NGINX, no exemplo vou colocar no arquivo default, mas você poderia estar configurando em seus domínios.
# vim /etc/nginx/sites-available/default
Adicione as linhas destacadas:
server { listen 80; listen [::]:80; root /var/www/html; index index.php index.html index.htm; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } location ^~ /phppgadmin { root /usr/share; try_files $uri $uri/ =404; #allow 192.168.87.0/24; #allow 2001:0db8::/32; #deny all; #error_page 403 http://www.remontti.com.br; location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } } }
Se deseja tonar o phppgadmin acessível apenas de alguns endereços IPs (RECOMENDO) basta descomentar as linhas, e incluir seus prefixos. O error_page é para que quando a o acessante levar um proibido seja direcionado para um site.
allow 192.168.87.0/24; allow 2001:0db8::/32; deny all; error_page 403 http://www.remontti.com.br;
Verifique se não tem nenhum erro e reinicie o serviço:
# nginx -t # systemctl restart nginx
Basta acessar http://IP-SERVIDOR/phppgadmin
:: Let's Encrypt ::
Criando certificado grátis para seus sub/domínios.
# apt install certbot python3-certbot-nginx
Para gerar o certificado use o comando:
# certbot
Não esqueça de colocar no seu cron para ele renovar o certificado, pois a cada 90 ele expira. Neste exemplo todo dia primeiro tento renovar.
# certbot -q renew
Dica, se desejar desativar o TLS1.0 e TLS1.1 após criar um certificado um arquivo é criado /etc/letsencrypt/options-ssl-apache.conf, então edite e inclua no SSLProtocol TLSv1 -TLSv1.1
# vim /etc/letsencrypt/options-ssl-nginx.conf
Ficando
#ssl_protocols all -SSLv2 -SSLv3 ssl_protocols all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
Reinicie o Neginx:
# systemctl restart nginx
Para testar acesse: https://www.cdn77.com/tls-test/
Gostou?
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Fontes: https://docs.nginx.com/
https://docs.nginx.com/nginx/admin-guide/web-server/web-server/
O Pacote phpgadmin deixou de existir ?
mesmo usando apt update e apt install phpgadmin
diz que não tem maiss disponivel
Irmão
vc merece um pix
Eu já fiz esse script umas 10x e não funcionou como deveria 😅 Creio que algo poderia ter atualizado e/ou faltando algo no decorrer do passo a passo. Por exemplo, Servidor NGINX e Apache dando conflito, Let’s Encrypt nao funcionou, phpPgAdmin nao foi reconhecido na servidor.
pois eu ja fiz 10 X tb e todas deram certo.. acredito amigo que esta pulando algum passo, ou esquecendo de algo.
EX:
1- se usa o NGINX não precisa do apache, portanto nao tem como dar conflito( visto que ele nao pediu a instalacao do apache em nenhum momento)
2 – pro lets encrypt funcionar vc precisa ter acesso direto ao servidor a partir da internet( tem que ter os rediirecionamentos corretos no seu roteador ou na sua rede( isso é implícito pois o servidor está sendo feito para este tipo de acesso direto externo)
Obrigado mestre , me ajudou bastante… Seguindo para o zabbix agora.