实验目的

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

环境准备


逻辑架构如下

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

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

实验系统版本

[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官网帮助

找到左边“模块”

点击进去,找到如下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就是默认加载的配置文件。我没做任何操作,安装之后系统默认的

查看它默认加载的模块

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

在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进来

检查语法,没发现语法错误
[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

  

百度下错误

如果你遇到了服务无法启动的情况,也不报错的,查看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]#

  

浏览器访问,测试成功

现在是轮询算法。

修改配置文件,在最后打开管理功能
[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的一样

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

反向代理配置虚拟主机


模拟用户真实访问环境,用户是通过域名访问的,而不是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]#
 
可以复制下面文件的配置

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

配置截图如下

 
 
检查语法,重新加载
[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做反向代理生产并不建议,因为性能不高。配置麻烦

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

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

 

apache做反向代理的更多相关文章

  1. Apache 如何反向代理tomcat并且实现Session保持

    简介 LAMT=Linux+Apache+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下 ...

  2. Tomcat:利用Apache配置反向代理、负载均衡

    本篇主要介绍apache配置反向代理,介绍了两种情况:第一种是,只使用apache配置反向代理:第二种是,apache与应用服务器(tomcat)结合,配置反向代理,同时了配置了负载均衡. 准备工作 ...

  3. 用nginx做反向代理来访问防外链图片

    用nginx做反向代理来访问防外链图片 女儿的博客从新浪搬到wordpress后,发现原来博客上链接的新浪相册的图片都不能访问了,一年的博客内容,一个个去重新上传图片,修正链接也是个大工程.还是得先想 ...

  4. nginux做反向代理配置文件

    做反向代理的配置文件最好单独创建一个文件,然后在主配置文件中使用 include nginx-test.config;  这样的方式来导入. 配置代码如下: ## Basic reverse prox ...

  5. APACHE 与IIS同时存在的情况下,给APACHE添加反向代理 共用80端口

    一.首先打开IIS,将IIS的端口改成81,不要让IIS占用了80端口 二.打开APACHE的httpd.conf配置文件,将里面的端口配置成80 三.打开APACHE的虚拟目录配置文件,如:http ...

  6. Apache 做反向代理服务器

    apache做反向代理服务器 apache代理分为正向代理和反向代理: 1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web ...

  7. Apache配置反向代理、负载均衡和集群(mod_proxy方式)

    Apache配置负载均衡和集群使用mod_jk的方式比较多,但是mod_jk已经停止更新,并且配置相对复杂.Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多. 1 ...

  8. nginx做反向代理并防盗链

    nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...

  9. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

随机推荐

  1. 构建--> 部署-->

    这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交 ...

  2. webservice接口,用Soapui

    webservice接口怎么测试呢,他不需要你在拼报文了,会给一个webservice的地址,或者wsdl文件,直接在soapui导入,就可以看到这个webservice里面的所有接口,也有报文,直接 ...

  3. elasticsearch(5) 请求体搜索

    上一篇提到的轻量搜索非常简单便捷,但是通过请求体查询可以更充分的利用查询的强大功能.因为_search api中大部分参数是通过HTTP请求体而非查询字符串来传递的. 一 空查询 对于空查询来说,最简 ...

  4. for each ;for in;for of 三者的区别

    for each: for each 方法没办法用break语句跳出循环并且无法用return语句从函数体 内返回 for in: 1.index 值 会是字符串(String)类型 2.循环不仅会遍 ...

  5. Holer实现oracle数据库外网访问

    外网访问内网Oracle数据库 内网主机上安装了Oracle数据库,只能在局域网内访问,怎样从公网也能访问本地Oracle数据库? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安 ...

  6. Android BLE dfu升级

    dfu升级适用于nordic  nRF51  nRF52 的系统,github上提供了相关升级的库https://github.com/NordicSemiconductor/Android-DFU- ...

  7. Linux 驱动——Button驱动4(fasync)异步通知

    button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...

  8. yarn安装

    Yarn是Facebook提供的替代npm的工具,可以加速node模块的下载.React Native的命令行工具用于执行创建.初始化.更新项目.运行打包服务(packager)等任务. 先安装nod ...

  9. java生成jar并用ikvm生成dll供C#调用

    最近想尝试用C#做NB_IOT北向API接口的访问.北向API的接口的访问需要证书的双向认证,而C#不支持双向认证,所以就使用IKVM在C#中跑JAVA程序实现HTTPS请求部分. 步骤如下: 一.使 ...

  10. mathematics of deep learning (paper reading)

    1.数学上,不变性 2.信息论上