Java 404在本地IP上使用Tomcat访问web应用程序URL时出错,但在外部IP上工作正常
我有两台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(良好) 现在,如果我修改hostAJava 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服务
/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
到hostBhttpd.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>