利用Apache的转发模块实现反向代理服务器
时间:2016-03-16 01:11 来源:linux.it.net.cn 作者:IT
问题又来
公司的LAMP服务器使用Apache的VirtualHost功能部署了多个拥有独立域名的网站。httpd.conf配置文件部分如下:
# 省略本文无关部分
Listen 80
# www.xxx.com
<VirtualHost *>
ServerAdmin xxx@126.com
DocumentRoot "/var/www/xxx"
ServerName www.xxx.com
</VirtualHost>
# www.yyy.com
<VirtualHost *>
ServerAdmin yyy@126.com
DocumentRoot "/var/www/yyy"
ServerName yyy.com
ServerAlias www.yyy.com
</VirtualHost>
# 省略其他网站配置
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
可见,Apache侦听在80端口上,并依据域名来分发请求到不同的网站目录。
今天,公司决定在这个服务器上增加一个网站,该网站拥有独立域名zzz.com,使用JavaEE开发,基于Tomcat运行。
由于已经有Apache侦听80端口,所以独立运行的Tomcat必然无法再侦听这个端口。而客户要求必须以http://www.zzz.com的形式访问网站,而不能是http://www.zzz.com:8080。所以必须把Tomcat集成到Apache下面。
解决思路
要把Tomcat网站集成到Apache中,主要方式有两种。一是通过AJP协议,把Tomcat作为Apache的worker;二是使用mod_proxy和mod_proxy_http模块转发请求至Tomcat。
第一种方式,应该效率高,毕竟Tomcat也是Apache家的产品,集成起来相当稳定容易。 第二种方式,通用性强,不仅可以转发到Tomcat,还可以转发到任意的HTTP服务器程序,如IIS,另外的Apache实例。
根据个人爱好,我选择了第二种方式。
解决方案
首先让Tomcat侦听8080端口。
然后修改httpd.conf。
# 加载转发模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# 把对zzz.com的访问全部转发给Tomcat
<VirtualHost *>
ServerAdmin zzz@126.com
ServerName zzz.com
ServerAlias www.com
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
这样当用户访问 http://www.zzz.com的时候,Apache就会代替用户进而访问http://localhost:8080,并把取回的http数据再转发给用户。这也就是Apache的逆向代理功能,这个代理的过程对浏览器客户来说是不可感知的,某种程度上也保护和隐藏了Tomcat服务(因为Apache是通过内网http://127.0.0.1:8080访问Tomcat服务的,http://www.zzz.com:8080对外部互联网并不可见)。
与逆向代理(Reverse Proxy)相对应的是Apache的正向代理(Forward Proxy)功能,它需要浏览器端设置代理服务器。
将来扩展
这种方案其实具有很强的扩展性,对于缺少公网IP的Web服务器来说非常有意义。比如将来某天还需要部署一个基于IIS的网站。该网站域名为 aaa.com,运行在一个内网Windows机器上,IP地址为172.16.35.220,IIS侦听在80端口上。那么就可以通过Apache的逆向代理功能来部署。
<VirtualHost *>
ServerAdmin aaa@126.com
ServerName aaa.com
ServerAlias www.aaa.com
ProxyPass / http://172.16.35.220/
ProxyPassReverse / http://172.16.35.220/
</VirtualHost>
-
1
-
2
-
3
-
4
-
5
-
6
-
7
这样当用户访问http://www.aaa.com的时候,Apache就会从http://172.16.35.220/上读取数据并转发结果给用户。
(责任编辑:IT)
问题又来公司的LAMP服务器使用Apache的VirtualHost功能部署了多个拥有独立域名的网站。httpd.conf配置文件部分如下: # 省略本文无关部分 Listen 80 # www.xxx.com <VirtualHost *> ServerAdmin xxx@126.com DocumentRoot "/var/www/xxx" ServerName www.xxx.com </VirtualHost> # www.yyy.com <VirtualHost *> ServerAdmin yyy@126.com DocumentRoot "/var/www/yyy" ServerName yyy.com ServerAlias www.yyy.com </VirtualHost> # 省略其他网站配置
可见,Apache侦听在80端口上,并依据域名来分发请求到不同的网站目录。 今天,公司决定在这个服务器上增加一个网站,该网站拥有独立域名zzz.com,使用JavaEE开发,基于Tomcat运行。 由于已经有Apache侦听80端口,所以独立运行的Tomcat必然无法再侦听这个端口。而客户要求必须以http://www.zzz.com的形式访问网站,而不能是http://www.zzz.com:8080。所以必须把Tomcat集成到Apache下面。 解决思路要把Tomcat网站集成到Apache中,主要方式有两种。一是通过AJP协议,把Tomcat作为Apache的worker;二是使用mod_proxy和mod_proxy_http模块转发请求至Tomcat。 第一种方式,应该效率高,毕竟Tomcat也是Apache家的产品,集成起来相当稳定容易。 第二种方式,通用性强,不仅可以转发到Tomcat,还可以转发到任意的HTTP服务器程序,如IIS,另外的Apache实例。 根据个人爱好,我选择了第二种方式。 解决方案首先让Tomcat侦听8080端口。 然后修改httpd.conf。 # 加载转发模块 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so # 把对zzz.com的访问全部转发给Tomcat <VirtualHost *> ServerAdmin zzz@126.com ServerName zzz.com ServerAlias www.com ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ </VirtualHost>
这样当用户访问 http://www.zzz.com的时候,Apache就会代替用户进而访问http://localhost:8080,并把取回的http数据再转发给用户。这也就是Apache的逆向代理功能,这个代理的过程对浏览器客户来说是不可感知的,某种程度上也保护和隐藏了Tomcat服务(因为Apache是通过内网http://127.0.0.1:8080访问Tomcat服务的,http://www.zzz.com:8080对外部互联网并不可见)。 与逆向代理(Reverse Proxy)相对应的是Apache的正向代理(Forward Proxy)功能,它需要浏览器端设置代理服务器。 将来扩展这种方案其实具有很强的扩展性,对于缺少公网IP的Web服务器来说非常有意义。比如将来某天还需要部署一个基于IIS的网站。该网站域名为 aaa.com,运行在一个内网Windows机器上,IP地址为172.16.35.220,IIS侦听在80端口上。那么就可以通过Apache的逆向代理功能来部署。 <VirtualHost *> ServerAdmin aaa@126.com ServerName aaa.com ServerAlias www.aaa.com ProxyPass / http://172.16.35.220/ ProxyPassReverse / http://172.16.35.220/ </VirtualHost>
这样当用户访问http://www.aaa.com的时候,Apache就会从http://172.16.35.220/上读取数据并转发结果给用户。 (责任编辑:IT) |