Eu tenho o Tomcat7 instalado em uma máquina AWS EC2 com o Ubuntu 16.04. Eu inicio o Tomcat7 na porta 8080 e, a partir dessa mesma máquina, posso fazer telnet para o localhost 8080, executar "GET /" e ver a página de índice.
No entanto, quando eu faço telnet para ele de uma máquina diferente, é feita uma conexão, posso executar "GET /", mas a conexão é fechada sem resposta. Eu sei que ele está se conectando ao mesmo servidor e serviço, porque eu posso encontrá-lo no servidor com netstat -an.
Se eu executar um comando inválido, por exemplo, "XYZZY /", recebo a página de erro do Tomcat e uma entrada nos registros. Mas os comandos válidos não retornam nenhuma resposta e não aparecem nos logs.
Coisas que fiz antes de postar aqui:
- Use netstat -an para garantir que a conexão esteja acontecendo conforme o esperado.
- Mova para a porta 8085 para garantir que não haja conflito com a porta.
- Aplique as configurações de setenv.sh para forçar o IPv4 conforme sugerido aqui ( link )
- Aplique as configurações de setenv.sh para usar o urandom sugerido aqui ( Tomcat7 trava na implantação de aplicativos )
Então, como faço para o Tomcat7 começar a retornar respostas para o cliente remoto?
server.xml (este era o original 8080, mas eu mudei para testar se era um conflito de porta):
<Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" />
setenv.sh (baseado em respostas de perguntas anteriores que soaram vagamente similares; forças urandom para entropia e endereços IPv4):
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djava.security.egd=file:/dev/./urandom"
Teste local:
xxx@xxx:~$ sudo /etc/init.d/tomcat7 restart
[ ok ] Restarting tomcat7 (via systemctl): tomcat7.service.
xxx@xxx:~$ telnet xxx 8085
Trying xxx...
Connected to xxx.
Escape character is '^]'.
GET /
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Apache Tomcat</title>
</head>
<body>
<h1>It works !</h1>
<snipped for brevity>
</body>
</html>
Connection closed by foreign host.
Teste remoto:
$ telnet xxx 8085
Trying xxx...
Connected to xxx.
Escape character is '^]'.
GET /
Connection closed by foreign host.
Se, em vez de GET /, eu emitir XYZZY /:
$ telnet xxx 8085
Trying xxx...
Connected to xxx.
Escape character is '^]'.
XYZZY /
<html><head><title>Apache Tomcat/7.0.68 (Ubuntu) - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 501 - Method XYZZY is not implemented by this servlet for this URI</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Method XYZZY is not implemented by this servlet for this URI</u></p><p><b>description</b> <u>The server does not support the functionality needed to fulfill this request.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.68 (Ubuntu)</h3></body></html>Connection closed by foreign host.
Então, novamente, sei que estou me conectando ao Tomcat.
Se eu me conectar remotamente mas não emitir imediatamente um comando, mas na máquina local executar netstat -an | grep 8085, eu recebo:
xxx:~$ netstat -an | grep 8085
tcp 0 0 0.0.0.0:8085 0.0.0.0:* LISTEN
tcp 0 0 xxx:8085 yyy:52329 ESTABLISHED
Onde yyy é meu endereço remoto, sei que a conexão está ocorrendo corretamente.