Ubuntu EC2 Server 未连接到 Tomcat7 和 GeoServer 的公共 IP 端口 8080



我们有一个运行Flask应用程序的服务器,该应用程序使用Tomcat7下的GeoServer在应用程序本身内部提供地图数据,并通过WMS向经过身份验证的用户提供外部地图数据。

这一切都工作正常,直到一些次要代码编辑/重新加载、命令行更新/升级和重新启动(包括从 EC2 控制台重新启动(之后,当事情停止工作时。

经过一番挖掘和调试,似乎系统的所有元素都可以单独工作,但是通过端口 8080 对 Tomcat7 和 GeoServer 的关键请求没有连接和超时(通常在大约 2 分钟后(。

我已经查看了许多针对类似问题的在线帮助,并检查,实施和测试了几个建议,但似乎没有任何方法可以清除障碍。

我不是专家(尽管我在这个过程中学到了很多东西!(,据我所知,我已经尝试了所有明显和推荐的东西。

我现在似乎在兜圈子(即无处可去(,所以任何关于我接下来可能尝试的建议都将不胜感激。

背景信息:

  • 具有公有和私有 IP 的 EC2 实例,没有弹性 IP 或负载均衡器
  • 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
    
  • 域名解析为
  • 公共 IP

  • 防火墙已禁用 -sudo ufw状态返回"状态:非活动">
  • 可以从 PuTTY 通过 SSH 连接到服务器
  • 可以使用 http://Public-IP:8080/geoserver/web/从浏览器访问 GeoServer Web 管理员
  • 检查了这篇文章并更新了/usr/share/tomcat7/bin/catalina.sh 以添加以下内容:

    JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Ad=true "
    
  • 检查了这篇文章并更新了/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( 报告。

如果我获取请求字符串(使用公共 IP(并将其粘贴到浏览器中,它可以工作。请注意,这是 http://而不是 https://- 不确定这是否重要 - 有关使用 https://的说明,请参阅下文

如果我使用公共 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,例如端口 7 上的 Tomcat8080,它可以工作......

$ 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,例如端口 7 上的 Tomcat80,它可以工作......

$ 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…….

如果我只是尝试使用域名或公共 IP 的 http://从浏览器连接到端口 8080,我会得到 Tomcat7 索引.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.

和从铬...

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 或公共 IP 进行通信

相关内容

最新更新