/ 中存储网

Apache服务器转发相关配置

2013-11-10 14:16:01 来源:kejihao

最近忙于工作中的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>

注意: ProxyPass 需要开启下面模块:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

这两个模块,在httpd.conf中找见去掉前面的 # 号.

重启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的拒绝方案,暂时没有找到很好的,等待中...