实验目的

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

环境准备


逻辑架构如下

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

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

实验系统版本

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

配置两台节点做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
最终达到如下效果

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

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编译安装之后,检查语法以及启动服务 

# /usr/local/httpd/bin/apachectl -t
# /usr/local/httpd/bin/apachectl -k start

接下来配置反向代理模块

打开apache官网帮助

找到左边“模块”

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

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

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

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

设置主配置文件ServerName

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

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

查看它默认加载的模块

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

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

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

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

# cd /usr/local/httpd/conf/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
在主配置文件把这个配置文件中Include进来

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

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

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

看日志提示,是缺少模块

# 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

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

# 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
再次启动,成功

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

浏览器访问,测试成功

现在是轮询算法。

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

# 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>
 
优雅重启

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

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

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

反向代理配置虚拟主机

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

# cd /usr/local/httpd/conf/extra/# ll
-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
可以复制下面文件的配置

 
把原先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> 

配置截图如下

检查语法,重新加载

# /usr/local/httpd/bin/apachectl -t
# /usr/local/httpd/bin/apachectl -k graceful

window的hosts文件添加域名解析

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. 国内外主流5款doshboard软件比较和对比

    大数据行业随着互联网的蓬勃发展中也越来越被人们看好,但是从事大数据行业的数据分析师经常会谈到dashboard,很多人就会疑惑什么是dashboard,下面就来了解一下Doshboard的发展. da ...

  2. DBCHM -最简单、最实用的数据库文档生成工具

    项目介绍 DBCHM 是一款数据库文档生成工具! 该工具从最初支持chm文档格式开始,通过开源,集思广益,不断改进,又陆续支持word.excel.pdf.html.xml.markdown等文档格式 ...

  3. 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举

    注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...

  4. PostgreSQL 的字段类型和表操作笔记

    字段类型 数值类型 Name Storage Size Description Range smallint 2 bytes small-range integer -32768 to +32767 ...

  5. 修改安卓AVD虚拟机的默认下载路径

    因为安卓虚拟机的默认下载路径是在C盘,会在C盘中的.android文件中下载虚拟机,非常的占用C盘的宝贵资源,而且我发现这个.android文件即使删掉,只要打开AndroidStudio软件,它就会 ...

  6. One-Hot编码(转)

    机器学习:数据预处理之独热编码(One-Hot) 前言 ---------------------------------------- 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女 ...

  7. c# 反射实现模型深拷贝

    1.支持属性,不支持字段,支持复杂类型属性 2.泛型集合类支持List<T>与Dictionary<TKey,TValue> 3.如果发现有什么问题,希望大家可以多多指教 // ...

  8. 联邦学习:按混合分布划分Non-IID样本

    我们在博文<联邦学习:按病态独立同分布划分Non-IID样本>中学习了联邦学习开山论文[1]中按照病态独立同分布(Pathological Non-IID)划分样本. 在上一篇博文< ...

  9. Kendo UI Grid 使用总结

    Kendo UI Grid控件的功能强大,这里将常用的一些功能总结一下. Kendo UI Grid 固定列 在使用Gird控件显示数据时,如果数据列过多,会出现横向滚动条,很多情况下,我们希望某些列 ...

  10. tp6微信公众号开发者模式token认证

      微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架 技术标签: 微信公众号开发         因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的 ...