Ainda não tem os certificados Wildcard?
Então crie os seus Wildcard Grátis
Pesquisando no Google vamos encontrar diversas referências.
Qual a melhor para você?
Apesar de o nginx estar disponível em praticamente todas as distros, provavelmente não é a última versão estável. Então vamos primeiramente instalar o nginx seguindo os tutoriais direto da fonte https://nginx.org/en/linux_packages.html
PS.: TODOS os comandos abaixo foram executados como
root
, então já sabe né: sudo su -
apt-get install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| tee /etc/apt/preferences.d/99nginx
apt-get update
apt-get -y install nginx
PS: No vídeo eu tropecei e não consegui mostrar as versões disponíveis nos repositórios:
apt-cache show nginx | grep -E "(Package|Version|Maintainer)"
Package: nginx
Version: 1.24.0-1~jammy
Maintainer: NGINX Packaging <[email protected]>
Package: nginx
Version: 1.22.1-1~jammy
Maintainer: NGINX Packaging <[email protected]>
Package: nginx
Version: 1.22.0-1~jammy
Maintainer: NGINX Packaging <[email protected]>
Package: nginx
Version: 1.20.2-1~jammy
Maintainer: NGINX Packaging <[email protected]>
Package: nginx
Version: 1.18.0-6ubuntu14.3
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian Nginx Maintainers <[email protected]>
Package: nginx
Version: 1.18.0-6ubuntu14
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian Nginx Maintainers <[email protected]>
Conferindo a versão instalada
nginx -version
nginx version: nginx/1.24.0
Conferindo os arquivos instalados
dpkg -L nginx
/.
/etc
/etc/default
/etc/default/nginx
/etc/default/nginx-debug
/etc/init.d
/etc/init.d/nginx
/etc/init.d/nginx-debug
/etc/logrotate.d
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/nginx-debug.service
/lib/systemd/system/nginx.service
/usr
/usr/lib
/usr/lib/nginx
/usr/lib/nginx/modules
/usr/sbin
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share
/usr/share/doc
/usr/share/doc/nginx
/usr/share/doc/nginx/CHANGES.ru.gz
/usr/share/doc/nginx/README
/usr/share/doc/nginx/changelog.Debian.gz
/usr/share/doc/nginx/changelog.gz
/usr/share/doc/nginx/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/nginx
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var
/var/cache
/var/cache/nginx
/var/log
/var/log/nginx
/etc/nginx/modules
Sempre é bom fazer um backup dos arquivos originais antes de alterá-los:
tar czvf nginx-original.tgz /etc/nginx/
Esse template-nginx-reverse.tgz foi baseado em https://www.nginx.com/resources/wiki/start/topics/examples/full/
wget https://wiki.tiozaodolinux.com/template-nginx-reverse.tgz
Agora vamos descompactar esse template:
# Vamos dar uma olhada antes de descompactar
tar tzvf template-nginx-reverse.tgz
etc/nginx/cache.conf
etc/nginx/force-ssl.conf
etc/nginx/header.conf
etc/nginx/nginx.conf
etc/nginx/proxy.conf
etc/nginx/ssl-ciphers.conf
etc/nginx/conf.d/default.conf
etc/nginx/conf.d/reverse-proxy.conf
# Agora sim, vamos descompactar esses arquivos nos seus devidos lugares
tar xzvf template-nginx-reverse.tgz -C /
Arquivo principal de configuração do Nginx
vim /etc/nginx/nginx.conf
# nginx.conf baseado em https://www.nginx.com/resources/wiki/start/topics/examples/full/
########################################################################################
user nginx;
# Set number of worker processes automatically based on number of CPU cores.
worker_processes auto;
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
worker_rlimit_nofile 8192;
pid /var/run/nginx.pid;
events {
# The maximum number of simultaneous connections that can be opened by
# a worker process.
worker_connections 1024;
}
http {
# Includes mapping of file name extensions to MIME types of responses
# and defines the default type.
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Don't tell nginx version to the clients. Default is 'on'.
server_tokens off;
# Sendfile copies data between one FD and other from within the kernel,
# which is more efficient than read() + write(). Default is off.
sendfile on;
sendfile_max_chunk 1m;
# Causes nginx to attempt to send its HTTP response head in one packet,
# instead of using partial frames. Default is 'off'.
tcp_nopush on;
server_names_hash_bucket_size 128; # this seems to be required for some vhosts
#keepalive_timeout 65;
# Enable gzipping of responses.
gzip on;
gzip_disable "msie6";
gzip_min_length 10;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 9;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
root /var/www/html;
index index.html;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
ssl_certificate /etc/letsencrypt/live/tiozaodolinux.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tiozaodolinux.com/privkey.pem;
include /etc/nginx/ssl-ciphers.conf;
include /etc/nginx/proxy.conf;
include /etc/nginx/header.conf;
include /etc/nginx/fastcgi_params;
include /etc/nginx/cache.conf;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/$host.log main;
error_log /var/log/nginx/error.log error;
# Se tiver um servidor rsyslog centralizador de logs
#access_log syslog:server=10.10.10.10,facility=local7,tag=nginx,severity=error main;
#error_log syslog:server=10.10.10.10,facility=local7,tag=nginx,severity=error error;
# include files with config snippets into the root context.
include /etc/nginx/conf.d/*.conf;
}
No caso do syslog centralizador veja mais detalhes em https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#logging-to-syslog
O que é o default_server no Nginx
- Your Nginx configuration file should contain at least one server directive for defining a virtual server
- The Nginx will utilize the default server for handling the requests when their HTTP Host header remains unmatched with any other server blocks
vim /etc/nginx/conf.d/default.conf
# Default Server
################
server {
#listen 80 default_server;
server_name _; # This is just an invalid value which will never trigger on a real hostname.
location /basic_status {
stub_status;
access_log off;
allow 127.0.0.0/8;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
}
location / {
root /var/www/html;
index welcome.html;
}
}
Por simplicidade mantive TODAS as configurações dos subdomínios num arquivo único.
When Nginx handles a request, the server name directive instructs it to select a specific server from a list of numerous server blocks
vim /etc/nginx/conf.d/reverse-proxy.conf
Uma visão resumida do que precisa ser alterado:
# Modelos de server (~VirtualHost no apache)
#===========================================
server {
server_name tiozaodolinux.com www.tiozaodolinux.com wiki.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass http://10.10.10.2:80; }
}
server {
server_name sem-location.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
}
server {
server_name legado.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass http://10.10.10.10:080; }
proxy_read_timeout 30m;
proxy_send_timeout 30m;
proxy_connect_timeout 20;
}
# Sub SubDomínios em *.DEV
#=========================
server {
server_name *.dev.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass http://10.10.11.1:80; }
# ssl_certificate /etc/letsencrypt/live/dev.tiozaodolinux.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/dev.tiozaodolinux.com/privkey.pem;
}
# Sub SubDomínios em *.HOM
#==========================
server {
server_name *.hom.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass http://10.10.11.2:80; }
# ssl_certificate /etc/letsencrypt/live/hom.tiozaodolinux.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/hom.tiozaodolinux.com/privkey.pem;
}
# Modelos de Load Balance
#========================
## Load Balance: apl01
upstream LB_apl01 {
ip_hash;
server 10.10.10.111:8080;
server 10.10.10.222:8080;
}
## Load Balance: apl02
upstream LB_apl02 {
ip_hash;
server 10.10.10.11:443;
server 10.10.10.22:443;
server 10.10.10.33:443;
}
# Modelos de Aplicações através do Load Balance
#==============================================
server {
server_name apl01.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass http://LB_apl01; }
}
server {
server_name apl02.tiozaodolinux.com;
include /etc/nginx/force-ssl.conf;
location / { proxy_pass https://LB_apl02; }
}
Não se esqueça dessa parte IMPORTANTÍSSIMA.
sed -i 's/tiozaodolinux.com/seu-dominio.com.br/' /etc/nginx/nginx.conf
sed -i 's/tiozaodolinux.com/seu-dominio.com.br/' /etc/nginx/conf.d/reverse-proxy.conf
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Aqui vale lembrar que os logs dos Subdomínios ficarão registrados separadamente facilitando as coletas, então precisamos dar permissão pro usuário nginx gravar logs nos diretórios de logs:
chown nginx:nginx /var/log/nginx/ -R
Para garantir que o serviço inicie automaticamente no reboot do servidor:
systemctl enable nginx.service
Finalmente vamos poder iniciar o serviço:
sytemctl restart nginx.service
É sempre bom verificar se o serviço está rodando:
systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-06-17 17:36:45 -04; 1s ago
...
Validar acesso via DNS (ou existir no
/etc/hosts
local)
mkdir -p /var/www/html
Arquivo index.html de boas vindas
cat << '_EOF' > /var/www/html/index.html
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nginx Proxy Reverse com Certificados Wildcard</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<style>
.jumbotron { margin-top: 50px; }
</style>
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>Parabéns!</h1>
<p>Configurou corretamente seu Nginx Proxy Reverse com <b>Wildcard</b>!</p>
</div>
<p class="text-center"><small>Saiba mais em <a href="https://wiki.tiozaodolinux.com/Guide-for-Linux/Nginx-Proxy-Reverse-With-Certificates-Wildcard" target="_blank">Nginx Proxy Manager com Wildcard</a></small></p>
</div>
</body>
</html>
_EOF
Arquivo de página não encontrada (erro
404
)
cat << '_EOF' > /var/www/html/404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nginx Proxy Reverse com Certificados Wildcard</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<style>
.jumbotron { margin-top: 50px; }
</style>
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>Error 404</h1>
<p>Essa página não foi encontrada!</p>
<p>Que tal ir pra a <a href="/">Home</a>?</p>
</div>
<p class="text-center"><small>Saiba mais em <a href="https://wiki.tiozaodolinux.com/Guide-for-Linux/Nginx-Proxy-Reverse-With-Certificates-Wildcard" target="_blank">Nginx Proxy Manager com Wildcard</a></small></p>
</div>
</body>
</html>
_EOF
Agora se alguma entrada de DNS estiver direcionando para o IP do servidor e ainda não tivermos configurado o VirtualHost referente à esse subdomínio veremos uma tela assim:
Por outro lado, se existir a entrada de DNS (ou existir no
/etc/hosts
local) e já tivermos configurado o server_name, mas ainda não tivermos definido olocation
veremos algo assim (notem o cadeado):
Se qusier olhar os logs sendo gerados em tempo real:
watch "{ ls -lt /var/log/nginx/*log | head -n 30; }"
Gostou? Então não deixe de assistir ao vídeo onde explico melhor essa implementação.
https://youtu.be/Xq_FD3Oxmkk
Diretivas utilizadas no Nginx - https://nginx.org/en/docs/http/ngx_http_proxy_module.html
Configuração HTTPS no Nginx - https://nginx.org/en/docs/http/configuring_https_servers.html
Exemplo completo - https://www.nginx.com/resources/wiki/start/topics/examples/full/
Entendendo os blocos no Nginx - https://www.plesk.com/blog/various/nginx-configuration-guide/
Um verdadeiro livro on-line - https://www.freecodecamp.org/news/the-nginx-handbook/
O que é default_server no Nginx - https://linuxhint.com/what-is-default-server-in-nginx/
Mozilla SSL Configuration Generator - https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.7
Comparativo Nginx X Apache na visão do Nginx - https://www.nginx.com/blog/nginx-vs-apache-our-view/
Comparativo Nginx X Apache - https://www.hostinger.com.br/tutoriais/nginx-vs-apache
Análise detalhada do Nginx X Apache - https://hackr.io/blog/nginx-vs-apache
Utilizando o cache no Nginx -https://www.digitalocean.com/community/tutorials/understanding-nginx-http-proxying-load-balancing-buffering-and-caching
Como customizar páginas de erro - https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-to-use-custom-error-pages-on-ubuntu-22-04
Uma howto do Nginx SSL Proxy https://www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/
Vídeos no Youtube: