一.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/
并发数 | 每秒处理多少请求数 | 平均请求等待时间 |
---|---|---|
100 | 6059 | 16 |
200 | 5413 | 36 |
250 | 3266 | 76 |
300 | 3255 | 92 |
400 | 3283 | 121 |
从上面表格看出,并发200开始每秒请求数和等待时间都开始变差,从而可以得出服务器的合理并发大概为200
7.查看进程打开哪些文件:
lsof -p 18237
-p: 后面跟进程号
8.跟踪线程命令:
strace -p 18237