Escolar Documentos
Profissional Documentos
Cultura Documentos
www.4linux.com.br
Sumário
Sumário 2
1 Introdução 9
1.1 Quem deve fazer? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Pré-requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Agenda 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4 Antes do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5 Verificando o Ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6 Programa Java Mı́nimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Aula 1 12
2.1 Conceitos do JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 JavaSE x JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Aplicações JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Containers JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Aplicação Java EE x JVM x Container . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Servlets, JSP, JSTL e JSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.7 Outras APIs Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.8 Frameworks Struts, Hibernate e outros . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.9 O formato WAR e deployment descriptors . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10 Sobre o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11 Instalação do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11.1 Pré-Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11.2 Versões do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.11.3 Como e Onde Baixar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.11.4 Instalação em Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.12 Principais Arquivos e Diretórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.13 Startup e Shutdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.14 Iniciando e Terminando o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.15 Testando o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.16 Exemplos do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.17 Se Algo Deu Errado... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.18 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.19 Aplicações de Administração do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.20 Ativação das aplicações administrativas . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.21 Editando o arquivo conf/tomcat-users.xml . . . . . . . . . . . . . . . . . . . . . . . . 19
2.22 Aplicação Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.23 Aplicação Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.24 Baixando e Instalando o Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.25 Usando o Admin 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2
Sumário
3 Aula 2 23
3.1 Deployment de Aplicações Web JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 O Que é Deployment? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.2 Aplicação de Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Compilando o Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 Comandos para Compilar o Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Pacotes WAR abertos e fechados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.5 Montando um Pacote WAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.6 Verificando um Pacote WAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.7 Auto-Deploy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.8 Exercı́cio 1/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9 Exercı́cio 2/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.10 Exercı́cio 3/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.11 Exercı́cio 4/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.12 Undeployment manual x Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.13 O Descritor web.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.14 Exercı́cio 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.15 Exercı́cio 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.16 Re-deployment Automático . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.17 Construção de Pacotes WAR com Ant . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.18 Instalação do Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.19 Verificando a Instalação do Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.20 $ ant -version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.21 Scripts Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.22 Exemplo com Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.23 Estrutura do Exemplo 1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.24 Exercı́cio 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.25 Exercı́cio 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.26 Deployment via Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.27 Exercı́cio 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.28 Exercı́cio 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.29 Configuração de Aplicações Web / Contextos . . . . . . . . . . . . . . . . . . . . . . . 31
3.30 Introdução ao server.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.31 Estrutura do server.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.32 Engines, hosts e contextos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.33 Contextos implı́citos e explı́citos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.34 Outros Elementos do server.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.35 Exercı́cio 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.36 Dicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.37 Editando o server.xml via Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.38 Exemplo do Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.39 Configuração de Contextos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.40 Exercı́cio 1/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.41 Exercı́cio 2/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.42 Exercı́cio 3/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.43 Exemplo 4/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.44 Configuração do contexto via conf/engine/host . . . . . . . . . . . . . . . . . . . . . . 34
3.45 Exercı́cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3
Sumário
4 Aula 3 37
4.1 Instalação de Bibliotecas e APIs de Terceiros . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Bibliotecas Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3 Onde Instalar Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4 Bibliotecas fornecidas com o Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.5 Conceitos de classloaders do Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.6 Uso das pastas server, shared e common . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7 Exemplo de Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.8 Task Customizado para o Manager do Tomcat . . . . . . . . . . . . . . . . . . . . . . 38
4.9 Compilando o Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.10 Exercı́cio 1/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.11 Exercı́cio 2/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.12 Exercı́cio 3/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.13 Exercı́cio 4/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.14 Porque a Primeira Vez Foi Diferente? . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.15 Uso da pasta WEB-INF/lib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.16 Exemplo de Biblioteca Dentro do Pacote . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.17 Exercı́cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.18 Configuração de DataSources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.19 Porque usar DataSources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.20 Pools de Conexão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.21 Sobre o HSQLDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.22 Baixando e Instalando o HSQLDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.23 Criando o Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.24 Verificando o Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.25 Inicializando e Verificando o BD do Exemplo . . . . . . . . . . . . . . . . . . . . . . . 43
4.26 Criação de DataSources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.27 Instalação do Driver do Banco no Tomcat . . . . . . . . . . . . . . . . . . . . . . . . 43
4.28 Uso de DataSources pela aplicação via JNDI . . . . . . . . . . . . . . . . . . . . . . . 43
4.29 Exemplo de DataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.30 DataSource no Contexto da Aplicação . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.31 Configurações de Segurança (Parte I) . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.32 Introdução à segurança declarativa do J2EE . . . . . . . . . . . . . . . . . . . . . . . 44
4.33 Autenticação HTTP BASIC e DIGEST . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.34 Qual Mecanismo Escolher? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.35 Usuários, roles e resource-collections do J2EE . . . . . . . . . . . . . . . . . . . . . . 45
4.36 Definição do Mecanismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.37 Páginas Protegidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.38 Exemplo de Segurança BASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.39 Estrutura do Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.40 Criação dos Usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.41 Configuração do Realm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4
Sumário
5 Aula 4 52
5.1 Configurações de Segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.2 Autenticação via banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3 Definição do DatasourceRealm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4 Exercı́cio 1/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.5 Exercı́cio 2/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6 Exercı́cio 3/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.7 Exemplo 4/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.8 Autenticação via diretório LDAP (OpenLDAP) . . . . . . . . . . . . . . . . . . . . . 54
5.9 Exemplo de JNDI Realm 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.10 Exemplo de JNDI Realm 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.11 Segurança Programática do JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.12 APIs de Segurança do JavaEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.13 Logout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.14 Logout por Inatividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.15 Restrições de IP / métodos HTTP pelo Tomcat . . . . . . . . . . . . . . . . . . . . . 56
5.16 Exemplo de Restrições No Descritor web.xml 1/2 . . . . . . . . . . . . . . . . . . . . 56
5.17 Exemplo de Restrições No Descritor web.xml 2/2 . . . . . . . . . . . . . . . . . . . . 56
5.18 Firewall Interno do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.19 Regras de Host e Endereço IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.20 http://jakarta.apache.org/regexp/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.21 Exercı́cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.22 Exemplo 4.1 Visto Pelo Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.23 Conexões seguras (SSL/TLS) no Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.24 Certificados Auto-Assinados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.25 Criando um Certificado para o Servidor 1/2 . . . . . . . . . . . . . . . . . . . . . . . 58
5.26 Criando um Certificado para o Servidor 2/2 . . . . . . . . . . . . . . . . . . . . . . . 58
5.27 Ativando o Conector SSL 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.28 Ativando o Conector SSL 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.29 Exercı́cio 1/3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.30 Exercı́cio 2/3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.31 Exercı́cio 3/3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5
Sumário
6 Aula 5 66
6.1 Integração com o Apache Httpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.2 Servidores Nativos x Tomcat 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.3 Servidores Nativos x Tomcat 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.4 Arquitetura do Tomcat(Simplificada) . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.5 Conectores HTTP e AJP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.6 O mod jk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.7 Instalando o mod jk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.8 Instalando o Pacote 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.9 Instalando o Pacote 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.10 Instalando Binários Pré-Compilados 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.11 Instalando Binários Pré-Compilados 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.12 Compilando o mod jk 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.13 Compilando o mod jk 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.14 Configuração do mod jk 1/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.15 Configuração do mod jk 2/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.16 Configuração do mod jk 3/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.17 Configuração do mod jk 4/4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.18 Se Algo Der Errado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.19 Dividindo Tarefas entre o Apache e o Tomcat . . . . . . . . . . . . . . . . . . . . . . 70
6.20 Exercı́cio 1/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.21 Exercı́cio 2/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.22 Exercı́cio 3/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.23 Exercı́cio 4/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.24 Exercı́cio 5/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.25 Exercı́cio 6/6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.26 Integração x segurança e logging 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6
Sumário
7 Aula 6 80
7.1 Configurações de Clustering (Parte II) . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.2 Clusters Para Tolerância à Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.3 Arquitetura de clustering do Tomcat 5 1/2 . . . . . . . . . . . . . . . . . . . . . . . . 80
7.4 Arquitetura de clustering do Tomcat 5 2/2 . . . . . . . . . . . . . . . . . . . . . . . . 80
7.5 Configuração de clusters para Tolerância à Falhas . . . . . . . . . . . . . . . . . . . . 81
7.6 Exercı́cio 1/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.7 Exercı́cio 2/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.8 Exercı́cio 3/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.9 Exercı́cio 4/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.10 Exercı́cio 5/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7.11 Exercı́cio 6/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.12 Exercı́cio 7/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.13 Exercı́cio 8/8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.14 Se Algo Deu Errado... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
7.15 Seja Paciente! 1/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.16 Seja Paciente! 2/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.17 Erros de Aplicação a Evitar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.18 Otimizações do Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.19 Clusters x Aplicações Administrativas . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.20 Cluster Farming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.21 Restrições do Farming no Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.22 Exercı́cio 1/5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7
Sumário
Referências Bibliográficas 94
8
Capı́tulo 1
Introdução
1.2 Pré-requisitos
• Leitura básica em Inglês Técnico;
– Conceitos do JavaEE
– Instalação do Tomcat
9
Capı́tulo 1. Introdução
• Aula 2:
• Aula 3:
• Aula 4:
• Aula 5:
• Aula 6:
$ java -version
java version 1.5.0
10
Capı́tulo 1. Introdução
$ javac
Usage: javac <options> <source files>
Verifique o classpath:
$ echo $CLASSPATH
.
public class Oi
{
static public void main(String[] args) {
System.out.println("Oi do Java!");
}
}
$ javac Oi.java
Para executar:
$ java Oi
Oi do Java!
11
Capı́tulo 2
Aula 1
Nesta aula temos um primeiro contato com o servidor Tomcat, sua instalação e sua “cara” para o
usuário e administrador, além de ver os conceitos essenciais para sua utilização
Tópicos:
• Conceitos do JavaEE
• Instalação do Tomcat
• Fornece a JVM (máquina virtual Java) e as APIs essenciais para coleções, E/S, reflexão, seri-
alização, XML, interfaces gráficas e redes
• Conectividade com bancos de dados, serviços de diretórios, correio eletrônico e outros serviços
12
Capı́tulo 2. Aula 1
Figura 2.1:
• Container Web: hospeda aplicações web, acessadas por meio de um navegador padrão
Figura 2.2:
13
Capı́tulo 2. Aula 1
• Servlets são classes Java criadas para serem gerenciadas por um container web.
• Páginas JSP são páginas HTML contendo comandos Java e tags customizadas, que são
transformadas em Servlets para execução pelo Container Web
14
Capı́tulo 2. Aula 1
• Versões do Tomcat
2.11.1 Pré-Requisitos
Tomcat 5.0.x e anteriores
• O Tomcat necessita do compilador Java fornecido pelo JDK para compilar os servlets gerados
pelo processamento de páginas JSP
Tomcat 5.5.x
• O Tomcat passou a incluir o compilador Java do Eclipse, de modo que basta um JRE
15
Capı́tulo 2. Aula 1
$ unzip apache-tomcat-5.5.16.zip
Entre na pasta bin e dê permissão de execução para todos os shell scripts
$ cd apache-tomcat-*/bin
$ chmod a+x *.sh
• common (classes usadas tanto pelo servidor quanto por aplicações, como a API de servlets)
16
Capı́tulo 2. Aula 1
$ cd ~/apache-tomcat-*/bin
$ ./statup.sh
Para terminar:
Entre na pasta bin do Tomcat
$ cd ~/apache-tomcat-*/bin
$ ./shutdown.sh
Após cada operação (inı́cio e término) confirme a presença do processo Java e verifique que as
três portas abertas pelo Tomcat
Figura 2.3:
17
Capı́tulo 2. Aula 1
2.18 Exercı́cios
Encerre o Tomcat, e acesse as páginas de documentação sem ter o Tomcat executando
Localize na documentação os release notes
Pelo Tomcat, a URL seria:
http://127.0.0.1:8080/tomcat-docs/RELEASE-NOTES.txt
file:///home/fernando/apache-tomcat-5.5.16/webapps/tomcat-docs/RELEASE-NOTES.txt
$ cd ~
$ cd apache-tomcat-*/bin ; ./startup.sh
$ more ../logs/catalina.out
...
SEVERE: Error initializing endpoint
java.net.BindException: Address already in use:8080
18
Capı́tulo 2. Aula 1
• Aplicação Manager
• Aplicação Admin
19
Capı́tulo 2. Aula 1
Figura 2.4:
Figura 2.5:
20
Capı́tulo 2. Aula 1
http://tomcat.apache.org/download-55.cgi
http://127.0.0.1:8080/admin
21
Capı́tulo 2. Aula 1
Figura 2.6:
22
Capı́tulo 3
Aula 2
Nesta aula, aprendemos como instalar e configurar aplicações web para execução sob o servidor de
aplicações Tomcat
Tópicos:
• exemplo1.1
– bean.jsp
– el.jsp
23
Capı́tulo 3. Aula 2
– hoje.jsp
– index.jsp
– WEB-INF
∗ classes
· exemplo
∗ HojeBean.java
∗ HojeServlet.java
– web.xml
$ export CLASSPATH=$CLASSPATH:$HOME/apache-tomcat-5.5.16/common/lib/servlet-api.jar
$ cd exemplo1.1
$ cd WEB-INF/classes
$ javac exemplo/*.java
Observe o uso da opção -C e que o últim argumento é um ponto, indicando o diretório corrente
Isto é necessário porque o pacote WAR não deve contar a pasta de topo da aplicação (no caso,
exemplo1.1)
24
Capı́tulo 3. Aula 2
$ unzip -t exemplo1.1.war
3.7 Auto-Deploy
A maneira mais fácil de fazer a instalação (deployment) de uma aplicação no Tomcat é copiar seu
pacote WAR (seja aberto ou fechado) para a pasta webapps
Feito a cópia, os logs do Tomcat deverão indicar que o novo pacote foi detectado e instalado
O novo pacote deverá então ser automaticamente listado como uma nova aplicação no Manager
e como um novo contexto no Admin
$ cp exemplo1.1.war apache-tomcat-*/webapps
Verifique os logs
$ tail apache-tomcat-*/logs/catalina.out
...
http://127.0.0.1:8080/exemplo1.1
25
Capı́tulo 3. Aula 2
Note que uma aplicação web (ou contexto) é visto pelo o navegador como se fosse uma pasta
O resultado é exibido na figura ao lado:
Figura 3.1:
$ rm apache-tomcat-*/webapps/exemplo1.1.war
$ rm -rf apache-tomcat-*/webapps/exemplo1.1
$ tail apache-tomcat-*/logs/catalina.out
...
Observe que, embora o Manager reconheça a presença da aplicação, não há registro do seu
deployment nos logs do Tomcat
Agora use o link Undeploy do Manager para desinstalar a aplicação
Verifique que o Manager remove o “pacote WAR” (na verdade o subdiretório) da aplicação na
pasta webapps
26
Capı́tulo 3. Aula 2
27
Capı́tulo 3. Aula 2
$ export ANT_HOME=$HOME/apache-ant-*
$ export PATH=$PATH:$ANT_HOME/bin
28
Capı́tulo 3. Aula 2
– build.xml
– dist
– html
∗ bean.jsp
∗ el.jsp
∗ ...
– src
∗ exemplo
∗ HojeServlet.java
∗ HojeBean.java
– WEB-INF
∗ classes
∗ web.xml
$ cd $HOME/exemplo1.2
Abra o arquivo build.xml em um editor de textos e altere a linha abaixo para indicar a localização
correta da sua instalação do Tomcat
$ ant all
29
Capı́tulo 3. Aula 2
Verifique pelo Manager e pelos logs que a aplicação foi instalada com sucesso
Acesse a página inicial do exemplo
http://127.0.0.1:8080/exemplo1.2
Note que o tı́tulo da página de boas-vindas foi modificado para diferencia-lo do exemplo 1.1
Note ainda que este exemplo define um display-name no descritor web.xml, e que este nome é
exibido pelo Manager
Figura 3.2:
30
Capı́tulo 3. Aula 2
• META-INF/context.xml
31
Capı́tulo 3. Aula 2
• configura a geração de logs, mas recomenda-se o uso do Log4J em vez deste elemento
• modifica o processamento de requisições, por exemplo para gerar logs de acesso ou depuração
da requisição HTTP
http://127.0.0.1/manager/html
3.36 Dicas
Não se esqueça de retornar o autoDeploy para true!
Salve uma cópia do server.xml original do Tomcat, pois os modelos e comentários inseridos nele
serão úteis no futuro!
Administradores de sistema preocupados com a segurança não irão querer misturar os arquivos
de aplicações com os arquivos do Tomcat, e podem conseguir isto modificando o atributo appBase
do elemento
32
Capı́tulo 3. Aula 2
Figura 3.3:
33
Capı́tulo 3. Aula 2
Note que foi usado um nome de contexto diferente do nome do pacote WAR, para evitar que o
aluno execute por engano o resultado dos exercı́cios anteriores
http://127.0.0.1
conf/Catalina/localhost/admin.xml
conf/Catalina/localhost/manager.xml
3.45 Exercı́cio
Crie o arquivo outro1.2.xml dentro de conf/Catalina/localhost, com o conteúdo:
Reinicie o Tomcat
Verifique que a URL http://127.0.0.1/outro1.2 passa a exibir o conteúdo do exemplo 1.2
Note que o atributo path é ignorado dentro a pasta conf/engine/host
34
Capı́tulo 3. Aula 2
35
Capı́tulo 3. Aula 2
Figura 3.4:
Figura 3.5:
36
Capı́tulo 4
Aula 3
Nesta aula, aprendemos como configurar aplicações e o próprio servidor para aplicações que neces-
sitam acesso a recursos externos, como bancos de dados e bibliotecas. Em seguida, iniciamos a
apresentação dos recursos de segurança do Java EE
Tópicos:
• Configuração de DataSources
37
Capı́tulo 4. Aula 3
<taskdef name="undeploy"
classpath="${tomcat}/server/lib/catalina-ant.jar"
classname="org.apache.catalina.ant.UndeployTask"
/>
38
Capı́tulo 4. Aula 3
$ ant
...
biblioteca:
empacota:
$ ant instala
39
Capı́tulo 4. Aula 3
$ cp dist/hoje.jar ~/apache-tomcat-*/shared/lib
Reinicie o Tomcat e acesse novamente a aplicação. Desta vez ela irá funcionar, exibindo a data
corrente
Remova a biblioteca da pasta shared/lib e reinicie o Tomcat
Confirme que a aplicação deixou de funcionar, exibindo em vez da data corrente a mensagem:
java.lang.NoClassDefFoundError: biblioteca/HojeBean
$ cp dist/hoje.jar ~/apache-tomcat-*/common/lib
Reinicie o Tomcat e acesse novamente a aplicação. Ela irá funcionar, exibindo a data corrente,
da mesma forma como funcionou utilizando a pasta shared
Remova a biblioteca da pasta common/lib e reinicie o Tomcat
Confirme que a aplicação novamente deixou de funcionar
$ cp dist/hoje.jar ~/apache-tomcat-*/server/lib
Reinicie o Tomcat e acesse novamente a aplicação. Desta vez ela não irá funcionar, ao contrário
de quando foram utilizadas as pastas shared e common
Remova a biblioteca da pasta server/lib, apenas para não deixar “lixo” no servidor
java.lang.NoClassDefFoundError: biblioteca/HojeBean
A diferença ocorre porque da primeira vez a página JSP ainda não havia sido compilada, mas
nas tentativas seguintes a página já estava compilada, pois havia sido executada uma vez com a
biblioteca presente
40
Capı́tulo 4. Aula 3
4.17 Exercı́cio
Refaça a primeira parte do exercı́cio anterior, de modo que o exemplo 3.1 esteja funcionando
Compile e instale o exemplo 3.2 usando o ant
$ ant
Note que, neste exemplo, o alvo default (all) já faz o deployment usando o Manager
Execute as duas aplicações, e verifique que cada uma exibe um formato de data / hora diferente,
comprovando que cada uma está usando a versão correta da biblioteca
Para o 3.1 é a biblioteca na pasta shared, para o 3.2 é a biblioteca dentro do WEB-INF
41
Capı́tulo 4. Aula 3
$ export CLASSPATH=$CLASSPAH:$HOME/hsqldb/lib/hsqldb.jar
$ mkdir $HOME/bd
Inicie o Database Manager do HSQLDB, que permite executar interativamente comandos SQL
java org.hsqldb.util.DatabaseManagerSwin
-url "jdbc:hsqldb:file:$HOME/bd/contatos;shutdown=true"
O comando acima irá criar o banco “contatos” dentro da pasta “bd” abaixo do home do usuário
42
Capı́tulo 4. Aula 3
Figura 4.1:
Lembre que não deve haver quebra de linha dentro do atributo url
$ cp $HOME/hsqldb/lib/hsqldb.jar $HOME/apache-tomcat-*/common/lib
Esta cópia deve ser feita mesmo que o DataSource seja configurado no META-INF/context.xml
da aplicação em vez de no server.xml do Tomcat
43
Capı́tulo 4. Aula 3
E para devolver a conexão ao pool, basta fecha-la como se fosse uma conexão comum con.close();
Figura 4.2:
44
Capı́tulo 4. Aula 3
Este controle deve ser delegado para o servidor de aplicações, que poderá faze-lo de forma mais
flexı́vel e segura
A configuração é feita em duas partes:
No descritor da aplicação (web.xml) são definidas regras de controle de acesso
Na configuração do servidor (server.xml ou context.xml) são definidos os bancos de dados de
usuários e roles
A senha fornecida pelo usuário no BASIC ou DIGEST é mantida em memória pelo navegador,
que a retransmite a cada página requisitada
<security-role>
<role-name>usuario</role-name>
</security-role>
<security-role>
<role-name>administrador</role-name>
</security-role>
45
Capı́tulo 4. Aula 3
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>
Exemplo de Segurança J2EE
</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>
Paginas do Usuario
</web-resource-name>
<url-pattern>/usuarios/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>usuario</role-name>
</auth-constraint>
</security-constraint>
46
Capı́tulo 4. Aula 3
E reinicie o servidor
...
<GlobalNamingResources>
...
<Resource auth="Container"
name="UserDatabase"
type="org.apache.catalina.UserDatabase"
pathname="conf/tomcat-users.xml"
factory="org.apache.catalina.users.
MemoryUserDatabaseFactory"/>
</GlobalNamingResources>
...
Este realm pode ser editado pelo Admin sem necessidade de reinicar o Tomcat
...
<Engine
defaultHost="localhost"
name="Catalina">
<Realm className="org.apache.catalina.realm.
UserDatabaseRealm"/>
<Host
...
47
Capı́tulo 4. Aula 3
Figura 4.3:
48
Capı́tulo 4. Aula 3
Figura 4.4:
49
Capı́tulo 4. Aula 3
<Realm className="org.apache.catalina.realm.
UserDatabaseRealm" digest="MD5" />
Note que, embora o banco de dados de senhas seja definido em um , quem valida as senhas é um
Abra para edição o arquivo tomcat-users.mxl
Compile o programa CriptografaSenha.java, fornecido pelo instrutor, para gerar as versões crip-
tografadas de cada senha no arquivo
<user username="fulano"
password="caa9c8f8620cbb30679026bb6427e11f"
roles="usuarios"/>
Com todas as senhas encriptadas, inicie o Tomcat e use o exemplo3.4 para verificar que as senhas
criptografadas são reconhecidas
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp
50
Capı́tulo 4. Aula 3
</form-login-page>
<form-error-page>/loginInvalido.jsp
</form-error-page>
</form-login-config>
</login-config>
51
Capı́tulo 5
Aula 4
Nesta aula, continuamos a apresentação dos recursos de segurança do Java EE e do Tomcat, incluindo
o uso de SSL / TLS (criptografia) e depois seremos apresentados às configurações de hosts virtuais
e de logging
Tópicos:
• Configurações de logging
52
Capı́tulo 5. Aula 4
(Os comandos SQL deste slide e do próximo estão no arquivo usuarios.sql junto aos exemplos do
curso)
53
Capı́tulo 5. Aula 4
Faça o deploy da aplicação pelo Manager, pois se usar o auto-deploy o descritor não-padrão
context.xml não será processado
Finalmente teste a aplicação pela URL http://127.0.0.1/exemplo4.1
Lembre de usar os logins “sicrano/testando” e “gerente/boss”
connectionURL="ldap://localhost:389"
userBase="ou=people,dc=mycompany,dc=com"
54
Capı́tulo 5. Aula 4
userSearch="(uid={0})"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
userRoleName="memberOf"
/>
• getUserPrincipal() retorna o nome de login autenticado pelo container, seja pelos mecanismos
do HTTP ou pelo form-based
5.13 Logout
Como visto na Aula 3, só é possı́vel fazer explicitamente um logout com a autenticação form-based
Neste caso, basta encerrar a sessão HTTP, chamando HttpSession.invalidate()
Mas nada obriga o usuário a fazer o logout, e o servidor não tem como saber se o usuário deixou
o site ou fechou seu navegador
As sessões HTTP (e consequentemente os logins) são invalidados por inatividade, conforme con-
figuração no descritor web.xml
55
Capı́tulo 5. Aula 4
<session-config>
<session-timeout>10</session-timeout>
</session-config>
56
Capı́tulo 5. Aula 4
<Valve className="org.apache.catalina.valves.
RemoteHostValve"
allow=".*.empresa\.com\.br"/>
<Valve className="org.apache.catalina.valves.
RemoteAddrValve"
allow="192\.168\.0\..*"/>
5.20 http://jakarta.apache.org/regexp/
Em geral elas seguem mesma sintaxe do grep e Perl
Podem ser especificadas várias expressões, separadas por vı́rgulas
Se um dos atributos for omitido, assume-se a expressão regular ”.*”que aceita qualquer coisa
5.21 Exercı́cio
Verifique o endereço IP do computador vizinho com o comando ifconfig
Modifique o exemplo 4.1 para incluir uma válvula negando o acesso dele ao exemplo (modifique
o context.xml da aplicação)
Faça um undeploy e novo deploy pelo Manager para efetivar a mudança
Confirme a presença da válvula pelo Manager
Verifique se o vizinho consegue ou não acessar a aplicação
Verifique também se o firewall local iptables não está impedindo a conexão
57
Capı́tulo 5. Aula 4
Figura 5.1:
58
Capı́tulo 5. Aula 4
Este parâmetro faz com que o Tomcat automaticamente redirecione conexões para páginas que
exigem conexões seguras
59
Capı́tulo 5. Aula 4
Figura 5.2:
60
Capı́tulo 5. Aula 4
127.0.0.1 hostvirtual
<Host name="hostvirtual"
appBase="/home/fernando/maiswebapps"
autoDeploy="true" />
Reinicie o Tomcat
Verifique no Admin a presença de dois Hosts
61
Capı́tulo 5. Aula 4
5.39 Exercı́cio
Configure o Manager para o host virtual recém-criado, conforme as instruções no slide anterior
Acesse o novo Manager, e observe que ele relaciona um conjunto de aplicações diferente do
Manager para o localhost
Como o realm que autentica o acesso ao Manager foi configurado no Engine, o mesmo login e
senha vale para o Manager do host virtual
62
Capı́tulo 5. Aula 4
Consulte os JavaDocs da classe java.util.logging.Level para saber sobre todos os nı́veis possı́veis
no JavaSE
2. Configurar este handler informando o nı́vel de severidade das mensagens registradas e o prefixo
do nome do arquivo
63
Capı́tulo 5. Aula 4
Cada “bullet” indica uma linha do arquivo de propriedades, que nao deve ser quebrada
O resultado destas modificações é a geração do arquivo exemplo..log contendo apenas as mensa-
gens para o contexto “/exemplo”
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
64
Capı́tulo 5. Aula 4
prefix="localhost_access_log."
suffix=".txt"
pattern="common"
resolveHosts="false" />
O padrão “common” segue o modelo do Apache Httpd e reconhecido por ferramentas de análise
como o Webalizer
65
Capı́tulo 6
Aula 5
Nesta aula, somos apresentados aos recursos de integração do Tomcat com servidores web nativos,
especialmente o Apache, e vemos como estes recursos podem ser utilizados para a construção de
clusters de servidores de aplicações
Tópicos:
66
Capı́tulo 6. Aula 5
Figura 6.1:
6.6 O mod jk
É um plug-in de servidor web que acrescenta o suporte ao protocolo AJP
Há versões para Apache, ISAPI e NSAPI
Deve ser compilado em relação à versão especı́fica e plataforma do servidor web
Com sorte, poderá ser encontrado um binário pré-compilado para o seu servidor (mas verifique a
versão!)
Daqui em diante assume-se que o servidor web é o Apache 2.x fornecido com sua distribuição do
Linux
67
Capı́tulo 6. Aula 5
# apachectl status
# rpm -q httpd
68
Capı́tulo 6. Aula 5
$ cd $HOME/jakarta-tomcat-connectors-*-src
$ cd jk/native
$ ./configure --with-apxs=/usr/sbin/apxs
$ make
$ su
# make install
Note que a linha abaixo da diretiva JkWorkersFile é na verdade continuação da mesma linha!
Include conf.d/*
Agora é necessário fornecer o arquivo de configuração do próprio mod jk, indicado pela diretiva
JkWorkersFile, no caso /etc/httpd/conf.d/workers.properties
worker.list=no0
worker.no0.type=ajp13
worker.no0.host=127.0.0.1
worker.no0.port=8009
69
Capı́tulo 6. Aula 5
Garanta que o Conector HTTP do Tomcat esteja escutando conexões na porta 8080, para não
entrar em conflito com o Apache
Garanta também que o Conector AJP padrão esteja configurado para a porta 8009
JkLogLevel debug
70
Capı́tulo 6. Aula 5
E reinicie o Apache
Reinicie o Apache
Temos que fazer o deploy do exemplo 5.1 no Tomcat, porém mantendo o pacote aberto e sua
localização na pasta home do usuário
Então defina um elemento no server.xml ou então use o Manager, conforme a captura no próximo
slide
Figura 6.2:
71
Capı́tulo 6. Aula 5
Reinicie o Apache e teste novamente a aplicação. Continuamos vendo no log de acesso do Tomcat
apenas a página JSP
Note que, neste caso, a página inicial index.html será servida pelo Tomcat!
Obs:
A diretiva JkUnMount só existe no mod jk 1.2.8 em diante!
72
Capı́tulo 6. Aula 5
Figura 6.3:
73
Capı́tulo 6. Aula 5
Um mesmo usuário poderia ser a cada página atendido por um servidor diferente
Entretanto, aplicações web reais utilizam artifı́cios como cookies e sessões HTTP para manter o
estado de um usuário particular (por exemplo, uma cesta de compras)
Este estado tem que ser replicado entre os nós do cluster para que haja tolerância a falhas
$ mkdir $HOME/cluster
$ cd $HOME/cluster
$ unzip ../apache-tomcat*.zip
$ mv apache-tomcat-* no0
$ unzip ../apache-tomcat*.zip
$ mv apache-tomcat-* no1
74
Capı́tulo 6. Aula 5
Nas duas instalações do Tomcat (no0 e no1), altere edite o arquivo conf/tomcat-users.xml para
permitir o uso do Manager, conforme visto na Aula 1
Acesse a aplicação Manager em cada nó, confirmando que as duas instalações do Tomcat estão
funcionando
http://127.0.0.1:8080/manager/html (no0)
http://127.0.0.1:8180/manager/html (no1)
$ cd $HOME/cluster/no0/webapps
$ unzip $HOME/exemplo5.2.zip
$ cd exemplo5.2/WEB-INF/classes
$ export CLASSPATH=$CLASSPATH:$HOME/cluster/no0/common/lib/servlet-api.jar
$ javac exemplo/*.java
75
Capı́tulo 6. Aula 5
$ cd ../../..
$ cp -rf exemplo5.2 ../../no1/webapps
Figura 6.4:
76
Capı́tulo 6. Aula 5
worker.list=cluster
worker.cluster.type=lb
worker.cluster.balance_workers=no0,no1
worker.cluster.sticky_session=true
worker.no0.type=ajp13
worker.no0.host=127.0.0.1
worker.no0.port=8009
worker.no0.lbfactor=1
worker.no1.type=ajp13
worker.no1.host=127.0.0.1
worker.no1.port=8109
worker.no1.lbfactor=1
Foram definidos dois nós, vinculados a um balanceador, que é referenciado pelas diretivas JkMount
vistas no slide anterior
77
Capı́tulo 6. Aula 5
Figura 6.5:
worker.list=cluster,status
worker.status.type=status
...
78
Capı́tulo 6. Aula 5
Figura 6.6:
worker.cluster.sticky_session=false
79
Capı́tulo 7
Aula 6
Nesta aula finalizamos a apresentação dos recursos de clustering do Tomcat e temos uma introdução
ao monitoramento e tunning do servidor para obter maior performance
Tópicos:
80
Capı́tulo 7. Aula 6
Quando ocorrerem modificações nas sessões HTTP de um nó, estas modificações são transferidas
por meio de conexões TCP regulares para os demais nós presentes
Quando um novo nó entra no cluster (se torna ativo) ele localiza os demais nós e pede que cada
um lhe envie as informações atuais de todas as sessões HTTP
<Cluster className="org.apache.catalina.cluster.tcp.
SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.
session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership className="org.apache.catalina.
cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000" />
<!-- continua -->
81
Capı́tulo 7. Aula 6
<!-- continuaç~
ao -->
<Receiver className="org.apache.catalina.
cluster.tcp.ReplicationListener"
tcpListenAddress="127.0.0.1"
tcpListenPort="4100"
tcpSelectorTimeout="100"
tcpThreadCount="6" />
<Sender className="org.apache.catalina.
cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<!-- continua -->
Se você perdeu o modelo, porque o Admin remove todos os comentários do server.xml, recupere
o modelo original do arquivo ZIP de instalação do Tomcat
É muita coisa para digitar na mão, e a maioria nunca é alterada pelo administrador
Note que cada nó do cluster abre uma porta TCP adicional (respectivamente 4100 e 4101)
Reinicie os dois servidores Tomcat
82
Capı́tulo 7. Aula 6
Figura 7.1:
Figura 7.2:
83
Capı́tulo 7. Aula 6
84
Capı́tulo 7. Aula 6
<Cluster>
...
<Deployer className="org.apache.catalina.cluster.
deploy.FarmWarDeployer"
tempDir="/home/fernando/cluster/no0/war-temp/"
deployDir="/home/fernando/cluster/no0/webapps/"
watchDir="/home/fernando/cluster/no0/war-listen/"
watchEnabled="true"/>
<ClusterListener className="org.apache.catalina.cluster.
session.ClusterSessionListener"/>
...
</Cluster>
85
Capı́tulo 7. Aula 6
http://127.0.0.1/exemplo6.1
Acesse o exemplo 6.1 diretamente por cada nó, comprovando que o FarmWarDeployer fez a cópia
do no0 para o no1
http://127.0.0.1:8080/exemplo6.1
http://127.0.0.1:8180/exemplo6.1
86
Capı́tulo 7. Aula 6
Figura 7.3:
-Xms<size>
-Xmx<size>
-Xss<size>
Tamanho da pilha ()
$ java -Xmx256M
87
Capı́tulo 7. Aula 6
$ JAVA_OPTS=-Xmx256M ./startup.sh
export JAVA_OPTS=-Xmx256M
Figura 7.4:
MaxServers=3*10, MaxProcessors=2.2*10
MaxServers=30, MaxProcessors=22
88
Capı́tulo 7. Aula 6
removeAbandoned="true"
Instrui o Tomcat a forçar a liberação de conexões que parecam ter sido “abandonadas” (portanto,
“vazadas”)
removeAbandonedTimeout="300"
logAbandoned="true"
<Valve className="org.apache.catalina.cluster.tcp.
ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;
.*\.html;.*\.css;.*\.txt;.*\.swf"/>
89
Capı́tulo 7. Aula 6
<Receiver className="org.apache.catalina.cluster.
tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4000"
tcpSelectorTimeout="100"
tcpThreadCount="8"/>
<Sender className="org.apache.catalina.cluster.
tcp.ReplicationTransmitter"
replicationMode="synchronous"
ackTimeout="15000"/>
$ JAVA_OPTS="-Dcom.sun.management.jmxremote" ./startup.sh
Em seguida, verifique qual o processo da JVM que roda o Tomcat e conecte a este processo
usando o jconsole do JavaSE
$ ps ax | grep java
22587 pts/5 Rl :03/usr/java/jdk1.5.0/bin/java ...
$ jconsole 22587
90
Capı́tulo 7. Aula 6
Figura 7.5:
Figura 7.6:
Figura 7.7:
Observe que o Tomcat nomeia claramente os threads dos conectores, que são as responsáveis por
atender requisições
DataSources via JMX
91
Capı́tulo 7. Aula 6
Figura 7.8:
Todos os componentes do Tomcat são expostos como MBeans, então é possı́vel localizar o Data-
Source dentro do contexto e verificar a quantidade de conexões ativas (em uso)
Monitoração Remota via JMX
Forneça as propriedades do sistema para o agente JMX
$ export JAVA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=5000 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.
authenticate=false"
$ ./startup.sh
$ jconsole 127.0.0.1:5000
92
Capı́tulo 7. Aula 6
Protocolo HTTP
http://www.ietf.org/rfc/rfc2068.txt
Autenticação HTTP
http://www.ietf.org/rfc/rfc2617.txt
Certificados Digitais na Internet
http://www.ietf.org/rfc/rfc4387.txt
93
Referências Bibliográficas
94