• 记录tomcat-9.0.65在apr模式下无法通过IP访问问题排查和处理


     一、项目背景

    由于项目需要,我们要使用最新版本tomcat9.X来部署项目,同时需要以apr的模式启动来处理一些高并发需求

    二、项目环境

    操作系统:        Window10/Server2016

    Tomcat版本:        apache-tomcat-9.0.65 x64

    (这个版本是内置了tomcat-native-1.2.35,不需要单独下载)

    Java版本:OpenJDK 64-Bit 1.8.0_332 (Temurin)

    三、问题描述

    tomcat配置apr模式后能够正常启动,没有任何报错信息。发现用localhost的方式来访问应用是正常的,但是换成127.0.0.1或者是本地的ip地址来访问,就出现访问不了的情况。telnet IP+端口不通,但是protocol切换成NIO就能正常浏览器访问和telnet也是正常。猜测问题的确出在apr模式上。但是为什么apr模式会有问题,默认模式没有问题呢?

    四、问题排查

    用cmd netstat命令查看了一下绑定的端口

    netstat -ano | findstr  8888

    在apr模式下:

    可以看到5820端口有在正常的listening状态。但是ip地址有些奇怪。

    换回nio模式:

    在NIO模式下,会有两个地址绑定,一个是IPv4,一个是IPv6。而在APR模式下只有一个IP6的地址绑定。那么问题就在于tomcat的地址绑定上。为什么NIO模式会有IPv4和IPv6,而APR模式只有IPv6呢?所以APR模式导致用本机地址127.0.0.1(IPv4)无法访问 。

    这里具体原因可以从tomcat源码里面去探究(暂时掠过)

    文档地址:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#HTTP/2_Support

     address    


    对于具有多个IP地址的服务器,此属性指定将用于侦听指定端口的地址。默认情况下,连接器将侦听所有本地地址。除非JVM被配置以其他方式使用的系统属性,基于Java连接器(NIO,NIO2)将当与任一被配置在两个IPv4和IPv6地址听0.0.0.0或::。如果配置为0.0.0.0,则APR /本机连接器将仅侦听IPv4地址,如果配置为 ,则将侦听IPv6地址(以及可选的IPv4地址,具体取决于ipv6v6only的设置)::。

     ipv6v6only    
    如果在双堆栈系统上侦听IPv6地址,连接器是否应该仅侦听IPv6地址?如果未指定,则默认值为false,并且连接器将侦听IPv6地址和等效的IPv4地址(如果存在)。

    五、解决方案

    在tomcat配置server.xml中手工指定地址 address="0.0.0.0"

    修改后重新启动tomcat

    apr模式再次查看

     

     有外部访问的时候

    最终大功告成!问题解决了。

    附上完成的server.xml内容

    1. <Server port="8005" shutdown="SHUTDOWN">
    2. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    3. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    4. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    5. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    6. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    7. <GlobalNamingResources>
    8. <Resource name="UserDatabase" auth="Container"
    9. type="org.apache.catalina.UserDatabase"
    10. description="User database that can be updated and saved"
    11. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    12. pathname="conf/tomcat-users.xml" />
    13. GlobalNamingResources>
    14. <Service name="Catalina">
    15. <Connector port="8888"
    16. protocol="org.apache.coyote.http11.Http11AprProtocol"
    17. address="0.0.0.0"
    18. enableLookups="false"
    19. maxThreads="1000"
    20. minSpareThreads="100"
    21. acceptCount="1500"
    22. disableUploadTimeout="true"
    23. connectionTimeout="20000"
    24. URIEncoding="UTF-8"
    25. redirectPort="8443"
    26. compression="on"
    27. compressionMinSize="1024"
    28. useSendfile="false"
    29. noCompressionUserAgents="gozilla, traviata"
    30. compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript "/>
    31. <Engine name="Catalina" defaultHost="localhost">
    32. <Realm className="org.apache.catalina.realm.LockOutRealm">
    33. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    34. resourceName="UserDatabase"/>
    35. Realm>
    36. <Host name="localhost" appBase="webapps"
    37. unpackWARs="true" autoDeploy="true">
    38. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    39. prefix="localhost_access_log" suffix=".txt"
    40. pattern="%h %l %u %t "%r" %s %b" />
    41. Host>
    42. Engine>
    43. Service>
    44. Server>

  • 相关阅读:
    python的简单爬取
    【Pycharm 安装Django报错显示:ERROR: Failed building wheel for backports.zoneinfo】
    聊一聊 HBase 是如何写入数据的?
    Docker无法连接到docker守护程序
    大量数据同步
    线程安全使用 HashMap 的四种技巧
    如何进行日期和时间的计算和操作?
    如何在Vue3.2的setup中设置组件名、在vben-admin中实现页面缓存?
    贪心算法-寻找硬币
    写论文有哪些注意事项呢?
  • 原文地址:https://blog.csdn.net/gmaaa123/article/details/125926232