1.负载均衡和反向代理介绍
负载均衡是多台服务器对称方式组成一个服务器的集合,每个服务器都能单独对外提供服务,通过负载均衡技术,将客户端请求均匀的分配到服务器集合中的某个服务器上,然后服务器独立响应客户端的请求,这样解决了高并发的访问。
反向代理是指以代理服务器接受用户请求,然后将请求,转发给内部网络上的服务器,并将从服务器上得到的结果返回给用户,这时代理服务器对外表现为一个服务器,代理服务器上没有保存任何的网页数据,所有的静态网页和CGI程序都保存在内部网络上的web服务器上,增加了web服务的安全性。
2.常见的负载均衡方法
2.1用户手动选择,在下载业务的网站中常见。
2.2DNS轮询,一个域名,可以解析到多个服务器。但是可靠性不高,一旦某个服务器宕机,解析到此服务器的请求就不能响应,而且DNS缓存时间比较长,即使去掉DNS中服务器解析也不能立即生效,另外一个问题负载不均衡,因为不能反映各个服务器的运行情况和性能,同时DNS缓存又使解析都到了同一个服务器上。
2.3四/七层负载均衡
这个四七层指的是OSI标准的网络模型,四层是传输层,七层是应用层。
四层负载均衡可以使用硬件实现如:F5 BIG-IP、Citrix NetScaler等,价格不菲。不过也可以使用软件的方式实现,代表是国人章文嵩博士研发的LVS。
七层负载均衡大体使用HTTP反向代理方式,代表是Nginx、HAProxy等,这里主要说下Nginx,因为它能很好配置,同时可以按轮询,IPHash、权重、URLHash等方式实现负载均衡,也能检查后端服务器的健康状态。
3.一个nginx反向代理服务器的大体配置
user nginx nginx; worker_processes 1; #一般与CPU数量相等 error_log /var/log/nginx/error.log crit; #错误日志记录路径,错误类型crit:记录最少错误 #error_log logs/error.log notice; #error_log logs/error.log info; pid /var/run/nginx.pid; #主进程号位置 worker_rlimit_nofile 51200; #打开最多文件数 events { use epoll; #使用的IO模型,这里是事件触发型 worker_connections 51200; #最大连接数 } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; #内存中缓存服务器名的hash表大小 client_header_buffer_size 32k; #用户头信息的缓冲大小,如果用户cookie大就设定大点 large_client_header_buffers 4 32k; #缓冲头信息的数量,和大小 #log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ # ‘$status $body_bytes_sent "$http_referer" ‘ # ‘"$http_user_agent" "$http_x_forwarded_for"‘; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #禁用nagle算法,这个算法不适用与C/S的情况 fastcgi_connect_timeout 300; #fastcgi进程连接超时时长 fastcgi_send_timeout 300; #发送超时时长 fastcgi_read_timeout 300; #响应超时时长 fastcgi_buffer_size 64k; #缓冲头大小 fastcgi_buffers 4 64k; #缓冲数量和大小,一般是站点中php/java脚本所产生页面大小中间值 fastcgi_busy_buffers_size 128k; #默认fastcgi_buffer_size两倍 fastcgi_temp_file_write_size 128k; #缓存临时文件的大小默认fastcgi_buffer_size两倍 gzip on; gzip_min_lenth 1k; #最少压缩的数据大小 gzip_buffers 4 16k; #缓冲大小 gzip_http_version 1.1; #版本 gzip_comp_level 2; #压缩比 gzip_types text/plain application/x-javascript text/css application/xml; #压缩文件mime类型 gzip_vary on; #head头上加vary头,判断代理服务器是否支持压缩 client_max_body_size 300m; #最大请求单个文件大小 client_body_buffer_size 128k; #请求缓冲区大小 proxy_connect_timeout 600; #连接超时时间 proxy_read_timeout 600; #连接后响应超时时间 proxy_send_timeout 600; #连接后传送数据超时时间 proxy_buffer_size 16k; #缓冲大小 proxy_buffers 4 32k; #缓冲大小和数量 proxy_busy_buffers_size 64k; #系统繁忙时,缓冲申请的最大空间 proxy_temp_file_write_size 64k; #临时文件缓存大小 upstream php_server_pool { server 192.168.226.131:80 max_fails=2 fail_timeout=30s; #定义服务器组 server 192.168.226.132:80 max_fails=2 fail_timeout=30s; ip_hash; #解决session绑定问题,但是负载均衡效果一般。 } server { listen 80; server_name www.shiyan.com; location / { proxy_next_upstream http_502 http_504 timeout invalid_header; #响应码为多少时,请求发往另外的服务器 proxy_pass http://php_server_pool; #服务器组 proxy_set_header Host www.shiyan.com; #访问的域名 proxy_set_header X-Forwarded-For $remote_addr; #访问经过的代理服务器,和客户端的真是IP } access_log /var/log/nginx/www.shiyan.com_access.log; }
当然通过upstream指令和server指令完全可以实现反向代理的动静网页分离,通过定义location的请求文件格式,去访问静态缓存服务器和不同的服务器组,上文没有多说这方面。
4.Nginx负载均衡的HTTP Upstream模块
4.1 ip——hash指令
后端是多个动态应用服务器时,能够将一个客户端的请求定义到同一台服务器上,能解决session问题,但是这样权重等方法失去效果,负载均衡不好,能session共享来替换它。
4.2 server指令
主要是后端服务器的名称,参数,名称可以是域名,ip端口。参数weigth权重,max_fails对后端服务器请求失败次数,fail_timeout请求失败后超时时间,down标记服务器永久离线,backup标记服务器在非backup服务器全部宕机或者都繁忙时启用。
4.3 upstream指令
定义服务器组,变量:$upstream_addr 请求的upstream服务器ip, $upstream_status服务器的应答状态,$upstream_response_time响应时间,$upstream_http_$HEADER 任意的HTTP协议头信息。