我有两台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>
答案 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在更新时不会触及它等)。