当前位置: 首页 > 知识库问答 >
问题:

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

穆建华
2023-03-14

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

hostA运行CentOS 5,hostB运行CentOS 7。

host B运行Apache 2.4. x和Tomcat 8.5.9。所有的网络流量都被路由到端口443(例如。HTTPS)的Apache Web服务器主机B。然后,所有Web应用程序流量(例如https://www.example.com/mywebapp/somepage)通过端口8009上mod_jk版本1.2.42传递给Tomcat。另外,host B Apache Web服务器被配置为监听192.168.0.2端口8009(host A Apache Web服务器未被配置为这样)。

如果hostA试图从浏览器或命令行访问hostB上的网页(通过hostB外部IP地址),例如:[root@hostA~]#curl-Ihttp://www.example.com/mywebapp/somepage

它返回状态200(良好)。

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

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

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

CATALINA_OPTS="-Djava.net.preferIPv4Addresses=true" 

这并没有改变结果。

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

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

Listen 192.168.0.2:80 
Listen 192.168.0.2:443 

到host Bhttpd.conf文件。我没有创建虚拟主机(可以吗?)。我没有修改httpd.conf

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

更新1(配置文件)

/etc/httpd/conf/workers.properties(mod_jk,主机B)

# Define one real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
# (don't open 8009 in firewall to outside world)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

以下内容被添加到主机Bhttpd.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"

以下内容被添加到虚拟主机中的主机httpd.conf包括端口80和443的部分www.example.com外部IP(我需要类似的内部IP吗?这是问题吗?):

# Send all http://example.com/mywebapp/* requests to Tomcat 
<IfModule jk_module>
   JkMount /mywebapp/* worker1
   JkMount /mywebapp worker1
</IfModule>

$CATALINA_HOME/conf/CATALINA/localhost/mywebapp。xml(hostB)

<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>

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

$CATALINA_HOME/conf/server。xml(hostB)

<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>

共有1个答案

苏振国
2023-03-14

我读了(http://httpd.apache.org/docs/2.4/vhosts/examples.html,请参阅第三节,标题为在不同的IP地址(例如内部和外部地址)上提供相同的内容,可以轻松修改现有虚拟主机(VH)

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

要通过这样做来说明本地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各一个),并将其粘贴到<-plhd--1/>全局文件,使用WHM提供的包含编辑器,并将外部IP地址更改为刚刚粘贴的代码的内部IP地址。

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

 类似资料:
  • 问题内容: 我在Windows 7上运行Tomcat 5.5实例(端口:8089)。 如果我打开http:// localhost:8089 / ,服务器将正常运行,但是在http://192.168.1.100:8089/上却给我一个错误(连接被拒绝) 我以为这是防火墙问题…所以我禁用了它,但是我仍然没有运气。 提前致谢。 解决了: 在连接器字符串中添加了 地址=“ 0.0.0.0” ,就可以了

  • 我已经检查了netstat并且能够找到处于侦听状态端口8080 C:\users\administrator>netstat-ano findstr“8080” TCP 0.0.0.0:8080 0.0.0.0:0侦听540 如有任何帮助,我们将不胜感激。谢谢你。

  • 我制作了Spring web应用程序示例项目。我做了所有的基本配置,基于java的配置和servlet 3.0web.xml.但在所有这些配置后,当我打网址它给我404错误。会有什么问题。有人能帮帮我吗? 网状物xml: 配置java类: 控制器: 当我试图访问这个网址 它给我404错误。虽然当我直接访问jsp页面时,它显示该页面。

  • 这是我在stackoverflow中的第一个问题!WOW:) 在这个问题上,我简直不知所措:(我有一个简单的helloworld Web服务,构建WAR文件并将其部署在本地主机上的tomcat(8.0.35)上。明确地说:我刚刚写了一个类,用@WebService注释;然后我写了网络。xml和sun jaxws。xml;我什么都没做!这足以让该类成为Web服务吗?我是否错过了另一步? 问题:网址:

  • 我的spring boot应用程序正常启动,没有任何错误或警告,我在控制台中看到所有URL映射如下所示: 2019-01-25 13:26:56.157 INFO 1020---[ost-startStop-2]S.W.S.M.M.A.RequestMappingHandlerMapping:将“{[/auth/useraccessToken],methods=[POST]}”映射到公共java.

  • 注意:这里有类似的问题,但没有一个解决方案对我有效。我花了几天的时间想把它弄好。 我已经将一个WAR文件部署到Tomcat,“Tomcat Web Application Manager”显示它已经启动。当我点击web应用程序“/forecaster”时,我得到一个404错误。web应用程序在从调试器(IntelliJ)运行时工作。WAR文件名为“forecaster.WAR”,我尝试过的路径是: