学习Apache(一)
实验目的
通过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就是默认加载的配置文件。我没做任何操作,安装之后系统默认的

在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

# /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下的日志,首次安装报错如下:
# 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的一样


反向代理配置虚拟主机
# 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
<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(一)的更多相关文章
- Netty学习——Apache Thrift 简介和下载安装
Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...
- JDBC 学习复习7 学习 Apache 开源DBCP 数据源
DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:comm ...
- 学习Apache(六)
Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...
- Web学习-apache视图log刊物
视图apache刊物 apache日志位置 不同的系统位置不同. widnows 假如是windows的话,xampp下应该是都存在的,直接去找apache的folder/log/access.log ...
- 看我学习Apache+php+wordpress+phpMyAdmin的搭配配置
开场白:我不是这方面的"专家"或"菜鸟",因为我不懂,别问我为什么,我只是心血来潮好奇,东拼西凑写了这些文字. 1.php的配,使用免安装版本,要进行的设置, ...
- 今夜我们一起学习 Apache Shiro
简介 Apache Shiro 是一个功能强大但又非常容易使用的 Java 安全框架,提供了认证,授权,加密以及会话管理功能.因为 Shiro 的 API 是非常容易理解的,所以使用 Shiro 你可 ...
- 学习Apache的mod rewrite、access写法
Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和 ...
- 学习apache commons lang3的源代码 (1):前言和R
本系列主要是针对lang3的3.7版本的源代码进行学习,并适当举例.一共大概150多个java文件,争取30天内学习完毕. 26个英文字母 争取每天学习1个字母开头的类们. 今天,就学习R开头的吧. ...
- 对于学习apache软件基金会顶级项目源码的一点思路(转)
ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...
- 学习 Apache FileMatchs 规则
# 凡是匹配到 zip,gz,rar,box,log结尾的文件,进行下面的规则进行匹配 <filesmatch ".(zip|gz|rar|box|log)"> Ord ...
随机推荐
- 2021年国内BI厂商推荐_大数据分析工具
随着互联网大数据时代的不断发展,BI让企业的工作效率变得更高效.BI的功能也随着需求的增长不断地丰富,例如,数据可视化大屏.可视化表格.商业化数据分析.数据地图等.国外的厂商在很多场景下无法满足国内的 ...
- 【C#TAP 异步编程】异步接口 OOP
在我们深入研究"异步OOP"之前,让我们解决一个相当常见的问题:如何处理异步方法的继承?那么"异步接口"呢? 幸运的是,它确实可以很好地与继承(和接口)一起使用 ...
- 激活visio pro 2019
内容来源:http://www.yishimei.cn/catalog.asp?page=2 1.必须彻底关闭windows defender 防火墙 :光笔防火墙的教程:https://www.cn ...
- Mybatis学习笔记(详细)
介绍 三层架构:视图层.业务逻辑层.持久层 mybatis框架: 执行数据库操作,完成对数据库的增删改查,封装了jdbc mapper映射,将表中数据转为一个Java对象,一个表对应一个接口 Myba ...
- kubebuilder operator的运行逻辑
kubebuilder 的运行逻辑 概述 下面是kubebuilder 的架构图.可以看到最外层是通过名为Manager的组件驱动的,Manager中包含了多个组件,其中Cache中保存了gvk和in ...
- (转载)C 中static 和inline
https://www.cnblogs.com/lxlx1798/articles/9996521.html
- C语言刷数组题记录
讲解:https://mp.weixin.qq.com/s/weyitJcVHBgFtSc19cbPdw 二分法: 704. 二分查找 int search(int* nums, int numsSi ...
- Chapter06 数组(Array)
目录 Chapter06 数组 6.1 数组的认识 6.2 数组的使用 使用方式1 - 动态初始化 使用方式2 - 动态初始化 使用方法3 - 静态初始化 6.3 数组使用的注意事项和细节 6.4 数 ...
- Ribbon&OpenFeign配置使用
目录 Ribbon 是什么 工作流程 怎么用 负载算法 官方提供算法 使用方法 自定义负载算法 在rule包下新建MyRule 修改自定义策略类RbRule 测试 OpenFeign 是什么 怎么用 ...
- linux文件目录权限操作
设置修改文件的属主或修改文件属组 [root@localhost ~]# ll test.txt -rw-r--r--. 1 root root 0 Oct 21 12:01 test.txt [ro ...