Ubuntu EC2 服务器未连接到 Public-Tomcat7 和 GeoServer 的 IP 端口 8080
Ubuntu EC2 Server not connecting to Public-IP port 8080 for Tomcat7 & GeoServer
我们有一个服务器 运行 一个 Flask 应用程序,它使用 Tomcat7 下的 GeoServer 在内部为应用程序本身提供地图数据,并通过 WMS 在外部为经过身份验证的用户提供地图数据。
一切正常,直到一些次要代码 edit/reload、命令行 updates/upgrades 和重新启动(包括从 EC2 控制台重新启动)停止工作。
经过一些挖掘和调试,似乎系统的所有元素都单独工作正常,但是通过端口 8080 对 Tomcat7 和 GeoServer 的关键请求没有连接和超时(通常在大约 2 分钟后) .
我查看了很多类似问题的在线帮助,并检查、实施和测试了一些建议,但似乎没有什么能解决问题。
我不是专家(虽然我在这个过程中学到了很多东西!)而且我已经尝试了所有明显的和推荐的东西,据我所知。
我现在似乎在兜圈子(即无处可去),因此非常感谢收到关于我下一步可能尝试什么的任何建议。
背景信息:
- 具有 Public 和私有 IP,没有弹性 IP 或负载均衡器的 EC2 实例
- Ubuntu Xenial 16.04、Apache 2.4.18、Tomcat7、GeoServer 2.11.0
安全组已配置并应用到 EC2 实例,规则如下:
INBOUND RULES
Type Protocol Port Range Source
HTTP TCP 80 0.0.0.0/0
HTTP TCP 80 ::/0
Custom TCP Rule TCP 8080 x.x.x.x/32
Custom TCP Rule TCP 5432 x.x.x.x/32
SSH TCP 22 x.x.x.x/32
Custom TCP Rule TCP 443 0.0.0.0/0
Custom TCP Rule TCP 443 ::/0
OUTBOUND RULES
Type Protocol Port Range Destination
All traffic All All 0.0.0.0/0
域名解析Ok到PublicIP
- 防火墙已禁用 - sudo ufw status returns 'Status: inactive'
- 可以从 PuTTY 通过 SSH 连接到服务器
- 可以使用 http://Public-IP:8080/geoserver/web/
从浏览器访问 GeoServer Web Admin
检查 this post 并更新 /usr/share/tomcat7/bin/catalina.sh 以添加以下内容:
JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Ad=true "
检查了 this post 并更新了 /etc/tomcat7/server。xml 使连接器字符串:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443"
address="0.0.0.0"
useIPVHosts="true" />
使用 netstat 检查了在不同端口上侦听的内容:
root@ip-xxx-xx-xx-xx:/var/log/apache2# netstat -ltnpa | grep -i --colour LISTEN
tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN 1438/sendmail: MTA:
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1437/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1208/sshd
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1350/postgres
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1438/sendmail: MTA:
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 1437/java
tcp6 0 0 :::80 :::* LISTEN 1456/apache2
tcp6 0 0 :::22 :::* LISTEN 1208/sshd
tcp6 0 0 :::5432 :::* LISTEN 1350/postgres
tcp6 0 0 :::443 :::* LISTEN 1456/apache2
观察到的问题
调试显示 Flask 应用程序向 http://Public-IP:8080/geoserver/roar/wms 发送格式正确的请求?...但是对 urllib2.urlopen(req) 的调用抛出异常“[Errno 110] 连接超时”,用 abort(404).
报告
如果我获取请求字符串(使用 Public-IP)并将其粘贴到浏览器中,它就可以正常工作。请注意,这是 http:// 而不是 https:// - 不确定这是否重要 - 请参阅下面有关使用 https://
的说明
如果我使用 Public-IP 从命令行尝试 cURL,我收到超时消息:
connect to Public-IP port 8080 failed: Connection timed out
* Failed to connect to Public-IP port 8080: Connection timed out
* Closing connection 0
如果我使用本地主机从命令行尝试 cURL,例如到端口 8080 上的 Tomcat7,它可以工作…
$ curl -v localhost:8080/
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"1896-1493801565000"
< Last-Modified: Wed, 03 May 2017 08:52:45 GMT
< Content-Type: text/html
< Content-Length: 1896
< Date: Fri, 22 Jun 2018 09:39:46 GMT
<
<?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>
etc…….
如果我使用私有 IP 从命令行尝试 cURL,例如到端口 8080 上的 Tomcat7,它可以工作…
$ curl -v Private-IP:8080/
* Trying Private-IP...
* Connected to Private-IP (Private-IP) port 8080 (#0)
> GET / HTTP/1.1
> Host: Private-IP:8080
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"1896-1493801565000"
< Last-Modified: Wed, 03 May 2017 08:52:45 GMT
< Content-Type: text/html
< Content-Length: 1896
< Date: Fri, 22 Jun 2018 09:42:30 GMT
<
<?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>
etc…….
如果我简单地尝试使用带有域名或 Public-IP 的 http:// 从浏览器连接到端口 8080,我会得到 Tomcat7 index.html '它有效!响应。
如果我使用 https:// 尝试相同的操作,我会从 Mozilla 获得以下信息……
Secure Connection Failed
An error occurred during a connection to Public-IP:8080. SSL received a record that
exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG
The page you are trying to view cannot be shown because the authenticity of the received data
could not be verified.
和来自 IE(建议设置 开启)…
This page can’t be displayed
Turn on TLS 1.0, TLS 1.1, and TLS 1.2 in Advanced settings and try connecting to
https://Public-IP:8080 again. If this error persists, it is possible that this site uses an
unsupported protocol or cipher suite such as RC4 (link for the details), which is not considered
secure. Please contact your site administrator.
从Chrome…
This site can’t provide a secure connection
Public-IP sent an invalid response.
Try running Windows Network Diagnostics.
ERR_SSL_PROTOCOL_ERROR
如果 Flask 应用程序和 GeoServer 运行 在同一个 EC2 服务器上,它们应该通过 localhost
而不是私有 IP 或 Public-IP
相互通信
我们有一个服务器 运行 一个 Flask 应用程序,它使用 Tomcat7 下的 GeoServer 在内部为应用程序本身提供地图数据,并通过 WMS 在外部为经过身份验证的用户提供地图数据。
一切正常,直到一些次要代码 edit/reload、命令行 updates/upgrades 和重新启动(包括从 EC2 控制台重新启动)停止工作。
经过一些挖掘和调试,似乎系统的所有元素都单独工作正常,但是通过端口 8080 对 Tomcat7 和 GeoServer 的关键请求没有连接和超时(通常在大约 2 分钟后) .
我查看了很多类似问题的在线帮助,并检查、实施和测试了一些建议,但似乎没有什么能解决问题。
我不是专家(虽然我在这个过程中学到了很多东西!)而且我已经尝试了所有明显的和推荐的东西,据我所知。
我现在似乎在兜圈子(即无处可去),因此非常感谢收到关于我下一步可能尝试什么的任何建议。
背景信息:
- 具有 Public 和私有 IP,没有弹性 IP 或负载均衡器的 EC2 实例
- Ubuntu Xenial 16.04、Apache 2.4.18、Tomcat7、GeoServer 2.11.0
安全组已配置并应用到 EC2 实例,规则如下:
INBOUND RULES Type Protocol Port Range Source HTTP TCP 80 0.0.0.0/0 HTTP TCP 80 ::/0 Custom TCP Rule TCP 8080 x.x.x.x/32 Custom TCP Rule TCP 5432 x.x.x.x/32 SSH TCP 22 x.x.x.x/32 Custom TCP Rule TCP 443 0.0.0.0/0 Custom TCP Rule TCP 443 ::/0 OUTBOUND RULES Type Protocol Port Range Destination All traffic All All 0.0.0.0/0
域名解析Ok到PublicIP
- 防火墙已禁用 - sudo ufw status returns 'Status: inactive'
- 可以从 PuTTY 通过 SSH 连接到服务器
- 可以使用 http://Public-IP:8080/geoserver/web/ 从浏览器访问 GeoServer Web Admin
检查 this post 并更新 /usr/share/tomcat7/bin/catalina.sh 以添加以下内容:
JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Ad=true "
检查了 this post 并更新了 /etc/tomcat7/server。xml 使连接器字符串:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" address="0.0.0.0" useIPVHosts="true" />
使用 netstat 检查了在不同端口上侦听的内容:
root@ip-xxx-xx-xx-xx:/var/log/apache2# netstat -ltnpa | grep -i --colour LISTEN tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN 1438/sendmail: MTA: tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1437/java tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1208/sshd tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 1350/postgres tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1438/sendmail: MTA: tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 1437/java tcp6 0 0 :::80 :::* LISTEN 1456/apache2 tcp6 0 0 :::22 :::* LISTEN 1208/sshd tcp6 0 0 :::5432 :::* LISTEN 1350/postgres tcp6 0 0 :::443 :::* LISTEN 1456/apache2
观察到的问题
调试显示 Flask 应用程序向 http://Public-IP:8080/geoserver/roar/wms 发送格式正确的请求?...但是对 urllib2.urlopen(req) 的调用抛出异常“[Errno 110] 连接超时”,用 abort(404).
报告如果我获取请求字符串(使用 Public-IP)并将其粘贴到浏览器中,它就可以正常工作。请注意,这是 http:// 而不是 https:// - 不确定这是否重要 - 请参阅下面有关使用 https://
的说明如果我使用 Public-IP 从命令行尝试 cURL,我收到超时消息:
connect to Public-IP port 8080 failed: Connection timed out
* Failed to connect to Public-IP port 8080: Connection timed out
* Closing connection 0
如果我使用本地主机从命令行尝试 cURL,例如到端口 8080 上的 Tomcat7,它可以工作…
$ curl -v localhost:8080/
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"1896-1493801565000"
< Last-Modified: Wed, 03 May 2017 08:52:45 GMT
< Content-Type: text/html
< Content-Length: 1896
< Date: Fri, 22 Jun 2018 09:39:46 GMT
<
<?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>
etc…….
如果我使用私有 IP 从命令行尝试 cURL,例如到端口 8080 上的 Tomcat7,它可以工作…
$ curl -v Private-IP:8080/
* Trying Private-IP...
* Connected to Private-IP (Private-IP) port 8080 (#0)
> GET / HTTP/1.1
> Host: Private-IP:8080
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Accept-Ranges: bytes
< ETag: W/"1896-1493801565000"
< Last-Modified: Wed, 03 May 2017 08:52:45 GMT
< Content-Type: text/html
< Content-Length: 1896
< Date: Fri, 22 Jun 2018 09:42:30 GMT
<
<?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>
etc…….
如果我简单地尝试使用带有域名或 Public-IP 的 http:// 从浏览器连接到端口 8080,我会得到 Tomcat7 index.html '它有效!响应。
如果我使用 https:// 尝试相同的操作,我会从 Mozilla 获得以下信息……
Secure Connection Failed
An error occurred during a connection to Public-IP:8080. SSL received a record that
exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG
The page you are trying to view cannot be shown because the authenticity of the received data
could not be verified.
和来自 IE(建议设置 开启)…
This page can’t be displayed
Turn on TLS 1.0, TLS 1.1, and TLS 1.2 in Advanced settings and try connecting to
https://Public-IP:8080 again. If this error persists, it is possible that this site uses an
unsupported protocol or cipher suite such as RC4 (link for the details), which is not considered
secure. Please contact your site administrator.
从Chrome…
This site can’t provide a secure connection
Public-IP sent an invalid response.
Try running Windows Network Diagnostics.
ERR_SSL_PROTOCOL_ERROR
如果 Flask 应用程序和 GeoServer 运行 在同一个 EC2 服务器上,它们应该通过 localhost
而不是私有 IP 或 Public-IP