Servidor WEB NGINX + PHP + PostgreSQL + phpPgAdmin + Letsencrypt no Debian 10 Buster (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 10 Stretch / Instalação Limpa

NGINX

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/11/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 (11.11 (Debian 11.11-0+deb10u1))
Digite "help" para ajuda.
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
$ dropuser teste

Volte para root

$ exit

PHP7

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.3-fpm.sock;
    }
}

Teste a configuração se não tem nada errado e restart os serviços:

# nginx -t
# systemctl restart nginx php7.3-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;

    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.3-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;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-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 até pode ser instalado via apt, porém seu empacotamento esta na versão 5, vou baixar a versão mais recente direta do https://github.com/phppgadmin/phppgadmin/releases hoje (abril 2021) na versão 7.13.0

# apt install wget 
# cd /tmp/
# wget https://github.com/phppgadmin/phppgadmin/releases/download/REL_7-13-0/phpPgAdmin-7.13.0.tar.gz
# tar vxf phpPgAdmin-7.13.0.tar.gz
# mv /tmp/phpPgAdmin-7.13.0 /usr/share/phppgadmin

Ajustes no config.inc.php

# vim /usr/share/phppgadmin/conf/config.inc.php

Localize as linhas e ajuste:

$conf['servers'][0]['host'] = 'localhost';
$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;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-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.3-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

LETSENCRYPT

Criando certificado valido para nossos domínios.

# apt install letsencrypt python-certbot-nginx

Tenha seu(s) domínio(s) configurado em /etc/nginx/sites-enabled/

# letsencrypt

Retorno do questionário:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): dev@null.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: sub1.remontti.com.br
2: sub2.remontti.com.br   << CASO VOCÊ TENHA MAIS DE UM SUB CONFIGURADO
3: sub3.remontti.com.br    << IRÁ APARECER AQUI 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1 << ESCOLHA QUAIS VC DESEJA
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for sub1.remontti.com.br
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/sub1.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 << SE QUISER FORCAR SEMPRE HTTPS
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/sub1.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled
https://sub1.remontti.com.br

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=sub1.remontti.com.br
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sub1.remontti.com.br/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sub1.remontti.com.br/privkey.pem
   Your cert will expire on 2021-07-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Você pode também criar o certificado diretamente para um domínio.

# letsencrypt --authenticator standalone --installer nginx -d sub1.remontti.com.br

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-apache.conf

Ficando

#SSLProtocol            all -SSLv2 -SSLv3
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

Reinicie o Apache:

# systemctl restart apache2

Para testar acesse: https://www.cdn77.com/tls-test/

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.

# echo '00 00   1 * *   root    /usr/bin/certbot -q renew' >> /etc/crontab
# systemctl restart cron

Caso não renovar apenas rode o comando letsencrypt novamente.

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...

5 Resultados

  1. Vicente Filho disse:

    A fim de ajudar aos que estão tendo problemas na hora de testar o php, Lembre-se que na ultima update, agora não é mais a Versão 7.3
    e sim 7.4.
    então onde você ver os exemplos do Rudmiar ai no passo a passo, lembre-se de subistituir. por exemplo, na linha:

    nano /etc/nginx/sites-available/default
    substitua: fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    por: fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

    e no restart do serviço:
    systemctl restart nginx php7.3-fpm.service

    substitua por:
    systemctl restart nginx php7.4-fpm.service

    se tiver mais, altere conforme for observando a diferença entre php7.3 por php7.4
    Beleza?
    espero ter ajudado aos demais

  2. Léo de Oliveira Camargo disse:

    Como redireciono um dominio para a uma porta diferente, EX tenho tenho dois servidores web no mesmo server, um na porta 80 outro na 8080?

  3. Maurício Venzi disse:

    Top Rudimar!

    Arruma está faltando um “n” no final do comando “http://IP-SERVIDOR/phppgadmi”

  1. 16 de abril de 2021

    […] Debian 10 instalação limpa * Servidor WEB NGINX + PHP + PostgreSQL + phpPgAdmin + Letsencrypt (Opcional phpPgAdmin + […]

Deixe um comentário

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