实验目的

通过apache实现反向代理的功能,类似nginx反向代理和haproxy反向代理

环境准备


逻辑架构如下

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

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

实验系统版本

  1. # cat /etc/redhat-release
  2. CentOS Linux release 7.3.1611 (Core)
  3. # uname -rm
  4. 3.10.0-514.el7.x86_64 x86_64

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

关闭firewalld和selinux,主机名改名。

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

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

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

  1. # echo "linux-node2.example.com" > /var/www/html/index.html
  2. # echo "linux-node1.example.com" > /var/www/html/index.html
最终达到如下效果

  1. # curl http://10.0.1.106:8080/
  2. linux-node2.example.com
    # curl http://10.0.1.105:8080/
  3. linux-node1.example.com

node1上配置apache做反向代理

编译安装apache软件包

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

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

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

  1. # rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
  2. # yum install -y gcc glibc gcc-c++ make screen tree lrzsz
  3. # yum install -y apr-devel apr-util-devel pcre-devel openssl-devel
  4. # cd /usr/local/src
  5. # wget http://archive.apache.org/dist/httpd/httpd-2.4.18.tar.gz
  6. # tar xfz httpd-2.4.18.tar.gz
  7. # cd httpd-2.4.18
  8. # ./configure --prefix=/usr/local/httpd-2.4.18 --enable-so --enable-modules="all"
  9. # make && make install
  10. # echo $?
  11. # 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编译安装之后,检查语法以及启动服务 

  1. # /usr/local/httpd/bin/apachectl -t
  2. # /usr/local/httpd/bin/apachectl -k start

接下来配置反向代理模块

打开apache官网帮助

找到左边“模块”

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

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

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

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

设置主配置文件ServerName

  1. # cd /usr/local/httpd/conf# grep ServerName httpd.conf
  2. ServerName linux-node1.example.com:80

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

查看它默认加载的模块

 
 
找到负载均衡的部分,很多proxy开头的部分。复制相关参数

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

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

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

  1. # cd /usr/local/httpd/conf/extra
  2. # cat httpd-proxy.conf
  3. #www.linux-node1.example.com
  4. #proxy demo
  5. LoadModule proxy_module modules/mod_proxy.so
  6. LoadModule proxy_connect_module modules/mod_proxy_connect.so
  7. LoadModule proxy_http_module modules/mod_proxy_http.so
  8. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  9. LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
  10. LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
  11. LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
  12. ProxyRequests Off
  13. <Proxy balancer://mycluster>
  14. BalancerMember http://10.0.1.105:8080
  15. BalancerMember http://10.0.1.106:8080
  16. </Proxy>
  17. ProxyPass /demo balancer://mycluster
  18. ProxyPassReverse /demo balancer://mycluster
在主配置文件把这个配置文件中Include进来

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

  1. # /usr/local/httpd/bin/apachectl -t
启动时没启动成功

  1. # /usr/local/httpd/bin/apachectl -k restart
  2. # netstat -lntp | grep 80# /usr/local/httpd/bin/apachectl -t

看日志提示,是缺少模块

  1. # tail -f error_log
  2. [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
  3. [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'
  4. [Sun Feb 26 23:48:31.206384 2017] [mpm_worker:notice] [pid 19856:tid 139866031015808] AH00298: SIGHUP received. Attempting to restart
  5. [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??
  6. [Sun Feb 26 23:48:31.210351 2017] [:emerg] [pid 19856:tid 139866031015808] AH00020: Configuration Failed, exiting
  7. [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??
  8. [Sun Feb 26 23:50:12.882703 2017] [:emerg] [pid 20021:tid 139920264771456] AH00020: Configuration Failed, exiting

如果你遇到了服务无法启动的情况,也不报错的,查看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配置文件中添加这一行

  1. # cat httpd-proxy.conf
  2. #www.linux-node1.example.com
  3. #proxy demo
  4. LoadModule proxy_module modules/mod_proxy.so
  5. LoadModule proxy_connect_module modules/mod_proxy_connect.so
  6. LoadModule proxy_http_module modules/mod_proxy_http.so
  7. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  8. LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
  9. LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
  10. LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
  11. LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
  12. ProxyRequests Off
  13. <Proxy balancer://mycluster>
  14. BalancerMember http://192.168.1.105:8080
  15. BalancerMember http://192.168.1.106:8080
  16. </Proxy>
  17. ProxyPass /demo balancer://mycluster
  18. ProxyPassReverse /demo balancer://mycluster
再次启动,成功

  1. # /usr/local/httpd/bin/apachectl -k start
  2. # netstat -lntp | grep 80

浏览器访问,测试成功

现在是轮询算法。

修改配置文件,在最后打开管理功能

  1. # cat httpd-proxy.conf
  2. #www.linux-node1.example.com
  3. #proxy demo
  4. LoadModule proxy_module modules/mod_proxy.so
  5. LoadModule proxy_connect_module modules/mod_proxy_connect.so
  6. LoadModule proxy_http_module modules/mod_proxy_http.so
  7. LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
  8. LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
  9. LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
  10. LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
  11. LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
  12. ProxyRequests Off
  13. <Proxy balancer://mycluster>
  14. BalancerMember http://10.0.1.105:8080
  15. BalancerMember http://10.0.1.106:8080
  16. </Proxy>
  17. ProxyPass /demo balancer://mycluster
  18. ProxyPassReverse /demo balancer://mycluster
  19. <Location /manager>
  20. SetHandler balancer-manager
  21. Order Deny,Allow
  22. Allow from all
  23. </Location>
 
优雅重启

  1. # /usr/local/httpd/bin/apachectl -k graceful  

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

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

反向代理配置虚拟主机

模拟用户真实访问环境,用户是通过域名访问的,而不是IP,这里开始配置虚拟主机
 
extra默认有一个配置文件,httpd-vhosts.conf可以复制部分当模板

  1. # cd /usr/local/httpd/conf/extra/# ll
  2. -rw-r--r-- 1 root root 2891 2 26 22:42 httpd-autoindex.conf
  3. -rw-r--r-- 1 root root 1842 2 26 22:42 httpd-dav.conf
  4. -rw-r--r-- 1 root root 2942 2 26 22:42 httpd-default.conf
  5. -rw-r--r-- 1 root root 1119 2 26 22:42 httpd-info.conf
  6. -rw-r--r-- 1 root root 5078 2 26 22:42 httpd-languages.conf
  7. -rw-r--r-- 1 root root 1035 2 26 22:42 httpd-manual.conf
  8. -rw-r--r-- 1 root root 4444 2 26 22:42 httpd-mpm.conf
  9. -rw-r--r-- 1 root root 2237 2 26 22:42 httpd-multilang-errordoc.conf
  10. -rw-r--r-- 1 root root 858 2 27 00:14 httpd-proxy.conf
  11. -rw-r--r-- 1 root root 13464 2 26 22:42 httpd-ssl.conf
  12. -rw-r--r-- 1 root root 694 2 26 22:42 httpd-userdir.conf
  13. -rw-r--r-- 1 root root 1477 2 26 22:42 httpd-vhosts.conf
  14. -rw-r--r-- 1 root root 3161 2 26 22:42 proxy-html.conf
可以复制下面文件的配置

 
把原先httpd-proxy.conf配置文件里2行ProxyPass引用的放在虚拟主机里

  1. <VirtualHost *:80>
  2. ServerAdmin webmaster@nmap.example.com
  3. DocumentRoot "/opt"
  4. ServerName www.apache-nmap.com
  5. ServerAlias apache-nmap.com
  6. ErrorLog "logs/nmap-error_log"
  7. CustomLog "logs/nmap-access_log" common
  8. ProxyPass / balancer://mycluster
  9. ProxyPassReverse / balancer://mycluster
  10. </VirtualHost> 

配置截图如下

检查语法,重新加载

  1. # /usr/local/httpd/bin/apachectl -t
  2. # /usr/local/httpd/bin/apachectl -k graceful

window的hosts文件添加域名解析

  1. 10.0.1.105 www.apache-nmap.com apache-nmap.com  
通过域名访问成功

还可以设置权重等一些参数

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

apache使用select模式,性能不高

nginx使用epel模型,性能高

varish和haproxy都是使用epel模型的,性能高可能一些特殊场景会用到它做反向代理

学习Apache(一)的更多相关文章

  1. Netty学习——Apache Thrift 简介和下载安装

    Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...

  2. JDBC 学习复习7 学习 Apache 开源DBCP 数据源

    DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:comm ...

  3. 学习Apache(六)

    Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...

  4. Web学习-apache视图log刊物

    视图apache刊物 apache日志位置 不同的系统位置不同. widnows 假如是windows的话,xampp下应该是都存在的,直接去找apache的folder/log/access.log ...

  5. 看我学习Apache+php+wordpress+phpMyAdmin的搭配配置

    开场白:我不是这方面的"专家"或"菜鸟",因为我不懂,别问我为什么,我只是心血来潮好奇,东拼西凑写了这些文字. 1.php的配,使用免安装版本,要进行的设置, ...

  6. 今夜我们一起学习 Apache Shiro

    简介 Apache Shiro 是一个功能强大但又非常容易使用的 Java 安全框架,提供了认证,授权,加密以及会话管理功能.因为 Shiro 的 API 是非常容易理解的,所以使用 Shiro 你可 ...

  7. 学习Apache的mod rewrite、access写法

    Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和 ...

  8. 学习apache commons lang3的源代码 (1):前言和R

    本系列主要是针对lang3的3.7版本的源代码进行学习,并适当举例.一共大概150多个java文件,争取30天内学习完毕. 26个英文字母 争取每天学习1个字母开头的类们. 今天,就学习R开头的吧. ...

  9. 对于学习apache软件基金会顶级项目源码的一点思路(转)

    ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...

  10. 学习 Apache FileMatchs 规则

    # 凡是匹配到 zip,gz,rar,box,log结尾的文件,进行下面的规则进行匹配 <filesmatch ".(zip|gz|rar|box|log)"> Ord ...

随机推荐

  1. 做PPT必备的大数据分析网站,好看又免费的报表工具

    小明以前是学技术,跳槽来到一家大公司,在这个公司里会经常开会,比如有月度报告.季度报告以及年度报告,在开会前小明了解到同事们都会制作精美的PPT来汇报工作计划和目标,看到同事们精美的PPT里各种好看的 ...

  2. Linux 中CPU 和 GPU 的行为监控

    由于 Steam(包括 Steam Play,即 Proton)和一些其他的发展,GNU/Linux 正在成为越来越多计算机用户的日常游戏平台的选择.也有相当一部分用户在遇到像视频编辑或图形设计等(K ...

  3. 关于C#理解装箱与拆箱

    目录 1.理解装箱 2.理解拆箱 3.生成的 IL 代码 4.实际应用 5.小结 1.理解装箱 简单地说,装箱就是将一个值类型的数据存储在一个引用类型的变量中. 假设你一个方法中创建了一个 int 类 ...

  4. C#foreach 本质( 鸭子类型遍历)

    探讨关于C#中Foreach的本质 要实现foreach需要满足什么条件? 只要类中实现类中的GetEnumerator()方法.MoveNext()方法.Current属性(俗称鸭子类型)都可以使用 ...

  5. 浏览器无插件播放rtsp流解决方案

    1. 安装 FFmpeg 参考 CentOS下安装FFmpeg,特别详细. 我遇到的错误和解决办法: 缺少lame ffmpeg+libmp3lame库源码安装教程(CentOS) make ffmp ...

  6. Docker入坑系列(一)

    Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...

  7. Pandas:读取数据库read_sql

    学习自:pandas.read_sql - pandas 1.2.4 documentation (10条消息) pd.read_sql()参数详解_pandas.read_csv()参数详解-CSD ...

  8. c#修改密码后实现重新登录

    C#中密码修改成功后,提示"密码修改成功,请重新登录.当用户一点确定的时候就跳到登录界面 直接重启程序就是了,在弹出个Messages.show("密码修改成功,请重新登录.&qu ...

  9. JZ-006-旋转数组的最小数字

    旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. NOTE:给出的所有元素都大于0,若数组 ...

  10. winform中更新UI控件的方案介绍

    这是一个古老的话题...直入主题吧! 对winfrom的控件来说,多线程操作非常容易导致复杂且严重的bug,比如不同线程可能会因场景需要强制设置控件为不同的状态,进而引起并发.加锁.死锁.阻塞等问题. ...