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

https://www.nginx.com

# 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/

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

7 Resultados

  1. Vicente Filho disse:

    O Pacote phpgadmin deixou de existir ?
    mesmo usando apt update e apt install phpgadmin
    diz que não tem maiss disponivel

  2. Fernando Ricardo disse:

    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)

  3. Ricardo disse:

    Obrigado mestre , me ajudou bastante… Seguindo para o zabbix agora.

  1. 3 de dezembro de 2021

    […] – Instalação do Debian 11 Bullseye limpa passo-a-passo – Servidor WEB NGINX + PHP + PostgreSQL + phpPgAdmin + Letsencrypt no Debian 11 Bullseye (LNPP) […]

  2. 21 de fevereiro de 2022

    […] – Instalação do Debian 11 Bullseye limpa passo-a-passo – Servidor WEB NGINX + PHP + PostgreSQL + phpPgAdmin + Letsencrypt no Debian 11 Bullseye (LNPP) […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *