404错误通过本地IP访问使用Tomcat的Web应用程序URL,但与外部IP

时间:2017-01-09 14:07:14

标签: java apache tomcat mod-jk

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

hostA运行CentOS 5和hostB CentOS 7.

hostB运行Apache 2.4.x和Tomcat 8.5.9。所有Web流量都被路由到Apache Web服务器hostB的端口443(例如HTTPS)。然后,所有Web应用程序流量(例如https://www.example.com/mywebapp/somepage)将通过端口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 http://www.example.com/mywebapp/somepage

它返回状态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" 

这并没有改变结果。

作为另一条线索,我发现当访问www.example.com中不属于/ mywebapp的任何hostB网页时,hostA始终报告状态200(好),内部和外部IP地址。

我应该提一下,配置hostB(例如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)

# 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

以下内容添加到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包含外部IP的www.example.com端口80和443的部分(内部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 / web应用/ 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 个答案:

答案 0 :(得分:0)

我看过{http://httpd.apache.org/docs/2.4/vhosts/examples.html,请参阅标题为Serving the same content on different IP addresses (such as an internal and external address)的第3部分 那个人可以轻松修改现有的虚拟主机(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控制/维护,手动编辑将被覆盖。

因此,我唯一的选择是从httpd.conf复制现有的整个VH代码作为外部IP地址(在我的情况下是两个VH部分:端口80和443各一个),并将其粘贴到{ {1}}文件使用WHM提供的Includes Editor,并将外部IP地址更改为刚粘贴的代码的内部IP地址。

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