apache代理分为正向代理和反向代理
客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器)
适用于:
①局域网的代理服务器(一般是网关,相当于squid的一般用法)
②访问某个受限网络的代理服务器,如教育网访问某些国外网站需要找代理
客户端能访问外部的web,但是不能访问目标web,目标web所在的网络内一台机器充当目标web的代理,客户端直接访问代理就像访问目标web一样(此代理对客户端透明,即客户端不用做如何设置,并不知道实际访问的只是代理而已,以为就是访问的目标)
适用于:
①idc的某台目标机器只对内开放web,外部的客户端要访问,就让另一台机器做proxy,外部直接访问proxy即相当于访问目标
②idc的目标机器的某个特殊的web服务跑在非正常端口如9000,而防火墙上只对外开放了80,此时可在80上做proxy映射到9000,外部访问80即相当于9000
机器192.168.254.100我们的reverse proxy server 并且apache/2.4.4运行在其80端口
上面有两个域名的虚拟主机
www.beyondjie.com
bbs.beyondjie.com
要实现的效果是:
访问 www.beyondjie.com 即相当于访问另一台机器192.168.254.10:8080
访问 bbs.beyondjie.com 即相当于访问另一台机器192.168.254.20:8000
apache的proxy功能由其proxy模块实现.加载模块有两种方式:静态和动态,现分别说明:
静态加载,在编译apache时候编译进去,编译参数如下:
"./configure" \
"-prefix=/usr/local/httpd"\
"--enable-so" \
"--enable-rewrite"\
"--with-mpm=prefork"\
"--enable-proxy" \ (这个参数即是代理模块启用)
安装完成后查看模块列表
/usr/local/httpd/bin/httpd -l
显示
Compiled in modules:
core.c
mod_access.c
mod_auth.c
mod_include.c
mod_log_config.c
mod_env.c
mod_setenvif.c
mod_proxy.c
proxy_connect.c
proxy_ftp.c
proxy_http.c
prefork.c
http_core.c
.......
编辑配置文件 httpd.conf
在虚拟主机部分
NameVirtualHost *:80(httpd-2.4.4不需要此项。2.2.*需要)
<VirtualHost *:80>
ServerAdmin JeckFY@vip.com
ServerName www.beyondjie.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://192.168.254.10:8080/
ProxyPassReverse / http://192.168.254.10:8080/
</VirtualHost>
<VirtualHost *:80>
ServerAdmin JeckFY@vip.com
ServerName bbs.beyondjie.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://192.168.254.20:8000/
ProxyPassReverse / http://192.168.254.20:8000/
</VirtualHost>
动态加载:编译进一个已经装好了的apache中,需要用到apxs工具
apxs是一个为ApacheHTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。
因此,要使用这个扩展机制,你的平台必须支持DSO特性,而且Apachehttpd必须内建了mod_so模块。前提是你支持动态模块加载DSO,即编译时有--enable-so选项,可通过如下命令查看当前是否含有mod_so.c模块
[root@Apache_Server ~]# httpd -l | grep so
mod_so.c
发现存在mod_so.c模块,那么apache就可以动态把proxy编译进去。
编译proxy需要的模块有:mod_proxy_httpNaNod_proxy.c proxy_util.c
步骤:
[root@Apache_Server ~]# cd /usr/src/httpd-2.4.4/modules/proxy/ [root@Apache_Server proxy]# /usr/local/httpd/bin/apxs -ciamod_proxy.c proxy_util.c mod_proxy_http.c [root@Apache_Server proxy]# egrep"mod_proxy.so|mod_proxy_http.so" /usr/local/httpd/conf/httpd.conf LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
提示:
-cia选项表示编译(compile)、安装(install)以及启动(active)--> a选项会自动添加如下模块在配置文件httpd.conf中
LoadModuleproxy_module modules/mod_proxy.so
LoadModuleproxy_http_modulemodules/mod_proxy_http.so
安装表示将.so文件放至Apache可以找到的位置,而启用则表示将模块加入httpd.conf文件
下面是虚拟主机添加的内容,和上面一样
NameVirtualHost *:80(httpd-2.4.4不需要此项。2.2.*需要) <VirtualHost *:80> ServerAdmin JeckFY@vip.com ServerName www.beyondjie.com ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://192.168.254.10:8080/ ProxyPassReverse / http://192.168.254.10:8080/ </VirtualHost> <VirtualHost *:80> ServerAdmin JeckFY@vip.com ServerName bbs.beyondjie.com ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://192.168.254.20:8000/ ProxyPassReverse / http://192.168.254.20:8000/ </VirtualHost>
注:
如果不加LoadModule proxy_http_modulemodules/mod_proxy.so,则浏览器页面打不开,页面显示
Forbidden
You don‘t have permission to access / on this server.
日志acess_log里面显示
192.168.0.28 - -[03/Jun/2009:16:16:27 +0800] "GET/?sessionId=4293567494722637330&rand=1244014624405&CONTEXT=0&page=com.othe
r.AjaxWhoWhatUpdate&xrand=1244016991554&wwRandId=1244014624405&wwBugId=2341&wwType=ViewHTTP/1.1" 403 315
或者
192.168.0.28 - -[03/Jun/2009:17:10:32 +0800] "GET / HTTP/1.1" 403 315
即403错误
日志error_log里面显示
[Wed Jun 03 17:08:46 2009] [warn] proxy: No protocol handler wasvalid for the URL /. If you are using a DSO version of mod_p
roxy, make sure the proxy submodules are included in theconfiguration using LoadModule.
apache查看模块状态的方法:
httpd -M
[root@Apache_Server conf]# httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
authn_file_module(shared)
authn_core_module(shared)
authz_host_module(shared)
authz_groupfile_module(shared)
authz_user_module(shared)
authz_core_module(shared)
access_compat_module(shared)
auth_basic_module(shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module(shared)
env_module (shared)
headers_module (shared)
setenvif_module (shared)
version_module (shared)
proxy_module (shared)
proxy_http_module(shared)
mpm_event_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
dir_module (shared)
alias_module (shared)
shared表示动态,static表示静态
客户端测试结果
做正向代理只需要修改配置文件,添加
<IfModule mod_proxy.c>
ProxyRequests On
<Proxy 192.168.254.100:80>
Order deny,allow
Deny from all
Allow from all
</Proxy>
</IfModule>
其中192.168.254.100:80 为代理服务器的ip地址和端口
即可
本文出自 “Study-Everyday” 博客,请务必保留此出处http://studys.blog.51cto.com/9736817/1591449
原文地址:http://studys.blog.51cto.com/9736817/1591449