首页 > 代码库 > 高性能Web服务之haproxy应用详解及实现论坛的动静分离机制
高性能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 bbsroot@‘%‘ IDENTIFIED BY ‘redhat‘; ---创建并授权账号bbsroot密码redhat给dzbbs库,授权范围为本地主机 mysql> GRANT ALL PRIVILEGES ON dzbbs.* to bbsroot@localhost 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/* root@node2:/var/www/html/ # scp -r /var/www/html/* root@node3:/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"
本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1853122
高性能Web服务之haproxy应用详解及实现论坛的动静分离机制