部署haproxy代理,搭建基于nginx的高性能反向代理群集

简介: 部署haproxy代理,搭建基于nginx的高性能反向代理群集

一、Haproxy概述、简介


(1)Haproxy简介


  • Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,也是目前来说比较流行的一种集群调度工具
  • 支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能
  • 对于双机热备来说,Haproxy配置简单,拥有很好的对服务器节点的健康检查功能,当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后Haproxy还会自动讲RS服务器添加 (和keepalived的健康检查差不多)
  • 对于高性能的反向代理来说,Haproxy使用于那些访问量很大,但是又需要会话保持或者七层应用的业务。Haproxy运行在普通的服务器硬件上,仅仅是进行简单的优化就可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单、安全的整合到各种网站的架构中,同时使得应用服务器的ip地址不会暴露在网络中。Haproxy软件引入了frontend (前端) 和 backend (后端) 的功能,而frontend的acl匹配规则可以让运维管理人员根据任意HTTP请求作为头部来进行规则匹配,然后再把请求定向到相关的backend (即server pools 服务器池等待前端把请求转过来的服务器组) 。通过frontend和backup (备用服务器) ,我们可以很容易的实现Haproxy的七层代理功能,haproxy是一款不可多得的优秀代理服务软件



20210216213122240.png

(2)Haproxy和LVS、Nginx的比较


  • LVS性能最好,但是相对于Haproxy来说,搭建要复杂许多
  • Nginx的upstream模块支持集群功能,但是对集群节点的健康检查功能不强,性能没有Haproxy好


(3)Haproxy的代理模式


主要支持两种代理模式:


第一个: 四层TCP代理

例如:可以用于邮件服务器内部协议通信服务器、Mysql服务器等

第二个: 七层代理

在四层TCP代理模式下,Haproxy仅在客户端和服务器之间双向转发流量,但是在七层模式下Haproxy会分析应用层协议,并且能够通过运行、拒绝、交换、增加、修改或者删除请求(request)或者回应(reponse)里指定内容来控制协议


二、利用Haproxy+nginx搭建web群集


实验环境


以下实验所用的系统均为Centos7!


名称 ip地址 扮演角色
haproxy 192.168.100.1 haproxy代理服务器
nginx1 192.168.100.2 nginx服务器
nginx2 192.168.100.3 nginx服务器


实验目的


利用haproxy+nginx搭建的群集,使内部web服务器不用把ip地址暴露在网络上,并且实现两台web服务器页面的来回切换,实现负载均衡


实验步骤


(1)部署两台nginx服务器(两台步骤相同,编写网页不同)

******(1)先做基础配置,nginx1和nginx2
————nginx1:
[root@Centos7 ~]# hostnamectl set-hostname nginx1
[root@Centos7 ~]# su
[root@nginx1 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
————nginx2:
[root@Centos7 ~]# hostnamectl set-hostname nginx2
[root@Centos7 ~]# su
[root@nginx2 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)分别在两台机器上安装必要组件、上传nginx的源码包进行配置、编译、安装,并且编写web页面
————nginx1:
[root@nginx1 ~]# yum -y install pcre-devel zlib-devel
。。。。。。
完毕!
[root@nginx1 ~]# ls
anaconda-ks.cfg  nginx-1.12.0.tar.gz
[root@nginx1 ~]# tar xf nginx-1.12.0.tar.gz  -C /usr/src/
[root@nginx1 ~]# cd /usr/src/nginx-1.12.0/
[root@nginx1 nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@nginx1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &&make &&make install
[root@nginx1 nginx-1.12.0]# echo "11111111" > /usr/local/nginx/html/index.html
[root@nginx1 nginx-1.12.0]# /usr/local/nginx/sbin/nginx 
[root@nginx1 nginx-1.12.0]# netstat -anpt | grep nginx (查看端口号是否已经成功启动nginx)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6297/nginx: master  
[root@nginx1 nginx-1.12.0]# curl 127.0.0.1   (测试是否可以正常访问)
11111111
————nginx2:
[root@nginx2 ~]# yum -y install pcre-devel zlib-devel
[root@nginx2 ~]# ls
anaconda-ks.cfg  nginx-1.12.0.tar.gz
[root@nginx2 ~]# tar xf nginx-1.12.0.tar.gz  -C /usr/src/
[root@nginx2 ~]# cd /usr/src/nginx-1.12.0/
[root@nginx2 nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
[root@nginx2 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx2 nginx-1.12.0]# echo "2222222" > /usr/local/nginx/html/index.html
[root@nginx2 nginx-1.12.0]# /usr/local/nginx/sbin/nginx 
[root@nginx2 nginx-1.12.0]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3923/nginx: master  
[root@nginx2 nginx-1.12.0]# curl 127.0.0.1
2222222

(2)部署haproxy服务器

******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname haproxy
[root@Centos7 ~]# su
[root@haproxy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
******(2)安装必要组件上传haproxy的源码包并且进行安装
[root@haproxy ~]# yum -y install pcre-devel bzip2-devel
。。。。。。
完毕!
[root@haproxy ~]# ls
anaconda-ks.cfg  haproxy-1.5.19.tar.gz
[root@haproxy ~]# tar xf haproxy-1.5.19.tar.gz -C /usr/src/
[root@haproxy ~]# cd /usr/src/haproxy-1.5.19/
[root@haproxy haproxy-1.5.19]# make TARGET=linux26  (表示安装64位系统)
[root@haproxy haproxy-1.5.19]# make install
[root@haproxy haproxy-1.5.19]# cd
******(3)配置haproxy
[root@haproxy ~]# vim /usr/src/haproxy-1.5.19/examples/haproxy.cfg  (模板文件)
——————————————————————————————————————华丽分割线————————————————————————————————————————
配置文件解析:
global  全局部分
        log /dev/log local0 info
        log /dev/log local1 notice      把info和notice日志分别存放,以便查看
        maxconn 4096                    最大连接数
        uid 99                          用户id
        gid 99                          组id
  # pidfile /var/run/haproxy.pid      pid文件的路径及文件名
        daemon                          后台运行
defaults   默认配置
        log     global                  应用全局部分的日志配置
        mode    http                    模式为http
        option  httplog
        option  dontlognull
        retries 3                       检查节点的失败次数,连续达到3次认为节点不可用
        maxconn 2000                    最大连接数
        contimeout      5000            连接超时时间5000
        clitimeout      50000           客户端超时时间50000
        srvtimeout      50000           服务器超时时间50000
  # option httpclose                  关闭客户端请求
listen  webcluster 0.0.0.0:80           web集群(侦听的地址和接口)
        option  httpchk GET /index.html 检查http文件
        balance roundrobin              负载均衡调度算法 轮询 roundrobin 
        server  inst1 192.168.100.2:80 check inter 2000 fall 3
        server  inst2 192.168.100.3:80 check inter 2000 fall 3  
        ##上面的两个server项都是nginx节点服务的地址、名称、端口 、检查间隔时间、健康检查次数3次认为失败
全局部分中日志存放位置/dev/log 目录中的log文件是一个套接字(socket)。它是一条通信线路的站点,而这些终点(sockets)之间存在着数据通讯网络。
它的通信过程是:
程序通过访问远程计算机的socket地址,访问的计算机的socket地址跟远程计算机的socket地址之间就建立了一条通讯线路。socket相当于是一个独有的身份标识
———————————————————————————————————————————————————————————————————————————————————————
******(4)创建一个新的目录,创建新的配置文件
[root@haproxy ~]# mkdir /etc/haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
写入:
global
        log /dev/log local0 info
        log /dev/log local1 notice
        maxconn 4096
        uid 99
        gid 99
        daemon
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
listen  webcluster 0.0.0.0:80
        option  httpchk GET /index.html
        balance roundrobin
        server inst1 192.168.100.2:80 check inter 2000 fall 3
        server inst2 192.168.100.3:80 check inter 2000 fall 3
保存退出
******(5)优化haproxy的命令执行路径,使系统可以识别haproxy的命令
[root@haproxy ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.init  /etc/init.d/haproxy
[root@haproxy ~]# chmod +x /etc/init.d/haproxy 
[root@haproxy ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@haproxy ~]# /etc/init.d/haproxy restart
Reloading systemd:                                         [  确定  ]
Restarting haproxy (via systemctl):                        [  确定  ]

(3)验证


打开一台测试机访问haproxy服务器的地址192.168.100.1


第一次访问


20210220132220485.png




第二次访问

20210220132239738.png


发现可以成功切换页面,并且内网web服务器也没有将ip地址暴露,由此,haproxy+nginx群集搭建完成!!


三、扩展——haproxy的日志管理


要知道Haproxy的日志默认是输出到系统的syslog中的,查看起来非常不方便,为了方便管理和查看haproxy的日志,需要在生产环境中单独定义

[root@haproxy ~]# cd /etc/rsyslog.d/
[root@haproxy rsyslog.d]# vim haproxy.conf (编写新的配置文件)
写入:
local0.*        /var/log/haproxy/ha-info.log
local1.*        /var/log/haproxy/ha-notice.log
保存退出
[root@haproxy rsyslog.d]# vim /etc/sysconfig/rsyslog  (修改系统日志文件)
修改为:
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0 -c 2"
保存退出
[root@haproxy rsyslog.d]# systemctl restart rsyslog  (重启rsyslog服务)
[root@haproxy rsyslog.d]# /etc/init.d/haproxy restart  (重启haproxy服务)
Restarting haproxy (via systemctl):                        [  确定  ]
[root@haproxy rsyslog.d]# tail -5 /var/log/haproxy/ha-info.log  (使用测试机再次访问然后查看日志,发现已经成功记录)
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:14.911] webcluster webcluster/inst2 185/0/0/0/185 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.096] webcluster webcluster/inst1 179/0/0/1/180 200 243 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.276] webcluster webcluster/inst2 189/0/0/1/190 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.466] webcluster webcluster/inst1 187/0/0/1/188 200 243 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Feb 20 21:30:15 haproxy haproxy[1800]: 192.168.100.10:49159 [20/Feb/2021:21:30:15.654] webcluster webcluster/inst2 123/0/1/0/124 200 242 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
1423 4
|
3月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
183 5
|
11月前
|
应用服务中间件 PHP nginx
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
简介: 本教程介绍如何基于 Dragonwell 的 Ubuntu 镜像创建一个运行 Nginx 的 Docker 容器。首先从阿里云容器镜像服务拉取基础镜像,然后编写 Dockerfile 确保 Nginx 作为主进程运行,并暴露 80 端口。最后,在包含 Dockerfile 的目录下构建自定义镜像并启动容器,确保 Nginx 在前台运行,避免容器启动后立即退出。通过 `docker build` 和 `docker run` 命令完成整个流程。
432 25
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
|
12月前
|
网络协议 应用服务中间件 网络安全
Nginx,正向代理
本文介绍了Nginx作为HTTPS正向代理的两种方案:HTTP CONNECT隧道(7层)和NGINX stream(4层)。HTTP CONNECT隧道需要客户端手动配置代理,通过CONNECT请求建立隧道;而NGINX stream则更适合透明代理,利用SNI字段实现流量转发。文章详细讲解了两者的原理、环境搭建、使用场景及常见问题,并提供了配置示例和最佳实践建议。内容转载自阿里云开发者社区@怀知的文章,推荐读者参阅原文获取更多信息。感谢您的阅读!
1904 80
Nginx,正向代理
|
8月前
|
应用服务中间件 Linux 网络安全
技术指南:如何把docsify项目部署到基于CentOS系统的Nginx中。
总结 与其他部署方法相比,将docsify项目部署到基于CentOS系统的Nginx中比较简单。以上步骤应当帮助你在不花费太多时间的情况下,将你的项目顺利部署到Nginx中。迈出第一步,开始部署你的docsify项目吧!
368 14
|
12月前
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
1914 20
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
481 11
|
4月前
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
463 1
|
8月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
836 87