架构师反向代理Haproxy+压力测试 - 学习笔记

一.Apache的反向代理(生产不建议使用)


1.Apache的编译安装:

yum install 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 -zxvf 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
ln -s /usr/local/httpd-2.4.18/ /usr/local/httpd

2.启动Apache:

/usr/local/httpd/bin/apachectl -t
/usr/local/httpd/bin/apachectl -k start

3.修改配置文件,打开反向代理模块:

vim /usr/local/httpd/conf/httpd.conf

Include conf/extra/proxy.conf

4.配置apahce的反向代理:

vim /usr/local/httpd/conf/extra/proxy.conf

#打开相关模块
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://172.16.1.211:80
BalancerMember http://172.16.1.210:80 smax=10
</Proxy>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/opt"
    ServerName www.wmj.com
    ServerAlias wmj.com
    ErrorLog "logs/www.wmj.com-error_log"
    CustomLog "logs/www.wmj.com-access_log" common
#配置反向代理
    ProxyPass / balancer://mycluster
    ProxyPassReverse / balancer://mycluster

</VirtualHost>

5.测试访问:

./bin/apachectl -k start
http://www.wmj.com

二.Haproxy的反向代理


1.Haproxy与Nginx的对比:

Nginx:
  优点:
  1.Web服务器,比较广泛,大家都会。
  2.工作在7层,可以用location设置基于http的复杂负载均衡。
  3.性能强大,网络依赖小。
  缺点:
  1.健康检查单一,不支持Url。
  2.负载均衡算法少。
  3.不能动态管理。
  4.没有集群upstream的状态页面。
Haproxy:
  优点:
  1.专门做反向代理负载均衡的。
  2.负载均衡算法8种。
  3.性能大于Nginx。
  4.能支持动态管理。通过haproxy的sock通信。
  5.有比较丰富的dashboard的界面。
  6.有比较强大的7层功能。
  缺点:
  1.配置复杂。

2.Haproxy安装:

wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.12.tar.gz
tar -zxvf haproxy-1.6.12.tar.gz
cd haproxy-1.6.12
make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.6.3
make install
cp /usr/local/sbin/haproxy /usr/sbin/
cp examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
useradd -r haproxy -s /sbin/nologin
mkdir /var/lib/haproxy
mkdir /etc/haproxy

3.配置Haproxy:

# 打开syslog的UDP端口:
vim /etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514

local3.*                                                /var/log/haproxy.log

/etc/init.d/rsyslog restart

#配置haproxy:
vim /etc/haproxyhaproxy.cfg

global
    log         127.0.0.1 local3 info
    chroot      /var/lib/haproxy
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    timeout connect         5000
    timeout client          50000
    timeout server          50000

frontend  www_wmj_com
    bind     *:80
    stats   uri     /haproxy?stats
    default_backend     www_wmj_com_backend

backend www_wmj_com_backend
    balance     roundrobin
    server  app1 127.0.0.1:80 check inter 2s rise 3 fall 3 weight 1
    server  app2 127.0.0.1:80 check inter 2s rise 3 fall 3 weight 1

/etc/init.d/haproxy start

4.配置详解:

global
    log         127.0.0.1 local3 info   #设置日志
    chroot      /var/lib/haproxy        #chroot目录
    maxconn     4000                    #最大连接数
    user        haproxy                 
    group       haproxy
    daemon                              #后台运行

defaults
    mode                    http
    log                     global          #记录访问日志,生产环境不要记
    option                  httplog         #记录http请求,生产环境不要记
    option                  dontlognull     #不记录空连接
    timeout connect         5000
    timeout client          50000
    timeout server          50000

frontend  www_wmj_com          #前端配置
    bind     *:80             #监听地址
    stats   uri     /haproxy?stats      #状态页面
    default_backend       www_wmj_com_backend      #默认backend

backend www_wmj_com_backend
    option      httpchk    GET   /index.html     #检测参数
    balance     roundrobin       #轮询
    server  app1 127.0.0.1:80 check inter 2s rise 3 fall 3 weight 1
    server  app2 127.0.0.1:80 check inter 2s rise 3 fall 3 weight 1

5.访问统计页面:

http://172.16.1.211/haproxy?stats

6.让后端能获取客户端真实IP:

在backend下面添加
option  forwardfor    header   X-REAL-IP
#后端只要获取“X-REAL-IP”就能得到客户端真实IP

7.控制不同域名访问不同backend:

frontend  www_wmj_com
    bind     *:80
    stats   uri     /haproxy?stats
    default_backend     www_wmj_com_backend
    acl is_bbs_wmj_com  hdr_end(host)  bbs.wmj.com    #定义一个is_bbs_wmj_com名称的acl
    use_backend   bbs_wmj_com_backend   if   is_bbs_wmj_com

backend www_wmj_com_backend
    option  forwardfor    header   X-REAL-IP
    balance     roundrobin
    server  app1 172.16.1.210:80 check inter 2s rise 3 fall 3 weight 1

backend bbs_wmj_com_backend
    option  forwardfor    header   X-REAL-IP
    balance     roundrobin
    server  app1 172.16.1.240:80 check inter 2s rise 3 fall 3 weight 1

8.控制不同后缀访问不同backend:

frontend  www_wmj_com
    bind     *:80
    stats   uri     /haproxy?stats
    default_backend     www_wmj_com_backend
    acl is_img  url_reg  /*.(css|jpg|png)$
    use_backend   bbs_wmj_com_backend   if   is_img

backend www_wmj_com_backend
    option  forwardfor    header   X-REAL-IP
    balance roundrobin
    server  app1 172.16.1.210:80 check inter 2s rise 3 fall 3 weight 1

backend bbs_wmj_com_backend
    option  forwardfor    header   X-REAL-IP
    balance roundrobin
    server  app1 172.16.1.240:80 check inter 2s rise 3 fall 3 weight 1

9.控制不同URL头部访问不同backend:

acl is_bbs_wmj_com  url_beg  /dashboard/

10.控制不同类型客户端访问不同backend:

acl is_ua_android  hdr_reg(User-Agent)  -i android

三.Haproxy的在线维护


1.打开Haproxy的socket监听:

vim /etc/haproxy/haproxy.cfg

#global下面添加
    stats   socket   /var/lib/haproxy/haproxy.sock mode 600 level admin
    stats   timeout  30s

2.查看sock帮助和状态信息:

yum install socat
echo "help" |socat stdio /var/lib/haproxy/haproxy.sock
echo "show info" |socat stdio /var/lib/haproxy/haproxy.sock

3.通过sock关闭一个节点:

echo "disable server www_wmj_com_backend/app1 " |socat stdio /var/lib/haproxy/haproxy.sock

4.Haproxy生产调优:

1.不要开多进程(默认是一个)
2.解决端口用满的问题(调下面两个内核参数):
net.ipv4.ip_local_port_range = 2048 65000      #增加端口范围
net.ipv4.tcp_tw_reuse = 1           #开启端口复用
3.可以让多个IP去访问后端服务器,终极解决端口不够问题。

四.Nginx做tcp和udp反向代理


参考链接:http://nginx.org/en/docs/stream/ngx_stream_core_module.html

1.安装编译时要添加:

--with-stream

2.修改配置文件:

vim conf/nginx.conf

#http外面添加
stream {
    upstream tcp_proxy {
       server 172.16.1.240:22 ;
       server 172.16.1.241:22 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 2222;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;   #3秒没有操作就退出
        proxy_pass tcp_proxy;
    }
}

四.Nginx架构师知识


1.Nginx指南:

http://www.jb51.net/books/24955.html

2.Nginx突破10W并发:

http://www.cnblogs.com/zhangrumingbj/p/3887693.html

3.性能测试两个指标:

吞吐率,响应时间

4.用ab进行性能测试:

yum install httpd-tools
ab -n 10000 -c 100 http://172.16.1.211/
-n: 总请求数
-c: 并发数

5.测试结果详解:

Server Software:        Apache/2.2.19    ##apache版本 
Server Hostname:        vm1.jianfeng.com   ##请求的主机名 
Server Port:            80 ##请求端口

Document Path:          /a.html 
Document Length:        25 bytes  ##页面长度,不包含头信息

Concurrency Level:      100  ##并发数 
Time taken for tests:   0.273 seconds  ##处理所有请求共使用了多少时间 
Complete requests:      1000   ##总请求数 
Failed requests:        0   ##失败请求数 
Write errors:           0   
Total transferred:      275000 bytes  ##总共传输字节数,包含http的头信息等 
HTML transferred:       25000 bytes  ##html字节数,实际的页面传递字节数 ,不包含头信息
Requests per second:    3661.60 [#/sec] (mean)  ##每秒处理多少请求,非常重要的参数值,服务器的吞吐量 
Time per request:       27.310 [ms] (mean)  ##用户平均请求等待时间,也非常重要 
Time per request:       0.273 [ms] (mean, across all concurrent requests)  ##服务器平均处理时间,也就是服务器吞吐量的倒数 
Transfer rate:          983.34 [Kbytes/sec] received  ##每秒获取的数据长度

Connection Times (ms) 
              min  mean[+/-sd] median   max 
Connect:        0    1   2.3      0      16 
Processing:     6   25   3.2     25      32 
Waiting:        5   24   3.2     25      32 
Total:          6   25   4.0     25      48

Percentage of the requests served within a certain time (ms) 
  50%     25  ## 50%的请求在25ms内返回 
  66%     26  ## 60%的请求在26ms内返回 
  75%     26 
  80%     26 
  90%     27 
  95%     31 
  98%     38 
  99%     43 
 100%     48 (longest request

6.多次测试结果分析:

#按比例增加并发数
ab -n 10000 -c 100 http://172.16.1.211/
ab -n 10000 -c 200 http://172.16.1.211/
ab -n 10000 -c 250 http://172.16.1.211/
ab -n 10000 -c 300 http://172.16.1.211/
ab -n 10000 -c 400 http://172.16.1.211/
并发数每秒处理多少请求数平均请求等待时间
100605916
200541336
250326676
300325592
4003283121

从上面表格看出,并发200开始每秒请求数和等待时间都开始变差,从而可以得出服务器的合理并发大概为200

7.查看进程打开哪些文件:

lsof -p 18237
-p: 后面跟进程号

8.跟踪线程命令:

strace -p 18237
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值