Java 404在本地IP上使用Tomcat访问web应用程序URL时出错,但在外部IP上工作正常

Java 404在本地IP上使用Tomcat访问web应用程序URL时出错,但在外部IP上工作正常,java,apache,tomcat,mod-jk,Java,Apache,Tomcat,Mod Jk,我有两台Linux服务器通过交叉连接电缆连接,内部IP地址为192.168.0.1(hostA)和192.168.0.2(hostB) hostA运行CentOS 5,hostB运行CentOS 7 hostB运行apache2.4.x和tomcat8.5.9。所有web流量都被路由到Apache web服务器hostB的端口443(例如HTTPS)。然后,所有web应用程序流量(例如)通过端口8009上的mod_jk版本1.2.42传递给Tomcat。此外,hostB Apache web服务

我有两台Linux服务器通过交叉连接电缆连接,内部IP地址为192.168.0.1(hostA)和192.168.0.2(hostB)

hostA运行CentOS 5,hostB运行CentOS 7

hostB运行apache2.4.x和tomcat8.5.9。所有web流量都被路由到Apache web服务器hostB的端口443(例如HTTPS)。然后,所有web应用程序流量(例如)通过端口8009上的mod_jk版本1.2.42传递给Tomcat。此外,hostB Apache web服务器配置为在192.168.0.2端口8009上侦听(hostA Apache web服务器未进行此配置)

如果hostA尝试从浏览器或命令行访问hostB上的网页(通过hostB外部IP地址),例如: [root@hostA~]#curl-I

它返回状态200(良好)

现在,如果我修改hostA
/etc/hosts
文件,使hostA通过交叉连接电缆(例如192.168.0.2而不是外部IP地址)访问hostB网站(www.example.com),则网页返回错误404

我可以更改什么以获得状态200

我的网址是
xxx.xxx.xxx.xxx
(例如IPv4)。我知道Tomcat默认配置IPv6。因此,我修改了
setenv.sh
,如下所示:

CATALINA_OPTS="-Djava.net.preferIPv4Addresses=true" 
这并没有改变结果

作为另一个线索,我观察到hostA在访问www.example.com中任何不属于/mywebapp的hostB网页时,无论是内部IP地址还是外部IP地址,都会报告状态200(良好)

我应该提到,为了配置hosb(例如192.168.0.2)来监听hostA(例如192.168.0.1),我只添加了

Listen 192.168.0.2:80 
Listen 192.168.0.2:443 
到hostB
httpd.conf
文件。我没有创建虚拟主机(可以吗?)。我没有修改hostA上的
httpd.conf

有什么办法可以解决这个问题吗?我是Tomcat的新手,这是新机器上的新安装。提前谢谢你的建议

更新1(配置文件)

/etc/httpd/conf/workers.properties(用于mod_jk,hostB)

在Pre Main Include部分的hostB httpd.conf中添加了以下内容:

LoadModule jk_module /etc/httpd/modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk logs
JkLogFile /etc/httpd/logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
以下内容添加到虚拟主机中的hostB httpd.conf,包括www.example.com的端口80和443的部分,这些端口具有外部IP(我是否需要类似的内部IP?这是问题所在吗?):

#全部发送http://example.com/mywebapp/*对Tomcat的请求
JkMount/mywebapp/*worker1
JkMount/mywebapp worker1
$CATALINA_HOME/conf/CATALINA/localhost/mywebapp.xml(hostB)


$CATALINA_HOME/webapps/mywebapp/WEB-INF/WEB.xml

...
<resource-ref>
        <description>Connection pool #1.</description>
        <res-ref-name>jdbc/pool1</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>
...
。。。
连接池#1。
jdbc/pool1
javax.sql.DataSource
容器
...
$CATALINA_HOME/conf/server.xml(hostB)


...              
我读到(,见第三节,标题为
在不同的IP地址(如内部和外部地址)上提供相同的内容)
可以轻松修改现有虚拟主机(VH)


...
要通过执行来说明本地IP

<VirtualHost 192.168.0.1:80 xxx.xxx.xxx.xxx:80>
...
</VirtualHost>

...
其中,本地IP还可以包括通配符(例如192.168.0.*)

问题是我的
httpd.conf
文件由WHM根据服务器托管公司控制/维护,手动编辑将被覆盖

因此,我唯一的选择是从外部IP地址的
httpd.conf
复制现有的整个VH代码(在我的例子中有两个VH部分:端口80和443各一个),并使用WHM提供的Includes编辑器将其粘贴到
pre_virtualhost_global.confGlobal
文件中,并将刚刚粘贴的代码的外部IP地址更改为内部IP地址


请记住,您需要手动维护此部分(因为WHM在更新时不接触它,等等).

您应该提供主机B的tomcat的server.xml和mod_jk配置。@jlumietu,谢谢,作为上面的更新1。JkMount在VirtualHost标记中吗?如果是这样,这将解释为什么您会得到404。@ChrisM,是。
JkMount
仅出现在使用外部IP的端口80和443的
部分的
httpd.conf
中s、 我应该为内部IP端口8009创建一个虚拟主机吗?或者我可以将
JkMount/mywebapp/*worker1 JkMount/mywebapp worker1
添加到
httpd.conf
的Pre-Main Include部分或其他地方吗?这可能不是最优雅的解决方案,但是如果在VirtualHost标记之外添加JkMount,那么它应该可以在所有HTT上工作P请求,而不仅仅是与虚拟主机匹配的请求。
<Context>
  <Resource name="jdbc/pool1"
            auth="Container"
            type="javax.sql.DataSource"
            username="uname"
            password="pwd"
            driverClassName="oracle.jdbc.OracleDriver"
            url="jdbc:oracle:thin:@192.168.0.1:xxx:xxxx"
            maxTotal="256"
            maxIdle="8"
            initialSize="4"
            removeAbandonedTimeout="7200"
            removeAbandonedOnBorrow="true"/>

  <ResourceLink name="jdbc/pool1"
                global="jdbc/dpool1"
                type="javax.sql.DataSource"/>
</Context>
...
<resource-ref>
        <description>Connection pool #1.</description>
        <res-ref-name>jdbc/pool1</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
</resource-ref>
...
<GlobalNamingResources>
   ...              
   <Resource name="jdbc/pool1"
        auth="Container"
        type="javax.sql.DataSource"
        username="uname"
        password="pwd"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@192.168.0.1:xxx:xxxx"
        maxTotal="256"
        maxIdle="8"
        initialSize="4"
        removeAbandonedTimeout="7200"
        removeAbandonedOnBorrow="true"/>  
</GlobalNamingResources>
<VirtualHost xxx.xxx.xxx.xxx:80>
...
</VirtualHost>
<VirtualHost 192.168.0.1:80 xxx.xxx.xxx.xxx:80>
...
</VirtualHost>