设为首页 收藏本站
查看: 1595|回复: 0

中小企业web集群方案 haproxy+varnish+LNMP+memcached配置

[复制链接]

尚未签到

发表于 2015-11-16 12:49:45 | 显示全部楼层 |阅读模式
  前段时间帮一个中型企业做了一个集群方案配置,目前已经安全运行了一个月,而且速度非常快,稳定性也很强,作为一般中型企业负载均衡的方案,非常的合适。但是由于资本有限,没有做到高可用性方案。

一,拓扑图如下:
DSC0000.jpg

二,架构说明及配置
1, haproxy 服务器: 192.168.1.5            
2, varnish服务器集群:  192.168.1.20;192.168.1.21
3, nginx+fastcgi 服务器:  192.168.1.50
4, memcached 服务器:memcached我是装在nginx+fastcgi服务器上的,192.168.1.50
5, mysql服务器:192.168.1.60
三,具体配置以下我们来一个个讲解,我们先从后端来个个讲解,
1,在192.168.1.60 服务器上安装 mysql

2,  在192.168.1.50 服务器上安装 nginx+fastcgi.
mysql+nginx+fastcgi 配置,这里不讲解了,网上包括我的博客里面都有讲解如何时安装。
3,memcached安装配置。
  这里的memcached 我安装在  192.168.1.50 服务器上 安装步骤如下:
(1)下载所需要的软件 (memcached 目前最新版本为1.4.13)
安装memcached需要libevent库支持,我们下载libevent1.3版本即可

  • #wget  http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
  • #wget  http://www.monkey.org/~provos/libevent-1.3.tar.gz

(2)先安装libevent:

  • # tar zxvf libevent-1.3.tar.gz
  • # cd libevent-1.3
  • # ./configure --prefix=/usr
  • # make
  • # make install

(3)安装memcached,同时需要安装中指定libevent的安装位置:

  • # cd /tmp
  • # tar zxvf memcached-1.4.13.tar.gz
  • # cd memcached-1.4.13
  • # ./configure --with-libevent=/usr
  • # make
  • # make install

安装完成后会把memcached放到 /usr/local/bin/memcached
(4)fastcgi 安装memcache扩展模块,让php支持memcached
1.在http://pecl.php.net/package/memcache 选择相应想要下载的memcache版本。
2.安装PHP的memcache扩展

  • #tar vxzf memcache-2.2.1.tgz
  • #cd memcache-2.2.1
  • #/usr/local/webserver/php/bin/phpize
  • #./configure--enable-memcache --with-php-config=/usr/local/webserver/php/bin/php-config --with-zlib-dir
  • #make
  • #make install

3.上述安装完后会有类似这样的提示:

  • Installing shared extensions: /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/

4,在php.ini 添加一行来载入memcache扩展:

  • #extension = "memcache.so"

  如下图 DSC0001.jpg


  5,重新加载php 配置文件

启动memcached

  • # /usr/local/bin/memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 10240 -P /tmp/memcached.pid

我们来看一下是否正常启动 DSC0002.jpg
端口已正常启动。

  • memcache启动参数备注:
  • -d选项是启动一个守护进程,
  • -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
  • -u是运行Memcache的用户,我这里是root,
  • -l是监听的服务器IP地址,为了安全我这里指定了 127.0.0.1,
  • -p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,
  • -c选项是最大运行的并发连接数,默认是1024,我这里设置10240,按照你服务器的负载量来设定
  • -P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,


Memcached安装完毕。我们来测试一下是否能缓存mysql数据
我们在此服务器上架设一个php网站,此处我先用的是占用资源比较大的magento程序网站,调试好配置文件,绑定一下host文件。看网站是否能正常打开。 DSC0003.jpg

好,网站打开正常,接下来我们看一下,memcached是否发挥了他的作用
这里我们用一个软件 memadmin (网上可以下载到) 来监控一下memcached的缓存命中率,如下图:
DSC0004.jpg
命中率还是挺高的。
4,varnish服务器安装
以下在192.168.1.20 和 192.168.1.21 上操作
下载varnish软件  (此处下载3.0版本)

  • #wget   http://repo.varnish-cache.org/source/varnish-3.0.0.tar.gz
  • #tar -xvf varnish-3.0.0.tar.gz
  • #cd varnish-3.0.0
  • #./configure --prefix=/usr/local/varnish
  • #make &&make install

至此安装完成。
我们来配置一下

  • #vim /usr/local/varnish/etc/varnish/vcl.conf

以下为配置代码:(除backend 及vcl_recv外,其他地方无需更改,这里是更改其访问的主机名,及定义后端服务器地址,字数有限,其他代码这里就不解释了)

  • #Cache for linuxtone sites
  • #backend vhost
  • backend  wwwyaozhibingceshicom {
  • .host = "www.yaozhibingceshi.com";
  • .port = "80";
  • }
  • #acl
  • acl purge {
  •   "localhost";
  •   "127.0.0.1";
  •   "192.168.0.0"/24;
  • }
  • sub vcl_recv {
  •         if (req.http.Accept-Encoding) {
  •             if (req.url ~ "\.(jpg|png|gif|jpeg|flv)$" ) {
  •                 remove req.http.Accept-Encoding;
  •                 remove req.http.Cookie;
  •             } else if (req.http.Accept-Encoding ~ "gzip") {
  •                 set req.http.Accept-Encoding = "gzip";
  •             } else if (req.http.Accept-Encoding ~ "deflate") {
  •                 set req.http.Accept-Encoding = "deflate";
  •             } else {
  •                 remove req.http.Accept-Encoding;
  •             }
  •         }
  •            if (req.http.host ~  "(.*)yaozhibingceshi.com") {
  •                        set req.backend = wwwyaozhibingceshicom;
  •                  }
  •             else {
  •                         error 404 "This website is maintaining or not exist!";
  •                 }
  •   if (req.request == "PURGE") {
  •      if (!client.ip ~purge) {
  •        error 405 "Not Allowed";
  •    }
  • #.dd.....
  •    return(lookup);
  •   }
  • #...GET...url...jpg,png,gif. ..cookie
  •   if (req.request == "GET"&& req.url ~ "\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm|gz|tgz|bz2|tbz|mp3|ogg|mp4|flv|f4v|pdf)$") {
  •         unset req.http.cookie;
  •   }
  • #..GET...url.php....cache....
  •   if (req.request =="GET"&&req.url ~ "\.php($|\?)"){
  •         return (pass);
  •   }
  • #     if (req.restarts == 0) {
  •         if (req.http.x-forwarded-for) {
  •             set req.http.X-Forwarded-For =
  •                 req.http.X-Forwarded-For + ", " + client.ip;
  •         } else {
  •             set req.http.X-Forwarded-For = client.ip;
  •         }
  • #   }
  • #........pipe..
  •     if (req.request != "GET" &&
  •       req.request != "HEAD" &&
  •       req.request != "PUT" &&
  •       req.request != "POST" &&
  •       req.request != "TRACE" &&
  •       req.request != "OPTIONS" &&
  •       req.request != "DELETE") {
  •         return (pipe);
  •     }
  • #..GET .HEAD.....
  •     if (req.request != "GET" && req.request != "HEAD") {
  •         return (pass);
  •     }
  •     if (req.http.Authorization) {
  •         return (pass);
  •     }
  •     return (lookup);
  • }
  • #..url+host hash......
  • sub vcl_hash {
  •     hash_data(req.url);
  •     if (req.http.host) {
  •         hash_data(req.http.host);
  •     } else {
  •         hash_data(server.ip);
  •     }
  •     return (hash);
  • }
  • # .....purge .....
  • sub vcl_hit {
  •    if (req.request == "PURGE") {
  •        set obj.ttl = 0s;
  •        error 200 "Purged";
  •     }
  •     return (deliver);
  • }
  • sub vcl_fetch {
  •           if (req.url ~ "\.(jpeg|jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|ico|swf|flv|dmg|js|css|html|htm)$") {
  •                    set beresp.ttl = 2d;
  •                    set beresp.http.expires = beresp.ttl;
  •                    set beresp.http.Cache-Control = "max-age=172800";
  •                    unset beresp.http.set-cookie;
  •           }
  •           if (req.url ~ "\.(dmg|js|css|html|htm)$") {
  •                    set beresp.do_gzip = true;
  •           }
  •           if (beresp.status == 503) {
  •                          set beresp.saintmode = 15s;
  •           }
  • }
  • sub vcl_deliver {
  •         set resp.http.x-hits = obj.hits ;
  •         if (obj.hits > 0) {
  •                 set resp.http.X-Cache = "HIT You!";
  •         } else {
  •                 set resp.http.X-Cache = "MISS Me!";
  •         }
  • }

配置文件保存退出 ,并启动 varnish,如下图 DSC0005.jpg

由于我这域名没有注册,所以我们在这两台机器的hosts文件里绑定一下 DSC0006.jpg

另外一台机器我们同样配置
Varnish 已经成功启动了,我们来分别把域名在本地绑定一下,直接访问varnish服务器,看是否能正常打开网站,并查看缓存合中率
DSC0007.jpg
从上图可以看出来,绑定varnish 服务器网站是可以正常打开,而且从varnish自带的命令 varnishstat 来看,平均缓存命中率能达到 92%,命中率也是非常的高!另一台同样的测试方法
至此,varnish 服务器集群安装配置完成。
5,Haproxy 服务器安装配置
以下配置在 192.168.1.5;192.168.1.6 服务器上运行
下载 haproxy 软件 (目前最新版本为1.4.19)

  • wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.19.tar.gz
  • #tar -xvf haproxy-1.4.19.tar.gz
  • #cd haproxy-1.4.19
  • #make TARGET=linux26 PREFIX=/usr/local/haproxy
  • #make install PREFIX=/usr/local/haproxy

安装完成,接下来配置一下 我解析几个比较重要的参数

  • # cd /usr/local/haproxy
  • # vim haproxy.conf
  • global
  •         maxconn 5120
  •         chroot /usr/local/haproxy
  •         uid 99
  •         gid 99
  •         daemon
  •         quiet
  •         nbproc  2
  •         pidfile /usr/local/haproxy/haproxy.pid
  • defaults
  •         log     global
  •         mode    http
  •         option  httplog
  •         option  dontlognull
  •         log 127.0.0.1 local3
  •         retries 3
  •         option redispatch
  •         maxconn 20000
  •         contimeout      5000
  •         clitimeout      50000
  •         srvtimeout      50000
  • listen www.yaozhibingceshi.com 0.0.0.0:80
  •        mode http
  •        stats uri /status                     (后端服务器状态查看地址)
  •        stats realm Haproxy\ statistics
  •        stats auth admin:admin              (状态查看页面登陆帐号密码)
  •        balance source    (调度算法,调度算法有很多,我这里用source是和nginx的ip_hash同理,解决session问题)
  •        option httpclose
  •        option forwardfor
  • server app1_1 192.168.1.20:80 cookie app1inst1 check inter 2000 rise 2 fall 5
  • server app1_2 192.168.1.21:80 cookie app1inst2 check inter 2000 rise 2 fall 5

最下面两行,定义了后端的两台服务器,如果有更多,再另起一行,根据上面的格式写上即可。
配置好后,启动haproxy  并查看是否启动成功 DSC0008.jpg

这样看,是启动成功了的
好的,我们来把域名。绑定到这台haproxy服务器上看网站是否能正常打开。 DSC0009.jpg

我们发现,网站也是可以正常打开的,
haproxy 有宕机检测功能,当后端服务器宕机后,他能自动检测,并禁止链接再发往宕机的机器.
注:haproxy 后端服务器状态查看方法
配置文件里注明了   stats uri /status  即访问 www.域名.com/status 即可查看后端服务器状态
如图:
DSC00010.jpg

这次方案由于资本有限,所以在服务器这块,大大的减少了。如果做到高可用性,
应该要做到 haproxy 集群,nginx+fastcgi集群,以及数据库这块的集群。
但是道理都是一样的,只是多加一些服务器,要达到千万级PV的网站,借用老男孩的一句来说,就是“把所有的用户访问请求都尽量往前推 ”。
QQ:410018348

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139920-1-1.html 上篇帖子: 双机热备+负载均衡 线上方案 (Heartbeat+DRBD+NFS+Keepalived+Lnmp) 下篇帖子: LNMP优化(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表