我有一个网站,我正试图转换为一个码头组成的解决方案。
网站的一部分是内容管理系统(WordPress ),还有一些Java web应用程序目前由tomcat处理。
当前的方法是我有一个官方的WordPress容器和一个官方的Tomcat容器。我将我的自定义内容加载到WordPress中(通过MySQL容器,这实际上不是这个问题的一部分),并将WAR文件加载到tomcat中。
所以问题是: WordPress网站的某些部分有到Java应用程序的链接。以前,这些链接中的一些是像/Application1
一样简单的相对链接,用户将能够访问Java应用程序。
现在,因为它们被托管在不同的容器中,所以我不能这样做,因为WordPress容器中没有名为"Application1“的东西。我已经用如下的RewriteRules修改了WordPress容器的htaccess文件:
# Tomcat exposes port 8085
RewriteRule ^.*Application1/(.*)$ http://localhost:8085/Application1/$1 [R,L]
但这意味着,如果用户在wordpress中点击Application1的链接,他们的浏览器会将他们重定向到localhost:8085
-如果你在本地运行这组容器,它工作得很好,但对远程用户不起作用。
我可以将localhost
更改为将在其上运行此操作的服务器的实际名称。但是,它需要为运行此堆栈的每个服务器手动更新,或者为开发人员重置为localhost。
我可以将WordPress和Tomcat合并到一个容器中,但我们希望将它们分开,这样当我们需要升级时,我们只需更改我们拉取的容器的版本,而不必从头开始重新构建一个自定义容器。
有没有一种更无缝的方法来做到这一点,使用户浏览器中的URL永远不会改变?有没有办法让它正常工作,使远程用户甚至不知道站点的不同部分托管在不同的容器中?
发布于 2017-07-27 16:39:22
假设您在开发中和生产中使用docker-compose,那么您将用相应上游的servicename
替换localhost
。
假设你有3个容器: httpd,fpm ( wordpress)和java ( tomcat )。配置httpd,如果请求是domain.tld/php,则重定向到fpm:9000
;如果请求是domain.tld/Application1,则重定向到java:8086
。
您需要了解的是,您在docker-compose中拥有的实际服务名在容器(所有容器)中作为主机名可用-因此容器可以使用其他容器的服务名到达自己-这使得容器间的通信非常容易和可预先配置,而无需知道实际的容器in (在开发/生产和主机迁移过程中会发生变化)
发布于 2017-07-27 19:22:13
我想我已经弄明白了:我应该使用代理而不是RewriteRule。
这似乎得到了我想要的:
ProxyPass "/Application1" "http://my-tomcat-server:8080/Application1"
ProxyPassReverse "/Application1" "http://my-tomcat-server:8080/Application1"
https://stackoverflow.com/questions/45356050
复制