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
# 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/
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
Se estiver usando debian 10 continuará sendo 7.3
Por isso temos esse outro tutorial:
https://blog.remontti.com.br/5915
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?
Top Rudimar!
Arruma está faltando um “n” no final do comando “http://IP-SERVIDOR/phppgadmi”