Назад | Перейти на главную страницу

Tomcat7 не отправляет ответы удаленным клиентам

У меня Tomcat7 установлен на машине AWS EC2 под управлением Ubuntu 16.04. Я запускаю Tomcat7 на порте 8080 и с той же машины могу подключиться к локальному хосту 8080 через Telnet, выполнить «GET /» и просмотреть страницу индекса.

Однако, когда я подключаюсь к нему по telnet с другой машины, устанавливается соединение, я могу выполнить «GET /», но затем соединение закрывается без ответа. Я знаю, что он подключается к тому же серверу и службе, потому что я могу найти его на сервере с помощью netstat -an.

Если я выполняю недопустимую команду, например «XYZZY /», я получаю страницу ошибки Tomcat и запись в журналах. Но действительные команды не возвращают никакого ответа и не отображаются в журналах.

Что я сделал до публикации здесь:

Итак, как мне заставить Tomcat7 начать возвращать ответы удаленному клиенту?


server.xml (это был исходный 8080, но я изменил его, чтобы проверить, был ли это конфликт портов):

<Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" />

setenv.sh (на основе ответов на предыдущие вопросы, которые казались отдаленно похожими; принудительное использование urandom для энтропии и адресов IPv4):

JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djava.security.egd=file:/dev/./urandom"

Локальный тест:

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.

Удаленный тест:

$ telnet xxx 8085
Trying xxx...
Connected to xxx.
Escape character is '^]'.
GET /
Connection closed by foreign host.

Если вместо GET / я выдаю 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.

Итак, я снова знаю, что подключаюсь к Tomcat.

Если я подключаюсь удаленно, но не сразу запускаю команду, а вместо этого выполняю на локальном компьютере netstat -an | grep 8085, я получаю:

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

Где yyy - мой удаленный адрес, поэтому я знаю, что соединение происходит правильно.

К сожалению, проблема заключалась в том, что брандмауэр проверял порт и, таким образом, убивал запросы. Итак, все, что начинается с «GET», блокировалось исходящим, поэтому я видел результаты, которые я сделал. Поменял на 80 порт и вдруг все работает.