Configuração de HTTPS com HAProxy, Hosts Virtuais Tomcat e Balanceamento de Carga Nginx

  1. Implementação de HTTPS com HAProxy

Ambiente de Teste

1.1 Preparação do HAProxy e Servidores HTTP Backend

Consulte as configurações anteriores para o HAProxy e servidores HTTP backend.

1.2 Geração de Certificado Autoassinado


# Criação do diretório para armazenar certificados
sudo mkdir -p /etc/haproxy/certs

# Configuração do Makefile para gerar chaves sem criptografia
sudo sed -i 's|/usr/bin/openssl genrsa -aes128|/usr/bin/openssl genrsa|' /etc/pki/tls/certs/Makefile

# Geração do certificado
cd /etc/pki/tls/certs
sudo make /etc/haproxy/certs/meudominio.com.crt
sudo chmod 600 /etc/haproxy/certs/meudominio.com.*

# Combinação da chave e certificado em um único arquivo PEM
cat /etc/haproxy/certs/meudominio.com.key /etc/haproxy/certs/meudominio.com.crt > /etc/haproxy/certs/meudominio.com.pem

1.3 Configuração do HTTPS no HAProxy


# Edição do arquivo de configuração do HAProxy
sudo tee /etc/haproxy/conf.d/https-config.cfg <<EOF
listen web_secure
    bind 192.168.50.10:80
    bind 192.168.50.10:443 ssl crt /etc/haproxy/certs/meudominio.com.pem
    balance leastconn
    server backend1 192.168.50.20:80 check inter 5000 fall 2 rise 4
    server backend2 192.168.50.30:80 check inter 5000 fall 2 rise 4
EOF

# Reinício do serviço HAProxy
sudo systemctl restart haproxy
  1. Componentes Principais do Tomcat e Estrutura de Diretórios

Componentes Essenciais

  • Server: Instância de execução do Tomcat, contendo um ou mais Services.
  • Service: Agrupamento lógico de um Engine e seus Connectors associados.
  • Connector: Interface para protocolos como HTTP e AJP, vinculada a um Engine específico.
  • Engine: Mecanismo central que processa requisições, associado a múltiplos Connectors.
  • Host: Virtual host, permitindo múltiplos domínios no mesmo Tomcat.
  • Context: Mapeamento de URL para diretórios de aplicações web.

Estrutura de Diretórios

O diretório raiz padrão do Tomcat é $CATALINA_BASE/webapps/. Dentro dele, o subdiretório ROOT hospeda a aplicação web padrão. Cada subdiretório representa uma aplicação web distinta.

Por exemplo, se uma aplicação chamada loja estiver em $CATALINA_BASE/webapps/ROOT/ e outra chamada forum em $CATALINA_BASE/webapps/forum/, o mapeamento será:

  • http://localhost/ → aplicação loja ($CATALINA_BASE/webapps/ROOT/)
  • http://localhost/forum → aplicação forum ($CATALINA_BASE/webapps/forum/)
  1. Configuração de Múltiplos Hosts Virtuais no Tomcat

3.1 Instalação do JDK


# Instalação do JDK usando pacote RPM
sudo dnf -y install jdk-11.0.12_linux-x64_bin.rpm

# Configuração das variáveis de ambiente
sudo tee /etc/profile.d/java-env.sh <<EOF
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME
export CLASSPATH=$JAVA_HOME/lib/
EOF

source /etc/profile.d/java-env.sh

3.2 Instalação Binária do Tomcat


# Download e extração do Tomcat
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.tar.gz
sudo tar xzf apache-tomcat-9.0.50.tar.gz -C /opt/
sudo ln -s /opt/apache-tomcat-9.0.50 /opt/tomcat

# Configuração de permissões e serviço systemd
sudo useradd -r -s /sbin/nologin tomcat_user
sudo chown -R tomcat_user:tomcat_user /opt/tomcat
sudo tee /etc/systemd/system/tomcat.service <<EOF
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
Type=forking
EnvironmentFile=/opt/tomcat/conf/tomcat.conf
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
User=tomcat_user
Group=tomcat_user

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now tomcat

3.3 Configuração de Hosts Virtuais


# Criação dos diretórios para aplicações web
sudo mkdir -p /data/site-a/ROOT /data/site-b/ROOT
echo "Site A - Dominio A" | sudo tee /data/site-a/ROOT/index.html
echo "Site B - Dominio B" | sudo tee /data/site-b/ROOT/index.html
sudo chown -R tomcat_user:tomcat_user /data/site-*

# Edição do server.xml para hosts virtuais
sudo sed -i '/<Engine name="Catalina"/a \
    <Host name="dominio-a.com" appBase="/data/site-a/" unpackWARs="true" autoDeploy="true"></Host>\
    <Host name="dominio-b.com" appBase="/data/site-b/" unpackWARs="true" autoDeploy="true"></Host>' /opt/tomcat/conf/server.xml

sudo systemctl restart tomcat
  1. Balanceamento de Carga para Tomcat com Nginx

4.1 Ambiente de Teste

Configuração com dois servidores Tomcat e um servidor Nginx como proxy reverso.

4.2 Preparação dos Servidores


# Nos servidores Tomcat (tomcat-server1 e tomcat-server2):
sudo systemctl status tomcat

# No servidor Nginx (proxy-server):
sudo systemctl status nginx

4.3 Configuração dos Dados Web no Tomcat


# No tomcat-server1:
sudo mkdir -p /data/app/ROOT
echo "Conteúdo do servidor Tomcat 1" | sudo tee /data/app/ROOT/index.html
sudo chown -R tomcat_user:tomcat_user /data/app

# No tomcat-server2 (similar):
sudo mkdir -p /data/app/ROOT
echo "Conteúdo do servidor Tomcat 2" | sudo tee /data/app/ROOT/index.html
sudo chown -R tomcat_user:tomcat_user /data/app

4.4 Configuração do Nginx para Balanceamento de Carga


# Edição do nginx.conf no servidor proxy
sudo tee -a /etc/nginx/nginx.conf <<EOF
http {
    upstream tomcat_cluster {
        server 192.168.100.10:8080 weight=3;
        server 192.168.100.20:8080 weight=2;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://tomcat_cluster;
            proxy_set_header Host $host;
        }
    }
}
EOF

sudo nginx -t && sudo systemctl restart nginx

4.5 Ajustes nos Servidores Tomcat


# Em ambos os servidores Tomcat, alterar o host padrão
sudo sed -i 's|<Engine name="Catalina" defaultHost="localhost"|<Engine name="Catalina" defaultHost="app.example.com"|' /opt/tomcat/conf/server.xml
sudo sed -i '/<Engine name="Catalina"/a \
    <Host name="app.example.com" appBase="/data/app/" unpackWARs="true" autoDeploy="true"></Host>' /opt/tomcat/conf/server.xml

sudo systemctl restart tomcat
  1. Princípio de Funcionamento do Memcached

Memcached utiliza o mecanismo Slab Allocator para gerenciar memória de forma eficiente, evitando fragmentação. A memória é dividida em páginas de 1 MB, cada uma segmentada em chunks de tamanhos fixos, agrupados em classes (slab classes). O fator de crescimento (padrão 1.25) controla a variação entre os tamanhos dos chunks. Ao armazenar dados, o Memcached seleciona a classe de slab mais adequada para minimizar o desperdício de espaço.

Tags: haproxy tomcat nginx Memcached ssl

Publicado em 7-8 04:38