`

httpd设置反向代理

阅读更多
用httpd可以实现反向代理Reverse Proxy

官网的说明:

httpd also allows you to bring remote documents into the URL space of the local server. This technique is called reverse proxying because the web server acts like a proxy server by fetching the documents from a remote server and returning them to the client. It is different from normal (forward) proxying because, to the client, it appears the documents originate at the reverse proxy server.

实际配置也比较简单

先要加载一大堆跟proxy相关的module,因为我还没研究module,也不知道哪个是,就把看得像的都开了
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

最后一个不load会报错,是在httpd/logs/error_log里发现的。应该是某一个module依赖了它。但是我只是为了测试,用到最简单的跳转功能,应该是不需要开这么多的,后面再仔细研究下,现在先work起来
<IfModule proxy_module>
    ProxyPass /wfm/ http://localhost:8080/wfm/
</IfModule>

用directive ProxyPass,把所有匹配/wfm/的请求,都直接转发到后端的tomcat上,后端其实是一个servlet应用,context是wfm

后端有一个HelloWorldServlet
protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		writer.write("it works by servlet");
		writer.flush();
		writer.close();
	}

直接访问后端的web app也是可以的



但是通过反向代理来访问,应该要用httpd的端口



对于浏览器来说,它并不知道内容实际上是由后端服务器提供的,只会认为自己访问的是httpd server。这就是反向代理名字的由来

在这个例子里,httpd和tomcat在同一台server上,所以没有什么意义。实际上,一般httpd server会放在公网,而tomcat server放在内网(无公网IP),所以用户是不能直接访问到tomcat server的,对安全很有好处

如果换一个路径,比如http://localhost/wfm1/,httpd就不会做跳转了,会在本机的file system里找



通过这个最简单的示例,实现了基本的反向代理,不过要注意以下几点:

1、除了ProxyPass,还有相关的其他directive,比如ProxyPassReverse、ProxyPassReverseCookieDomain等,可以实现更复杂的配置,后面要研究一下

2、我感觉这种反向代理,就是简单的HTTP请求转发,应该有更好的方式。比如httpd和tomcat集成,有专门的通信协议AJP,应该会比较好(httpd也提供了proxy_ajp_module,tomcat里也有ajp protocol connector)

3、开发servlet app的时候,一般会有非常多的页面URL跳转,一定要写成相对路径,这样在做反向代理的时候会比较简单。如果跳转路径写死了,跟IP绑定,那么反向代理就没法做了(浏览器会直接访问servlet server,跳过了proxy)。不过这点跟做不做反向代理没有关系,是web app开发的一般原则
  • 大小: 17.6 KB
  • 大小: 17.2 KB
  • 大小: 9.4 KB
分享到:
评论
2 楼 kyfxbl 2013-07-08  
vavi 写道
apache+httpd我折腾过一星期,页面不停滴刷,然后就没响应了,不知道哪里配置的不对。。。最后换成nginx一下子搞定了。。

另外,就第3点的相对路径,我补充一下自己的理解,在大网站下,一般是不用相对路径的,因为浏览器每个域名有并发下载数限制,并且可以js,css等静态文件可以通过多域名迅速访问的。 用相对路径应该不太好实现多域名,这个仅是个人猜测。。。


额,我倒没遇到这种事额,可能我没怎么折腾它。。我也不停地刷试一下~~~最近在廊坊机房里捣鼓,我发现会点linux的命令很重要呀。有些问题光用jstack和jmap也看不出什么来,用操作系统的命令倒是能发现问题。现在越来越觉得,对于开发来说,部署能力也很重要

这里说的相对路径,主要指的是app的动态URL哈,写成绝对路径问题是很多的,像IP和端口什么的一变,URL就全跪了,很难改。你说的js、css这些静态文件,据我了解,一般不是放在app server上的,会放在专门的静态服务器上,还有CDN什么的,所以不影响
1 楼 vavi 2013-07-08  
apache+httpd我折腾过一星期,页面不停滴刷,然后就没响应了,不知道哪里配置的不对。。。最后换成nginx一下子搞定了。。

另外,就第3点的相对路径,我补充一下自己的理解,在大网站下,一般是不用相对路径的,因为浏览器每个域名有并发下载数限制,并且可以js,css等静态文件可以通过多域名迅速访问的。 用相对路径应该不太好实现多域名,这个仅是个人猜测。。。

相关推荐

Global site tag (gtag.js) - Google Analytics