负载均衡和缓存服务也是nginx的实用场景之一。由于模块比较重要,所以在Nginx入门到实战(二)场景实现一文中没有收录,单独抽取。1.负载均衡的实现负载均衡的方法就是我们上一章介绍的反向代理。通过nginx(反向代理)将客户的请求分发到一组多台不同的服务器上。这组服务器称为服务池(上游服务器),池中的每台服务器称为一个单元。在服务池中,每个单元进行请求轮训,实现负载均衡#可以是域名服务器x2.baidu.com;#服务器x3.baidu.com#down不参与负载均衡#weight=5;权重,分布越高,#backup越多;reservedbackupserver#max_fails允许失败次数#fail_timeout失败次数超过后,服务暂停时间#max_coons限制最大接受连接数#根据不同的服务器性能,配置合适的参数#server106.xx.xx.xxx;可以是ip#server106.xx.xx.xxx:8080;可以有端口号#serverunix:/tmp/xxx;outgoingsocket方法}假设我们有三台服务器,假设它们的IP地址,前端负载均衡服务器A(127.0.0.1),后台服务器B(127.0.0.2),后台服务器C(127.0.0.3)新建一个文件proxy.conf,内容如下,上一章介绍的反向代理配置proxy_redirectdefault;proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_connect_timeout30;proxy_send_timeout60;proxy_read_timeout60;proxy_buffer_size32k;proxy_bufferingon;proxy_buffers4128k;proxy_busy_buffers_size256k;proxy_max_temp_file_size256k;#服务器A的配置http{...上游xxx{服务器127.0.0.2;服务器127.0.0.3;}服务器{liseten80;服务器名称本地主机;location/{proxy_passhttp://xxx#upstream对应自定义名称includeproxy.conf;}}}#ServerB,ServerC的配置server{liseten80;服务器名称本地主机;location/{indexindex.html}}调度算法round-robintraining:按时间顺序逐个分配给不同的后端服务器weightedround-robintraining:权重值越大,被分配到的概率越高高ip_hash:每个请求根据访问IP的哈希结果进行分配,使同一个IP可以访问一个后端服务器。分配请求,每个URL指向同一个后端服务器hashkey值:hashcustomkeyip_hashconfigurationupstreamxxx{ip_hash;服务器127.0.0.2;服务器127.0.0.3;}ip_hash有缺陷。当前端服务器多一层时,将获取不到用户正确的IP,会获取到上一个前端服务器的IP。因此nginx1.7.2版本推出url_hashurl_hash配置upstreamxxx{hash$request_uri;服务器127.0.0.2;服务器127.0.0.3;}2.缓存服务1.缓存类型服务器端缓存:缓存保存在后端服务器上,如redis、memcache代理缓存:缓存保存在代理服务器或中间件上,其内容是从后台获取的-端服务器,但是保存在自己的本地客户端缓存中:缓存在浏览器中2.nginx代理缓存客户端请求nginx,nginx检查本地是否有缓存数据,如果有则直接返回给客户端,如果没有则去到后端服务器请求http{proxy_cache_path/var/www/cache#缓存地址levels=1:2#目录分类keys_zone=test_cache:10m#开启的keys空间名称:空间大小(1m可以存放8000个keys)max_size=10g#目录的最大大小(如果超过,不常用的将被删除)inactive=60m#60分钟内未访问的缓存将被清除use_temp_path=pff;#是否开启临时文件目录,关闭默认存放在缓存地址server{...location/{proxy_cachetest_cache;#打开缓存对应的名称,在keys_zone中命名proxy_cache_valid20030412h;#Cachewithstatuscode200304for12hoursproxy_cache_validany10米;#其他状态缓存10小时proxy_cache_key$host$uri$is_args$args;#设置键值add_headerNginx-Cache"$upstream_cache_status";}}}当有特定的请求我们不需要缓存时,在上面配置内容中加入如下配置server{...if($request_uri~^/(login|register)){#当请求地址有登录或注册,设置$nocache=1;#Setacustomvariabletotrue}location/{proxy_no_cache$nocache$arg_nocache$arg_comment;proxy_no_cache$http_pragma$http_authoriztion;}}3.分片请求早期版本的nginx不支持大文件分片请求的缓存。1.9版本之后slice模块实现了这个功能。前端发起请求,nginx获取本次请求文件的大小,如果超过我们定义的分片大小,则会分片分成多个小请求请求后端,成为一个独立的缓存前端文件优点:每个子请求接收到的所有数据都会形成一个独立的文件。如果一个请求被中断,其他请求不会受到影响。在原来的情况下,请求被中断了,请求文件会重新从头开始。开启分片请求后,接下来会获取未请求的小文件。缺点:当文件很大时,大片或小片都可能导致文件描述符耗尽语法:slicesize;#请求大文件时,设置size为每个小文件的大小默认:slice0;位置:http/服务器/位置
