理论部分
反向代理负载均衡之APACHE
一、反向代理
1.1 介绍反响代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
1.2 反向代理的工作方式
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为在Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就增强了Web服务器的安全性。
反向代理方式和包过滤方式或普通代理方式并无冲突,因此可以在防火墙设备中同时使用这两种方式,其中反向代理用于外部网络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。
1.3 反向代理的作用
1.3.1 保护网站安全
任何来自Internet的请求都必须先经过代理服务器
1.3.2 配置缓存功能加速Web请求
可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力
1.3.3 实现负载均衡
充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力
1:安装httpd
[root@localhost httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-ssl --enable-proxy --enable-proxy-http
[root@localhost httpd-2.4.25]# make && make install
2:修改httpd的主配置文件
[root@localhost conf]# vi httpd.conf
找到以下几行,去掉前面的注释符:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
Include conf/extra/httpd-vhosts.conf
修改servername参数:
ServerName www.benet.com
修改网站根目录
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
3:编辑测试网站
[root@localhost ~]# mkdir -p /var/www/html
[root@localhost ~]# vi /var/www/html/index.html
添加测试内容:
index.html
4:修改vhosts文件,做反向代理,并实现动静分离
[root@localhost ~]# cd /usr/local/httpd/conf/extra/
[root@localhost extra]# vi httpd-vhosts.conf
修改的最终结果如下:
<Directory "/var/www/html">
Order allow,deny
allow from all
</Directory>
<VirtualHost 192.168.10.101:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/var/www/html"
ServerName www.benet.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
ProxyRequests off
ProxyPreserveHost on
ProxyVia on
ProxyPassMatch /*.html$ !
ProxyPass / http://192.168.10.102:8080/
ProxyPassReverse / http://192.168.10.102:8080/
</VirtualHost>
注释:
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
代理的语句也可以使用ajp模块
ProxyPass / ajp://192.168.10.102:8009/
ProxyPassReverse / ajp://192.168.10.102:8009/
可以过滤的静态页面元素:
ProxyPassMatch /*.gif$ ! #过滤gif
ProxyPassMatch /*.jpg$ ! #过滤jpg
ProxyPassMatch /*.png$ ! #过滤png
ProxyPassMatch /*.css$ ! #过滤css
ProxyPassMatch /*.js$ ! #过滤js
ProxyPassMatch /*.htm$ ! #过滤htm
ProxyPassMatch /*.html$ ! #过滤html
5:做反向代理,并实现负载均衡
(1)检查以下模块是否开启
LoadModule proxy_module modules/mod_proxy.so #proxy模块
LoadModule proxy_connect_module modules/mod_proxy_connect.so #链接的模块
LoadModule proxy_http_module modules/mod_proxy_http.so #给http做代理模块
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #负载均衡模块
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so #算法模块,根据server的请求量
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so #算法模块,根据server流量
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so #算法模块,根据server繁忙程度
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so #
(2)修改vhosts文件
<Directory "/var/www/html">
Order allow,deny
allow from all
</Directory>
<VirtualHost 192.168.10.101:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/var/www/html"
ServerName www.benet.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
ProxyRequests off
ProxyPreserveHost on
ProxyVia on
ProxyPassMatch /*.html$ !
<Proxy balancer://cluster/>
BalancerMember http://192.168.10.102:8080/
#ProxySet lbmethod=byrequests
</Proxy>
ProxyPass / balancer://cluster/
</VirtualHost>