【问题标题】:Unable to access tomcat manager 8080 in Google Cloud无法访问 Google Cloud 中的 tomcat manager 8080
【发布时间】:2017-12-14 15:52:19
【问题描述】:

我一直在使用 Amazon EC2 运行我的 Tomcat+MySQL 网站,现在正在迁移到 Google Cloud Platform。我启动了一个计算引擎实例(Ubuntu 16.04),通过 ssh 连接到它并使用 apt-get 安装 mysql/tomcat7。

我遇到的问题是tomcat启动不了。 catalina.out 日志没有“Server startup at xxxms”消息,我无法通过浏览器连接到 8080 端口。

catalina.out 的最后几行是

Jul 10, 2017 7:06:20 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 928 ms
Jul 10, 2017 7:06:20 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina
Jul 10, 2017 7:06:20 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.68 (Ubuntu)
Jul 10, 2017 7:06:20 PM org.apache.catalina.startup.HostConfig deployDescriptor INFO: Deploying configuration descriptor /etc/tomcat7/Catalina/localhost/host-manager.xml
Jul 10, 2017 7:06:21 PM org.apache.catalina.startup.TldConfig execute INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

当我使用netstat查看时,显示用户tomcat7正在监听8080

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      115        32984       -   

$ id -u tomcat7  
$ 115           

我尝试在 ssh 终端中 wget localhost:8080,它显示

Connecting to localhost (localhost)|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response... 

然后就挂在那里。

任何想法或建议将不胜感激!

更新

事实证明,防火墙不是问题的根本原因,即使不允许端口 8443,Tomcat 也可以工作(因为你需要允许 8080)。没有显示“Server started”消息的原因是Tomcat启动时间过长(第一次1346049 ms,重新启动时354034 ms,除了默认的index.html没有安装Web应用程序),原因是没有响应请求也是还没启动完毕。

这是我第一次看到 Tomcat 需要这么长时间才能启动,也是我一开始没有意识到它的原因。我怀疑(通过一些搜索)这是由 Tomcat Jar 扫描引起的。一旦我有更多细节,将继续更新这个问题。

更新 - 问题已解决

原来我遇到了同样的问题here,解决方法是here。简而言之,大部分时间都花在了以下任务上:

Creation of SecureRandom instance for session ID generation using [SHA1PRNG]

这需要 Java 加载 /dev/random 以获取随机数。 /dev/random 通常从键盘/鼠标输入中获取其熵源,这在无头虚拟机上无法提供足够的随机性。这会导致随机数在计算过程中“用完”并导致大量等待。解决方案是安装 haveged,它使用其他来源来提供随机性(链接中的详细信息)。

我安装了haveged,现在tomcat启动只需1秒,一切正常。

【问题讨论】:

    标签: tomcat7 google-cloud-platform google-compute-engine


    【解决方案1】:

    感谢您提出如此有趣的问题。

    我从未使用过 Google Cloud 服务,但我设法复制了您的问题。

    reading a little 之后我发现你需要更新你的防火墙规则以启用对 8080 端口的访问。

    转到:

    1)(汉堡图标,左上角) 2) 联网 3) 防火墙规则 4) 添加新的

    我使用以下属性创建了一个名为“allow-tomcat7”的文件:

    Descripción
    
    Enables Tomcat 7 access
    Red
    
    default
    Prioridad
    
    1000
    Dirección
    
    Entrada
    Acción tras coincidencia
    
    Permitir
    Filtros de origen
    
    Intervalos de IP    
    0.0.0.0/0
    Protocolos y puertos
    
    tcp:8080
    tcp:8443
    udp:8080
    

    编辑配置时有一个“目标标签”选项,尽管我创建了一个“标签”并将其仅应用于我的新 EC 实例,但它不起作用。我不得不删除目标标签,它就像一个魅力:

    确保您只允许访问您的 IP 地址!

    你需要调整你的安全设置,否则你会变成一个蜜罐,一旦我为每个人启用了端口,几个机器人开始扫描它:

    daychuzleo@testing-tomcat:~$ sudo tcpdump -i ens4 port 8080
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ens4, link-type EN10MB (Ethernet), capture size 262144 bytes
    
    20:39:31.437634 IP 170.251.221.183.54162 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [.], seq 1638030511:1638030512, ack 1250919796, win 259, length 1: HTTP
    20:39:31.437665 IP testing-tomcat.c.hip-river-163201.internal.http-alt > 170.251.221.183.54162: Flags [.], ack 1, win 231, options [nop,nop,sack 1 {0:1}], length 0
    
    20:39:37.133899 IP 170.251.221.183.53878 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [.], seq 2436191518:2436191519, ack 4071767590, win 259, length 1: HTTP
    20:39:37.133930 IP testing-tomcat.c.hip-river-163201.internal.http-alt > 170.251.221.183.53878: Flags [.], ack 1, win 222, options [nop,nop,sack 1 {0:1}], length 0
    
    20:39:51.379839 IP 170.251.221.183.54162 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [F.], seq 1, ack 1, win 259, length 0
    20:39:51.392375 IP 170.251.221.183.47923 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [S], seq 1420913913, win 8192, options [mss 1386,nop,wscale 8,nop,nop,sackOK,unknown-76 0x01010a18e9680005,unknown-76 0x0c01,nop,eol], length 0
    20:39:51.392410 IP testing-tomcat.c.hip-river-163201.internal.http-alt > 170.251.221.183.47923: Flags [S.], seq 507557961, ack 1420913914, win 28400, options [mss 1420,nop,nop,sackOK,nop,wscale 7], length 0
    20:39:51.421934 IP testing-tomcat.c.hip-river-163201.internal.http-alt > 170.251.221.183.54162: Flags [.], ack 2, win 231, length 0
    20:39:51.586555 IP 170.251.221.183.47923 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [.], ack 1, win 259, length 0
    20:39:51.590317 IP 170.251.221.183.47923 > testing-tomcat.c.hip-river-163201.internal.http-alt: Flags [P.], seq 1:389, ack 1, win 259, length 388: HTTP: GET / HTTP/1.1
    20:39:51.590337 IP testing-tomcat.c.hip-river-163201.internal.http-alt > 170.251.221.183.47923: Flags [.], ack 389, win 231, length 0
    

    我无法让它与 wget 一起工作,但我想你会发现它。

    更新:

    我忘了提一些你可能没有配置的东西:

    -在您的 VM 实例中允许 HTTP 和 HTTPS 防火墙:

    • 尝试使用网络导航器(Chrome、Firefox),不要使用 wget。
    • 确认您没有被公司防火墙过滤,尝试在您的手机或不受限制的网络中使用 4g 进行测试,或者只是要求您的 IT 团队允许您访问生成的临时公共 IP(和端口)(每次)。

      • 使用以下命令启动服务:

      sudo service tomcat7 启动

      • 尝试重新安装tomcat

    我做过的其他事情(在研究过程中)

    • 将服务移至 IPV4 而不是 IPV6

      daychuzleo@testing-tomcat:~$ netstat -ntpl (并非所有进程都可以识别,非拥有进程信息 不会显示,你必须是 root 才能看到它。) 活动 Internet 连接(仅限服务器) Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称 tcp 0 0 0.0.0.0:22 0.0.0.0:* 听 -
      tcp 0 0 0.0.0.0:8080 0.0.0.0:* 听 -
      tcp6 0 0 :::22 :::* 听 -

    为此,编辑默认的 tomcat 并在 JavaOPTS 中添加 IPV4 选项:

    vim /etc/default/tomcat
    
    JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true"
    

    禁用 8443 重定向

    注释 server.xml 中的“redirectPort”部分:

    vim /etc/tomcat/server.xml 
    
     <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   URIEncoding="UTF-8"
                   address="0.0.0.0"/>
                   <!--redirectPort="8443" />-->
    

    通过重新启动您的 tomcat 实例来验证每个更改。

    【讨论】:

    • 谢谢!你确实是对的。我忘了在问题中提到这一点,但我添加了一个防火墙规则以允许 8080。但是我不允许 8443,我认为这是失败的根本原因。再次感谢您的时间和精力!
    • 呃...我回来了更多细节,似乎防火墙不是根本情况。请查看我对问题的更新
    • 我想我找到了根本原因并在问题描述中更新了它。谢谢!
    • @Harper 很奇怪,您必须安装其他东西才能使其在您的环境中工作。
    • 我同意。我在 EC2 上没有遇到这样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2011-02-20
    • 2012-02-02
    • 2020-10-28
    相关资源
    最近更新 更多