高性能Web服务之haproxy应用详解及实现论坛的动静分离机制

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

下面通过案例架构详解HAproxy应用,架构图如下所示:

以上架构实现过程如下:

(1).在node1,node2,node3配置网络指向网关为:192.168.56.10

--node1配置如下:
# ifconfig eth0 192.168.56.11/24
# route add default gw 192.168.56.10
--node2配置如下:
# ifconfig eth0 192.168.56.12/24
# route add default gw 192.168.56.10
--node3配置如下:
# ifconfig eth0 192.168.56.13/24
# route add default gw 192.168.56.10

(2).在node1,node2,node3安装httpd,php,php-mysql

--node1安装配置
# yum -y install httpd php php-mysql

--node2安装配置
# yum -y install httpd php php-mysql

--node3安装配置
# yum -y install httpd php php-mysql

(3)在node4上安装mysql并启动

# yum -y install mysql mysql-server
# service mysqld start
# chkconfig mysqld on

(4)在node4数据库服务器上创建Discuz数据库

# mysql
--创建一个discuz论坛用的数据库,数据库名叫dzbbs
mysql> CREATE DATABASE dzbbs;
--创建并授权账号bbsroot密码redhat给dzbbs库,授权范围为全网
mysql> GRANT ALL PRIVILEGES ON dzbbs.* to [email protected]‘%‘ IDENTIFIED BY ‘redhat‘;

---创建并授权账号bbsroot密码redhat给dzbbs库,授权范围为本地主机
mysql> GRANT ALL PRIVILEGES ON dzbbs.* to [email protected] IDENTIFIED BY ‘redhat‘;

--刷新数据权限
mysql> FLUSH PRIVILEGES;

(5)配置node1,node2,node3的web服务

--node1配置如下:
ServerName node1.samlee.com:80
DocumentRoot "/var/www/html/upload"
DirectoryIndex index.php index.html

--node2配置如下:
ServerName node2.samlee.com:80
DocumentRoot "/var/www/html/upload"
DirectoryIndex index.php index.html

--node3配置如下:
ServerName node3.samlee.com:80
DocumentRoot "/var/www/html/upload"
DirectoryIndex index.php index.html

--node1,node2,node3检查配置httpd文件,重启httpd服务
# httpd -t    --检查时可能会报错,因为"/var/www/html/upload"不存在
# service mysqld retart

(6)部署discuz程序目录架构(node1下操作)

# wget  http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
# mkdir /usr/src/Discuz
# unzip -d /usr/src/Discuz /usr/src/Discuz_X3.2_SC_UTF8.zip
# cp -a /usr/src/Discuz/* /var/www/html/
# chmod -R 777 /var/www/html/upload/*

安装向导部署如下所示:

(7)将node1上"/var/www/html/"下所有文件及目录全部复制node2,node3网站主页下

# scp -r /var/www/html/* [email protected]:/var/www/html/
# scp -r /var/www/html/* [email protected]:/var/www/html/

--重启所有web-httpd服务
# for i in node2 node3;do ssh $i ‘service httpd restart‘;done

(8)将node1上上"/var/www/html/upload/"下的static和data静态数据文件共享给node2,node3挂载使用

---/var/www/html/upload中需要挂载的目录如下
data   ┄┄┄数据缓存及附件
static ┄┄┄静态文件

配置node1为NFS共享存储服务

--centos 6.5已经安装NFS服务
--配置共享挂载目录
# vim /etc/exports
#NFS输出目录为data,可以访问这个目录的主机为node2和node3,权限为读写,访问uid为0(root),允许超过1024的端口号连接
/var/www/html/upload/data/ 192.168.56.12(rw,all_squash,anonuid=0,insecure)
/var/www/html/upload/data/ 192.168.56.13(rw,all_squash,anonuid=0,insecure)
#NFS输出目录为static,可以访问这个目录的主机为node2和node3,权限为读写,访问uid为0(root),允许超过1024的端口号连接
/var/www/html/upload/static/ 192.168.56.12(rw,all_squash,anonuid=0,insecure)
/var/www/html/upload/static/ 192.168.56.13(rw,all_squash,anonuid=0,insecure)

--重启nfs服务并加入自启动服务列表
# service nfs restart
# chkconfig nfs on

--刷新挂载目录
# exportfs -ra
--查看nfs共享状态
# showmount -e
Export list for node1.samlee.com:
/var/www/html/upload/static 192.168.56.13,192.168.56.12
/var/www/html/upload/data   192.168.56.13,192.168.56.12

在node2上配置挂载:

--使用/etc/fstab挂载共享目录
# vim /etc/fstab 
192.168.56.11:/var/www/html/upload/static    /var/www/html/upload/static    nfs    defaults,_rnetdev    0 0
192.168.56.11:/var/www/html/upload/data        /var/www/html/upload/data    nfs    defaults,_rnetdev    0 0
--重新挂载所有目录
# mount -a

在node3上配置挂载:

--使用/etc/fstab挂载共享目录
# vim /etc/fstab 
192.168.56.11:/var/www/html/upload/static    /var/www/html/upload/static    nfs    defaults,_rnetdev    0 0
192.168.56.11:/var/www/html/upload/data        /var/www/html/upload/data    nfs    defaults,_rnetdev    0 0
--重新挂载所有目录
# mount -a

(9)配置public主机网络环境

--eth0配置如下:
# ifconfig eth1 172.16.100.1/16
# route add default gw 172.16.0.1
--eth1配置如下:
# ifconfig eth1 192.168.56.10/24

(10)安装haproxy工具(在public主机上操作)

# yum -y install haproxy

(11)配置系统日志记录haproxy日志记录至指定目录

# vim /etc/rsyslog.conf 
# Provides UDP syslog reception    --监听udp514端口
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception    --监听tcp514端口
$ModLoad imtcp
$InputTCPServerRun 514

# Save haproxy messages 
local3.*                                                /var/log/haproxy.log

重启rsyslog服务,查询监听端口:

# service rsyslog restart
# ss -tunlp | grep 514
udp    UNCONN     0      0                      *:514                   *:*      users:(("rsyslogd",3612,3))
udp    UNCONN     0      0                     :::514                  :::*      users:(("rsyslogd",3612,4))
tcp    LISTEN     0      25                    :::514                  :::*      users:(("rsyslogd",3612,2))
tcp    LISTEN     0      25                     *:514                   *:*      users:(("rsyslogd",3612,1))

以上可以说明rsyslog记录日志配置成功。

(12)配置haproxy实现---haproxy统计页面的输出机制---haproxy动静分离机制;

# vim /etc/haproxy/haproxy.cfg
==========================================================================================
global    #全局配置
 
    log         127.0.0.1 local3      #日志纪录位置
 
    chroot      /var/lib/haproxy       #haproxy的工作目录
    pidfile     /var/run/haproxy.pid   #pid文件位置
    maxconn     4000                   #最大连接数
    user        haproxy                #运行时使用的用户身份
    group       haproxy                #运行时使用的组身份
    daemon                             #启动为守护进程,不加此处运行在前台
     
    stats socket /var/lib/haproxy/stats    #本地访问stats统计信息时以套接字方式通信
===========================================================================================     
defaults                                          #默认配置
    mode                    http                  #已http模式运行
    log                     global                  #默认日志为全局配置中日志的设置
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8    #除本机外所有发往服务器的请求首部中加入“X-Forwarded-For”首部
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000    #前端最大并发连接数
==========================================================================================     
listen static                         #设置统计报告页面
    bind *:5656                         #监听在本机5656端口
    stats enable                     #打开统计页面功能
    stats hide-version                 #隐藏haproxy版本
    stats uri /hadmin?stats             #统计页面路径
    stats realm "HAProxy/ Static"    #打开统计页面的认证功能
    stats auth haproxy:redhat        #进入统计页面所使用的账号haproxy 密码redhat
    stats admin if TRUE              #条件满足时进入管理级别
==========================================================================================     
frontend  bbs    #前端设置
    bind *:80    #监听在80端口
    acl url_static path_beg -i /data /static /images /javascript /stylesheets    #url开头为这些的静态内容
    acl url_static path_end -i .jpg .gif .png .css .js .html .ico    #url结尾带为这些的静态内容
    use_backend staser  if url_static    #如果静态内容符合url_static的条件,就调度到staser中的服务器
    default_backend             dyser    #其他默认调度到dyser中的服务器
     
backend dyser    #后端动态内容服务器设置
    cookie samlee insert nocache    #在cookie中插入samlee字串防止登录信息丢失
    balance     roundrobin           #调度算法为轮询
    server      node2 192.168.56.12:80 check
    server      node3 192.168.56.13:80 check
     
backend staser    #后端静态内容服务器设置
    balance     roundrobin
    server  node1 192.168.56.11:80 check

重启haproxy服务,检查监听端口:

# service haproxy restart
# ss -tunlp | grep 80
tcp    LISTEN     0      128                    *:80                    *:*      users:(("haproxy",3816,6))
# ss -tunlp | grep 5656
tcp    LISTEN     0      128                    *:5656                  *:*      users:(("haproxy",3816,4))

(13)修改node1,node2,node3的http配置文件,记录实际访问主机的ip地址信息而不是haproxy代理地址

# vim /etc/httpd/conf/httpd.conf
#修改一下内容
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# service httpd reload

(14)最后测试如下:

(1)使用地址http://public.samlee.com访问测试如下所示:

(2)使用地址:http://public.samlee.com:5656/hadmin?stats访问测试--用户:haproxy 密码:redhat 如下所示:

(3)登录论坛上传图片测试:

在新窗口打开图片进行静态图片读取测试:

(4)测试cookie中记录samlee是否生效

(5)查询httpd日志状态如下所分析出,动静分离机制已实现:

# for i in node1 node2 node3;do ssh $i ‘tail -1 /var/log/httpd/access_log‘;done
192.168.56.1 - - [16/Sep/2016:15:40:57 +0800] "GET /static/image/admincp/bg_login.gif HTTP/1.1" 200 475 "http://public.samlee.com/static/image/admincp/admincp.css" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
192.168.56.1 - - [16/Sep/2016:15:40:57 +0800] "GET /admin.php HTTP/1.1" 200 2686 "http://public.samlee.com/forum.php?mod=viewthread&tid=1&extra=page%3D1" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
192.168.56.1 - - [16/Sep/2016:15:40:59 +0800] "GET /misc.php?mod=patch&action=pluginnotice&inajax=1&ajaxtarget=plugin_notice HTTP/1.1" 200 65 "http://public.samlee.com/forum.php?mod=viewthread&tid=1&extra=page%3D1" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
时间: 2024-12-19 07:41:15

高性能Web服务之haproxy应用详解及实现论坛的动静分离机制的相关文章

高性能Web服务之nginx应用详解

一.Nginx特性 * *模块化,目前只能将模块编译进Nginx,暂时不支持动态装卸模块.(httpd优势) * *可靠性,一个主进程(master)控制多个工作进程(worker),工作进程响应用户多个请求(httpd劣势) * *低内存消耗,(httpd劣势) * *支持热部署,(httpd相同) * *支持事件驱动I/O,AI/O,支持mmap(httpd2.4才算支持event,劣势) 二.Nginx基本架构 Nginx由一个master进程生成多个worker进程,每个worker进程

高性能Web服务之varnish应用详解及实战应用

Varnish是一款开源的反向代理软件和HTTP加速器,也称为带缓存反向代理服务,与传统的Squid相比,Varnish具有性能更高.速度更快.管理更方便等诸多优点,很多大型的运营网站都开始尝试使用Varnish来替换Squid,这也是促使Varnish迅速发展起来的原因. Varnish同时也可作为Web缓存服务器,Web缓存(web cache)到底是是什么?Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在与Web服务器和客户端(浏览器)直接的副本.缓存会根据进来的请求

高性能Web服务之Nginx+Tomcat实现负债均衡反向代理及动静分离

在实际生产中,Tomcat服务器一般不单独使用在项目中,对于静态资源的响应Nginx表现的比较好,另外由于nginx是专门用于反向代理的服务器,所以很容易实现将java的请求转发到后端交给tomcat容器处理,而本身用来处理静态资源. 通常tomcat前端是nginx或apache,后端都为tomcat,也就意味着无论前端是什么角色都是以代理的方式进行工作的;但是要注意的是如果基于nginx做反向代理,转发请求到tomcat的时候是基于http协议进行转发的:但注意的是tomcat的连接器有ht

Nginx架构及其web服务搭建优化配置详解

Nginx安装配置及其理论详解 Nginx的功能介绍绍及其优势性能 Nginx的官方站点Nginx.org Nginx的版本号,次版本号如是表示偶数一般表示是稳定版,如果是基数一般表示是开发版.我们可以根据需要来使用. Nginx的优势特性: 1.模块化设计,有着很好的扩展性.(想实现什么功能,只需要安装模块就好) 2.高可靠性:因为他是主控进程和worker是同步实现的,一个worker出现问题,会立刻启动另一个worker. 3.较低的内存消耗,一万个长连接(keep-alive),在Ngi

Axis2 Web服务配置文件services.xml详解

在Axis1中部署服务时,我们使用service.wsdd文件来配置服务.在Axis2中,不再使用service.wsdd文件来配置服务,改用services.xml了.这两个配置文件的语法是截然不同的. 本文涵盖了services.xml文件的语法和使用说明.在Apache Axis2/Java中,同一个服务包文件既可以用于部署单个服务,也可以部署多个服务.不论以何种方式部署服务,一个有效的服务包文件必须包含services.xml文件.随着我们部署服务的方式不同,services.xml文件

HAproxy指南之haproxy配置详解(理论篇)

一.haproxy配置文件详解 haproxy配置分为五部分,分别如下: 1 global:  (全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关) 2 default : (配置默认参数,这些参数可以被用到frontend,backend,Listen组件) 在此部分中设置的参数值,默认会自动引用到下面的frontend.backend.listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可.而如果frontend.backend.l

haproxy 基础详解 及 动静分离的实现

haproxy 介绍 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器 负载均衡调度器分类 工作在四层: # lvs 工作在七层: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 实现MySQL的读写中读的负载均衡 # ats (apache traffic server) # perlbal # pound

asp.net中web.config配置节点大全详解【转】

web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所在目录下不存在web.config文件或者web.config文件中不存在该结点名,则查找它的上级目录,直到网站的根目录. (3)如果网站根目录下不存在web.config文件或者web.config文件中不存在该节点名则在%windir%"Microsoft.NET"Framework"v2.0.

redis服务部署及配置详解

Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务器. Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为"全