最近忙于工作中的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 builtin
SSLRandomSeed 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 for
ProxyPreserveHost on
ProxyPass /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/nosite
ServerName *
</VirtualHost>
至于https的拒绝方案,暂时没有找到很好的,等待中...