阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Apache实现反向代理详解

326次阅读
没有评论

共计 9564 个字符,预计需要花费 24 分钟才能阅读完成。

实验目的

通过 Apache 实现反向代理的功能,类似 Nginx 反向代理和 HAProxy 反向代理。

环境准备

逻辑架构如下

前端是 apche 服务器,监听 80 端口,后端有两台 web 服务器,分别是 node1 和 node2

Apache 实现反向代理详解

准备两台机器,node1 和 node2。需要安装的服务如下,由于实验环境资源有限,把反向代理也安装在 node1 上

Apache 实现反向代理详解

实验系统版本

[root@linux-node1 ~]# cat /etc/RedHat-release
CentOS Linux release 7.3.1611 (Core)
[root@linux-node1 ~]# uname -rm
3.10.0-514.el7.x86_64 x86_64
[root@linux-node1 ~]#

配置两台节点做 web 服务器,监听 8080 端口

关闭 firewalld 和 selinux,主机名改名。按上面表格更改。这里就不写具体执行步骤了 

两台机器安装 epel7 的阿里云的源,安装一些依赖包和常用工具包,安装 httpd,更改默认监听端口为 8080

rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y gcc glibc gcc-c++  make screen tree lrzsz
yum install httpd -y
sed -i ‘s#Listen 80#Listen 8080#g’ /etc/httpd/conf/httpd.conf
systemctl restart httpd.service
netstat -lntp | grep 8080

分别设置首页文件。用以区分不同的机器

echo “linux-node2.example.com” > /var/www/html/index.html
echo “linux-node1.example.com” > /var/www/html/index.html
 
最终达到如下效果

[root@linux-node2 ~]# curl http://10.0.1.106:8080/
linux-node2.example.com
[root@linux-node2 ~]# 
[root@linux-node1 ~]# curl http://10.0.1.105:8080/
linux-node1.example.com
[root@linux-node1 ~]# 

node1 上配置 apache 做反向代理

编译安装 apache 软件包

node1 同时做反向代理配置,执行如下命令,把源码包编译安装在 /usr/local 目录下,最后做个软链接。

看到需要安装 apr 和 pcre 相关的包

简要来说 apr 是屏蔽底层操作系统细节用的。pcre 正则匹配用的。openssl 支持加密协议

rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y gcc glibc gcc-c++  make screen tree lrzsz
yum install -y apr-devel apr-util-devel pcre-devel openssl-devel
cd /usr/local/src
wget http://archive.apache.org/dist/httpd/httpd-2.4.18.tar.gz
tar xfz httpd-2.4.18.tar.gz
cd httpd-2.4.18
./configure –prefix=/usr/local/httpd-2.4.18 –enable-so –enable-modules=”all”
make && make install
echo $?
ln -s /usr/local/httpd-2.4.18/ /usr/local/httpd

APR(Apache portable Run-time libraries,Apache 可移植运行库),主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
在早期 的 Apache 版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。

那安装 Apache 的时候为什么必须安装 Apr 呢?
在早期的 Apache 版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。
随着 Apache 的进一步开发,Apache 组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR 的开发就从 Apache 中独立出来,Apache 仅仅是使用 APR 而已。
一般情况下,APR 开发包很容易理解为仅仅是一个开发包,不过事实上并不是。
目前,完整的 APR 实际上包含了三个开发包:apr、apr-util 以及 apr-iconv,每一个开发包分别独立开发,并拥有自己的版本。
apr 中包含了一些通用的开发组件,包括 mmap,DSO 等等
apr-util 该目录中也是包含了一些常用的开发组件。这些组件与 apr 目录下的相比,它们与 apache 的关系更加密切一些。比如存储段和存储段组,加密等等。
apr-iconv 包中的文件主要用于实现 iconv 编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。
因此假如两个非本地编码 A 和 B 需要转换,则转换过程大致为 A ->Local 以及 Local->B 或者 B ->Local 以及 Local->A。

node1 上 apache 编译安装之后,检查语法以及启动服务

[root@linux-node1 httpd-2.4.18]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 httpd-2.4.18]# /usr/local/httpd/bin/apachectl -k start
[root@linux-node1 httpd-2.4.18]#

接下来配置反向代理模块

打开 apache 官网帮助

http://httpd.apache.org/docs/2.4/
找到左边“模块”
 
Apache 实现反向代理详解 

 点击进去,找到如下 mod_proxy,就是这个模块,让 apache 可以做反向代理

Apache 实现反向代理详解

 

 接下配准备配置,先查看下配置文件的目录。看到有个 extra 目录,类似 nginx 的 extra 目录,可以把一些定制化的配置放在 extra 目录里,然后在主配置文件 httpd.conf 把它 include 进来

这样降低配置文件之间的耦合性,不仅方便管理,而且配置文件个别错误,不影响其余配置。这里就准备新建一个反向代理相关的配置文件,放在 extra 目录下

先从主配置文件拷贝一些模板性的配置

Apache 实现反向代理详解

设置主配置文件 ServerName

[root@linux-node1 conf]# pwd
/usr/local/httpd/conf
[root@linux-node1 conf]# vim httpd.conf
[root@linux-node1 conf]# grep ServerName httpd.conf
# ServerName gives the name and port that the server uses to identify itself.
ServerName linux-node1.example.com:80
[root@linux-node1 conf]#

apache 和 nginx 一样,默认会 Include 一些配置文件,下面的 proxy-html.conf 就是默认加载的配置文件。我没做任何操作,安装之后系统默认的

Apache 实现反向代理详解

查看它默认加载的模块
Apache 实现反向代理详解 
 
找到负载均衡的部分,很多 proxy 开头的部分。复制相关参数

Apache 实现反向代理详解 

在 extra 目录下新建 httpd-proxy.conf 文件。文件名没要求,可以自定义。但是最好能通过配置文件知道做什么用的

把上面主配置文件的反向代理和负载均衡相关的配置复制进来。

同时配置后端节点。下面的 /demo 是自定义的。可以随便写,比如写成 /test123

[root@linux-node1 extra]# pwd
/usr/local/httpd/conf/extra
[root@linux-node1 extra]# cat httpd-proxy.conf
#www.linux-node1.example.com 
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://10.0.1.105:8080
BalancerMember http://10.0.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
[root@linux-node1 extra]#
 
在主配置文件把这个配置文件中 Include 进来

Apache 实现反向代理详解

检查语法,没发现语法错误

[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]#
启动时没启动成功
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k restart
[root@linux-node1 extra]# netstat -lntp | grep 80
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k restart
httpd not running, trying to start
[root@linux-node1 extra]# netstat -lntp | grep 80
[root@linux-node1 extra]#
 
看日志提示,是缺少模块
 
[root@linux-node1 logs]# pwd
/usr/local/httpd/logs
[root@linux-node1 logs]#
 
[root@linux-node1 logs]# tail -f error_log
[Sun Feb 26 23:00:09.288503 2017] [mpm_worker:notice] [pid 19856:tid 139866031015808] AH00292: Apache/2.4.18 (Unix) configured — resuming normal operations
[Sun Feb 26 23:00:09.288632 2017] [core:notice] [pid 19856:tid 139866031015808] AH00094: Command line: ‘/usr/local/httpd-2.4.18/bin/httpd’
[Sun Feb 26 23:48:31.206384 2017] [mpm_worker:notice] [pid 19856:tid 139866031015808] AH00298: SIGHUP received.  Attempting to restart
[Sun Feb 26 23:48:31.210297 2017] [proxy_balancer:emerg] [pid 19856:tid 139866031015808] AH01177: Failed to lookup provider ‘shm’ for ‘slotmem’: is mod_slotmem_shm loaded??
[Sun Feb 26 23:48:31.210351 2017] [:emerg] [pid 19856:tid 139866031015808] AH00020: Configuration Failed, exiting
[Sun Feb 26 23:50:12.882611 2017] [proxy_balancer:emerg] [pid 20021:tid 139920264771456] AH01177: Failed to lookup provider ‘shm’ for ‘slotmem’: is mod_slotmem_shm loaded??
[Sun Feb 26 23:50:12.882703 2017] [:emerg] [pid 20021:tid 139920264771456] AH00020: Configuration Failed, exiting

 百度下错误

http://blog.csdn.net/snihcel/article/details/38844667
如果你遇到了服务无法启动的情况,也不报错的,查看 logs 下的日志,首次安装报错如下:
AH01177: Failed to lookup provider ‘shm’ for ‘slotmem’: is mod_slotmem_shm loaded??
我想日志已经说的很清楚了,这里编译安装后,配置文件 conf/httpd.conf 没有开启 mod_slotmem_shm 模块,编辑该文件,放开
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
 
在 httpd-proxy.conf 配置文件中添加这一行
 
[root@linux-node1 extra]# cat httpd-proxy.conf
#www.linux-node1.example.com 
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.105:8080
BalancerMember http://192.168.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
[root@linux-node1 extra]#
 
再次启动,成功
 
[root@linux-node1 logs]# /usr/local/httpd/bin/apachectl -k start
[root@linux-node1 logs]# netstat -lntp | grep 80
tcp6      0      0 :::80                  :::*                    LISTEN      20034/httpd     
[root@linux-node1 logs]#

浏览器访问,测试成功

现在是轮询算法。
Apache 实现反向代理详解
Apache 实现反向代理详解
 
修改配置文件,在最后打开管理功能
 
[root@linux-node1 extra]# cat httpd-proxy.conf
#www.linux-node1.example.com 
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://10.0.1.105:8080
BalancerMember http://10.0.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
<Location /manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Allow from all
</Location>
[root@linux-node1 extra]#

优雅重启

 
[root@linux-node1 ~]# /usr/local/httpd/bin/apachectl -k graceful
[root@linux-node1 ~]#

Method 看到默认的方法是基于 requests
生产的配置需要设置权限,不要对外开放,可以允许内网一个网段访问。
权限设置和 apache 的一样

Apache 实现反向代理详解

点开左边超链接之后可以设置权重

Apache 实现反向代理详解

反向代理配置虚拟主机 

模拟用户真实访问环境,用户是通过域名访问的,而不是 IP,这里开始配置虚拟主机
 
extra 默认有一个配置文件,httpd-vhosts.conf 可以复制部分当模板
 
[root@linux-node1 htdocs]# cd /usr/local/httpd/conf/extra/
[root@linux-node1 extra]# ll
总用量 72
-rw-r–r– 1 root root  2891 2 月  26 22:42 httpd-autoindex.conf
-rw-r–r– 1 root root  1842 2 月  26 22:42 httpd-dav.conf
-rw-r–r– 1 root root  2942 2 月  26 22:42 httpd-default.conf
-rw-r–r– 1 root root  1119 2 月  26 22:42 httpd-info.conf
-rw-r–r– 1 root root  5078 2 月  26 22:42 httpd-languages.conf
-rw-r–r– 1 root root  1035 2 月  26 22:42 httpd-manual.conf
-rw-r–r– 1 root root  4444 2 月  26 22:42 httpd-mpm.conf
-rw-r–r– 1 root root  2237 2 月  26 22:42 httpd-multilang-errordoc.conf
-rw-r–r– 1 root root  858 2 月  27 00:14 httpd-proxy.conf
-rw-r–r– 1 root root 13464 2 月  26 22:42 httpd-ssl.conf
-rw-r–r– 1 root root  694 2 月  26 22:42 httpd-userdir.conf
-rw-r–r– 1 root root  1477 2 月  26 22:42 httpd-vhosts.conf
-rw-r–r– 1 root root  3161 2 月  26 22:42 proxy-html.conf
[root@linux-node1 extra]#
 
可以复制下面文件的配置
 

Apache 实现反向代理详解 
把原先 httpd-proxy.conf 配置文件里 2 行 ProxyPass 引用的放在虚拟主机里
 
<VirtualHost *:80>
    ServerAdmin webmaster@nmap.example.com
    DocumentRoot “/opt”
    ServerName www.apache-nmap.com
    ServerAlias apache-nmap.com
    ErrorLog “logs/nmap-error_log”
    CustomLog “logs/nmap-access_log” common
    ProxyPass / balancer://mycluster
    ProxyPassReverse / balancer://mycluster
</VirtualHost> 

配置截图如下

Apache 实现反向代理详解

 
检查语法,重新加载
 
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k graceful
[root@linux-node1 extra]#
 
window 的 hosts 文件添加域名解析
 
10.0.1.105  www.apache-nmap.com  apache-nmap.com
 
通过域名访问成功
Apache 实现反向代理详解
Apache 实现反向代理详解
 
 
还可以设置权重等一些参数

Apache 实现反向代理详解

apache 做反向代理生产并不建议,因为性能不高。配置麻烦

关于 IO 这块
apache 使用 select 模式,性能不高
nginx 使用 epel 模型,性能高
varish 和 haproxy 都是使用 epel 模型的,性能高

可能一些特殊场景会用到它做反向代理:可能某公司一些 web 服务器必须和 apache 反向代理结合,其余反向代理,比如 nginx 和 haproxy 无法使用。不得不用 apache 做反向代理了。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9564字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中