apache多域名转发至tomcat&https设置&虚拟主机的设置

    技术2022-05-19  20

    最近忙于工作中的apache+tomcat的多域名转发,一个看起来非常简单的工作,实际做起来并没有想象中那么容易。为了将来的工作方便,必须先记录下来。

    整个流程分成以下几个要点

    1.apache如何转发多域名至tomcat

    2.https如何转发

    3.无应用名称如何设置

    4.如何远程部署多域名的应用

    5.如何拒绝其他域名访问

     

    一共有三个应用

    app.xxx.com,

    dl.xxx.com

    wap.xxx.com,

    前两个应用部署在tomcat1上

    第三个应用部署在tomcat2上

     

    1.apache如何转发多域名至tomcat

    针对第一个问题,其实非常简单。

    原本没有apache转发,直接打开了多个应用的端口

    例如:tomcat1 打开8080端口

          tomcat2 打开9090端口

    访问应用时必须采用这种方式app.xxx.com:8080/app/xxxservlet

     

    改为apache打开80端口,由apache转发不同的域名到内网不同的tomcat应用上

    访问的方式为app.xxx.com/xxxservlet即可

    这样有两个好处

    1.对外网只暴露80端口,其他端口不开放

    2.省略应用名称

    app.xxx.com---------->apache:80------------->tomcat1:

    dl.xxx.com---------->apache:80------------->tomcat1:

    wap.xxx.com---------->apache:80------------->tomcat2:

    编辑 /etc/httpd/conf/httpd.conf

    <VirtualHost *:80>    ServerName wap.xxx.com    ProxyPreserveHost On    ProxyRequests Off

        ProxyPass / http://localhost:9080/    ProxyPassReverse / http://localhost:9080/

        ErrorLog logs/wap.xxx.com_error_log    CustomLog logs/wap.xxx.com_access_log common</VirtualHost>

    重启service httpd restart

     

    2.https如何转发

    多域名转发解决了之后,发现https的需求并没有解决。关于如何配置tomcat https,如何生成证书,可以写在另一篇文章里,这里就不多说了。

    我原来的设想是

    客户端-----https---------->apache转发--------https--------->tomcat

    后来发现

    客户端-----https---------->apache转发--------http--------->tomcat

    这种方式也可以。

    好处是证书只需要在apache端配置即可,tomcat不需要配置,不需要打开8443端口

    在http.conf中配置

    LoadModule ssl_module modules/mod_ssl.so

    include conf/httpd-ssl.conf

    <IfModule ssl_module>SSLRandomSeed startup builtinSSLRandomSeed connect builtin</IfModule>

    在httpd-ssl.conf中配置

    Listen 443

    NameVirtualHost *:443

    <VirtualHost *:443>SSLProxyEngine  On#   General setup for the virtual host#DocumentRoot "/etc/httpd//htdocs"ServerName app-test.9d.vc:443##add forProxyPreserveHost onProxyPass /server-status !ProxyPass / http://localhost:8080/app/ProxyPassReverse / http://localhost:8080/app/

    SSLEngine on

    SSLCertificateFile conf/ssl.crt/ncppserver.cer

    SSLCertificateKeyFile conf/ssl.crt/ncppserver.key

    </VirtualHost>

     

    3.无应用名称如何设置

    配置完之后,又发现了新问题。wap站的页面内部跳转都是采用

    request.getContextPath()+pagePath 的方式结合。

    当点击wap.xxx.com进入主站时没有问题,

    可是点击页面中的链接时会出现wap.xxx.com/wap/something.jsp这样的链接

    也就是说所有的链接会自动加上wap这个ContextPath

    有两种解决方案

    1. 将应用中所有的contextPath全部去掉,改为/

    这样带来的坏处不言自明,相当于修改代码去适应部署环境,

    如果部署环境变了,难道还需要再修改代码么?

    2. 修改环境配置。

    我采用了第二种方案

    第二种方案又有两种实现方法

    a.单独配置tomcat,将tomcat的默认应用设置为所需要的应用

    tomcat2即如此配置:

    只需要在server.xml中配置localhost 的Host节点中增加一句

     <Context path="" docBase="wap" debug="0" reloadable="true"/>

    其中wap是部署在webapps中的应用

     

    b.在tomcat中配置虚拟主机

    tomcat1即如此配置

    在server.xml中配置,增加dl.xxx.com域名的Host节点如下

          <Host name="dl.xxx.com" appBase="dl.xxx.com/webapps"       unpackWARs="true"        xmlValidation="false" xmlNamespaceAware="false">       <Context path="" docBase="dl" debug="0" reloadable="true"/>

          </Host>

    appBase为相对于CATALINA_HOME的目录

    在这里建一个本虚拟主机的目录

    docBase为应用名

     

    4.如何远程部署多域名的应用

    增加了一个虚拟主机后,带来一个新问题,本来采用的是hudson远程部署的方法调用的是tomcat的远程部署url,如果远程部署虚拟主机的应用呢?思来想去,发现一个方法,在conf/Catalina/dl.xxx.com/目录里复制manager.xml即可.hudson的机器必须能解析dl.xxx.com.然后通过dl.xxx.com/manager即可远程部署

     

     

    5.如何拒绝其他域名访问

    在配置多域名时,发现一个问题:

    例如配置了app.xxx.com 转发到 app应用

    但是如果dl.xxx.com也指向此ip,则直接访问http://dl.xxx.com也能访问app应用

    这是我们不愿意看到的。

    故此在http.conf中增加第一个默认转发配置,原因是apache如果找不到某个域名的关联配置,将会使用第一个virtualHost的配置。

    <VirtualHost *:80>DocumentRoot /data/htdocs/nositeServerName *</VirtualHost>

    至于https的拒绝方案,暂时没有找到很好的,等待中...


    最新回复(0)