青蛙学Linux—Apache反向代理的实现
1、反向代理需要的模块
要实现反向代理,需要打开以下模块:
# 在Apache主配置文件httpd.conf中取消以下行的注释 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
2、反向代理指令
2.1、ProxyPass指令
ProxyPass指令用于映射请求到后端服务器,主要用于URL前缀匹配,不支持正则,匹配到的URL路径将不会传递给后端服务器。ProxyPass指令语法如下:
ProxyPass "URL路径" !|"后端URL路径"
- !:指定的URL路径不进行代理
注意:这里的URL路径不会传递给后端服务器。比如,假设当前域名为xxx.com,ProxyPass “/image” “http://yyy.com”,此时当客户端访问http://xxx.com/image/1.jpg时,Apache向后端请求的路径为http://yyy.com/1.jpg。
注意:如果URL路径结尾带有/,则后端URL结尾也必须带有/,如ProxyPass “/image/” “http://yyy.com/”。
注意:全站代理必须设置为ProxyPass “/” “http://yyy.com/”(相当于URL路径结尾带/)。
2.2、ProxyPassReverse指令
与ProxyPass指令一起使用,以避免后端服务器的HTTP重定向造成绕过反向代理的现象。该指令的语法同ProxyPass指令,与ProxyPass一起使用时参数也与ProxyPass相同。
2.3、ProxyPassMatch指令
支持正则的ProxyPass指令。注意,使用该指令时,URL路径将传递给后端服务器。指令语法如下:
ProxyPassMatch "正则URL路径" !|"后端URL"
注意:匹配到的URL路径将传递给后端服务器。比如,假设当前域名为http://xxx.com,ProxyPassMatch “^/image” “http://yyy.com”,此时访问http://xxx.com/image/1.jpg,Apache向后端服务器请求的路径为http://yyy.com/image/1.jpg。
3、一个例子
实验环境:
- 主机A:IP地址为192.168.0.88,为前端服务器,设置虚拟主机www.abc.com
- 主机B:IP地址为192.168.0.110,为后端服务器,无虚拟主机设置,直接通过IP访问
主机A的虚拟主机设置如下:
<VirtualHost *:80> ServerAdmin xxx@xxx.com DocumentRoot "/data/www.abc.com" ServerName www.abc.com ServerAlias abc.com ErrorLog "logs/www.abc.com-error_log" CustomLog "logs/www.abc.com-access_log" common <Directory "/data/www.abc.com"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost>
指向的路径/data/www.abc.com下有index.html文件,内容为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>www.abc.com</h3> <h4>这是一个虚拟主机</h4> </body> </html>
在客户端主机上通过修改host文件做本地解析后,访问www.abc.com:
主机B上不设置任何虚拟主机,直接使用修改后的Apache默认主页,内容如下:
<html><body><h1>192.168.0.110</h1></body></html>
访问http://192.168.0.110:
此时在主机A上进行反向代理配置,虚拟主机配置中添加如下内容(www.abc.com全站反向代理):
ProxyPass "/" "http://192.168.0.110/" ProxyPassReverse "/" "http://192.168.0.110/"
重启主机A的Apache,然后访问www.abc.com:
此时访问www.abc.com已经被成功代理到主机B上了。