Tenho dois servidores, vamos chamá-los ServerA
e ServerB
.
Comprei um domínio no NameCheap, vamos chamá-loexample.com
Cada servidor possui contêineres docker (Flask Web Apps) em execução em portas diferentes.
Exemplo:
WebApp1 running on port 8080
WebApp2 running on port 8081
.
.
A configuração é a mesma em ambos os servidores.
Em seguida, uso o nginx para um proxy reverso na porta 443, cada um com seu próprio subdomínio.
Exemplo:
WebApp1 running on port 8080 will be accessible via test1.example.com
WebApp2 running on port 8081 will be accessible via test2.example.com
.
.
Estou usando CertBot para certificados SSL.
Meus dois servidores estão hospedados no OCI (Oracle Cloud) e eu construo um balanceador de carga de rede no OCI para equilibrar o tráfego entre meus servidores.
Abaixo estão minhas configurações:
nginx.conf
user nginx;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 800;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# General Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
# gzip on;
# gzip_vary on;
# gzip_min_length 10240;
# gzip_proxied expired no-cache no-store private auth;
# gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
# gzip_disable "MSIE [1-6]\.";
##
# Web Apps configurations
##
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/sites-enabled/test1.example.com
server {
server_name test1.example.com;
location / {
access_log /var/log/nginx/test1/access.log;
error_log /var/log/nginx/test1/error.log;
proxy_pass http://localhost:8080;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/test1.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test1.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = test1.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name test1.example.com;
listen 80;
return 404; # managed by Certbot
}
Atualmente, o nome de domínio test1.example.com possui um registro A para ServerA que está funcionando bem e posso acessar meu WebApp.
Mas quero que o domínio aponte para meu Load Balancer para que eu possa equilibrar o tráfego em ambos os servidores. Mas não posso fazer isso, a menos que emita certificados SSL em ambos os servidores, o que não posso. Porque depois de emitir test1.example.com on ServerA
, isso ServerB
resulta em um erro do certbot dizendo que o certificado já foi atribuído a ServerA
.
Alguém pode me ajudar sobre como posso fazer isso?
Para resolver o problema mencionado com certificados SSL e balanceamento de carga, existe uma solução viável. Você pode transferir o certificado SSL criado no ServidorA para o ServidorB usando o Secure Copy Protocol (SCP) para copiar com segurança o certificado e a chave privada.
Depois de criar o certificado no ServerA com Certbot, você pode copiar manual ou automaticamente os arquivos correspondentes (fullchain.pem e privkey.pem) do ServerA para o ServerB. A automação pode ser alcançada usando um cronjob executado em intervalos regulares, como uma vez por dia, para garantir que ambos os servidores tenham certificados atualizados.
Aqui está um exemplo do comando para copiar os arquivos de certificado:
Substitua “usuário” pelo seu nome de usuário no ServidorB e “/caminho/para/certificado/” pelo caminho apropriado onde o certificado deve ser salvo no ServidorB.
Para cópia automatizada, você pode criar um script de shell que execute esses comandos e configurar um cronjob para executar esse script regularmente.
É importante configurar corretamente as chaves SSH para uma comunicação segura e automatizada entre os servidores. Além disso, garanta a segurança de ambos os servidores, pois a chave privada do certificado SSL é uma informação confidencial.