我在运行 Ubuntu 16.04 的 AWS EC2 机器上安装了 Tomcat7。我在端口 8080 上启动 Tomcat7,然后从同一台机器可以 telnet 到 localhost 8080,执行“GET /”,然后查看索引页。
但是,当我从另一台机器远程登录到它时,会建立连接,我可以执行“GET /”,但随后连接会关闭且无响应。我知道它正在连接到同一台服务器和服务,因为我可以使用 netstat -an 在服务器上找到它。
如果我执行无效命令,例如“XYZZY /”,我会得到 Tomcat 错误页面,并在日志中记录一条条目。但有效命令不会返回任何响应,也不会显示在日志中。
我在此发布之前所做的事情:
- 使用 netstat -an 确保连接如我预期的那样进行。
- 移至8085端口,确保不存在与端口冲突的情况。
- 按照此处的建议应用 setenv.sh 设置以强制 IPv4(https://askubuntu.com/questions/567093/tomcat7-is-listening-port-but-not-processes-requests)
- 应用 setenv.sh 设置以使用此处建议的 urandom (Tomcat7 在部署应用程序时挂起)
那么,如何让 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 是我的远程地址,所以我知道连接正在正确进行。
答案1
令人失望的是,问题出在防火墙进行端口验证,从而终止了请求。因此,以“GET”开头的任何内容都被阻止出站,这就是我看到结果的原因。将其更改为端口 80,突然一切都正常了。