青蛙学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:

1

主机B上不设置任何虚拟主机,直接使用修改后的Apache默认主页,内容如下:

<html><body><h1>192.168.0.110</h1></body></html>

访问http://192.168.0.110:

2

此时在主机A上进行反向代理配置,虚拟主机配置中添加如下内容(www.abc.com全站反向代理):

ProxyPass "/" "http://192.168.0.110/"
ProxyPassReverse "/" "http://192.168.0.110/"

重启主机A的Apache,然后访问www.abc.com:

3

此时访问www.abc.com已经被成功代理到主机B上了。

posted @ 2019-01-23 15:27  青蛙学Linux  阅读(475)  评论(0编辑  收藏  举报