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