实验目的html
经过apache实现反向代理的功能,相似nginx反向代理和haproxy反向代理前端
逻辑架构以下node
前端是apche服务器,监听80端口,后端有两台web服务器,分别是node1和node2linux
准备两台机器,node1和node2。须要安装的服务以下,因为实验环境资源有限,把反向代理也安装在node1上nginx
实验系统版本c++
[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 ~]#
关闭firewalld和selinux,主机名更名。按上面表格更改。这里就不写具体执行步骤了 web
两台机器安装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
分别设置首页文件。用以区分不一样的机器apache
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 ~]#
编译安装apache软件包vim
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官网帮助
点击进去,找到以下mod_proxy,就是这个模块,让apache能够作反向代理
接下配准备配置,先查看下配置文件的目录。看到有个extra目录,相似nginx的extra目录,能够把一些定制化的配置放在extra目录里,而后在主配置文件httpd.conf把它include进来
这样下降配置文件之间的耦合性,不只方便管理,并且配置文件个别错误,不影响其他配置。这里就准备新建一个反向代理相关的配置文件,放在extra目录下
先从主配置文件拷贝一些模板性的配置
设置主配置文件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就是默认加载的配置文件。我没作任何操做,安装以后系统默认的
在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]#
[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
百度下错误
[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]#
浏览器访问,测试成功
[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的同样
[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]#
<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>
配置截图以下
[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]#
10.0.1.105 www.apache-nmap.com apache-nmap.com
apache作反向代理生产并不建议,由于性能不高。配置麻烦
关于IO这块
apache使用select模式,性能不高
nginx使用epel模型,性能高
varish和haproxy都是使用epel模型的,性能高
可能一些特殊场景会用到它作反向代理:可能某公司一些web服务器必须和apache反向代理结合,其他反向代理,好比nginx和haproxy没法使用。不得不用apache作反向代理了