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

[经验分享] nginx扩展功能

[复制链接]

尚未签到

发表于 2018-11-8 08:40:34 | 显示全部楼层 |阅读模式
  本文系统:Centos6.5_x64
  三台主机:nginx主机,hostname: master.lansgg.com  IP: 192.168.10.128
  apache主机,hostname: client1.lansgg.com IP:  192.168.10.129
  apache主机,hostname:client2.lansgg.com IP:192.168.10.130
  -缓存页面信息-读写分离-健康检
  一、nginx负载
  二、nginx缓存页面信息
  1、nginx负载
  1.1、nginx麻雀虽小,五脏俱全..
  nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
  如果只有一台服务器时,这个服务器挂了,那么对于网站来说是个灾难.因此,这时候的负载均衡就会大显身手了,它会自动剔除挂掉的服务器.
  nginx 的 upstream目前支持 4 种方式的分配
  1)、轮询(默认)
  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 weight和访问比率成正比,用于后端服务器性能不均的情况。
  2)、ip_hash
  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  3)、fair(第三方)
  按后端服务器的响应时间来分配请求,响应时间短的优先分配。  Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
  4)、url_hash(第三方)此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
  upstream 每个设备的状态:
  down 表示单前的server暂时不参与负载 ;weight  默认为1.weight越大,负载的权重就越大。
  max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
  fail_timeout:max_fails 次失败后,暂停的时间。
  backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  Tips:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup
  1.2、配置nginx示例图:
DSC0000.jpg

  1.2.1、配置nginx proxy主机;nginx配置文件
    upstream webGroup {     #默认轮询  
        server 192.168.10.129:80   weight=1;  #权重
  
        server 192.168.10.202:80   weight=1;
  
        }
  

  
    server {
  
        listen  1080 default_server;            #1080端口进行转发
  
        server_name     www.lansgg.com lansgg.com;
  
        access_log      logs/lansgg.access.log main;
  
        error_log       logs/lansgg.error.log;
  
        root            /opt/nginx/nginx/html;
  
        index           index.html;
  
        location / {
  
        proxy_pass                   #前面的upstream名字
  
        proxy_set_header    X-Real-IP $remote_addr;
  
        }
  
        }
  测试:
DSC0001.jpg

  1.2.2、配置nginx针对后台服务器进行健康检测;当后端服务器宕掉的话,就会自动踢掉;
    upstream webGroup {  
        server 192.168.10.129:80        weight=1        max_fails=2     fail_timeout=2;
  
        server 192.168.10.202:80        weight=1        max_fails=2     fail_timeout=2;
  
        }
  可以进行后端服务器关闭服务的方法进行测试;
  1.2.3、如果不幸的是所有服务器都不能提供服务了怎么办,用户打开页面就会出现出错页面,那么会带来用户体验的降低,所以我们能不能像配置LVS是配置sorry_server呢,答案是可以的,但这里不是配置sorry_server而是配置backup。
  配置nginx.conf
    upstream webGroup {  
        server 192.168.10.129:80        weight=1        max_fails=2     fail_timeout=2;
  
        server 192.168.10.202:80        weight=1        max_fails=2     fail_timeout=2;
  
        server 192.168.10.128:1020      backup;
  
        }
  

  
    server {
  
        listen  1080 default_server;
  
        server_name     www.lansgg.com lansgg.com;
  
        access_log      logs/lansgg.access.log main;
  
        error_log       logs/lansgg.error.log;
  
        root            /opt/nginx/nginx/html;
  
        index           index.html;
  
        location / {
  
        proxy_pass      http://webGroup;
  
        proxy_set_header    X-Real-IP $remote_addr;
  
        }
  
        }
  

  
    server {
  
        listen       1020;
  
        server_name  wwww.lansgg.com lansgg.com;
  
        access_log      logs/localhost.access.log main;
  
        error_log       logs/localhost.error.log;
  
        root            /opt/nginx/nginx/html/error;
  
        index           index.html;
  
        }
mkdir /opt/nginx/nginx/html/error  
echo "Test error index" > /opt/nginx/nginx/html/error/index.html
  关闭后端两台服务器httpd服务,进行测试;他会自动转到本地的1020端口;
DSC0002.jpg

  1.3、配置ip_hash负载均衡
  ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,可以解决网页session共享问题。
    upstream webGroup {  
        ip_hash;
  
        server 192.168.10.129:80        weight=1        max_fails=2     fail_timeout=2;
  
        server 192.168.10.202:80        weight=1        max_fails=2     fail_timeout=2;
  
        }
  重启进行测试,你会发现页面一直显示一台主机,我这边是web02;
DSC0003.jpg

  2、nginx缓存页面信息
proxy_cache_path 指令  可以使用 http 区域
  语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];  
  指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中,并且使用代理url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数,例如:
proxy_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;  文件名类似于:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c  levels指定目录结构,可以使用任意的1位或2位数字作为目录结构,如 X, X:X,或X:X:X 例如: “2”, “2:2”, “1:1:2“,但是最多只能是三级目录。
  所有活动的key和元数据存储在共享的内存池中,这个区域用keys_zone参数指定。one指的是共享池的名称,10m指的是共享池的大小。
  注意每一个定义的内存池必须是不重复的路径,例如:
proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;  
proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
  
proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;
  如
果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。一个名为cache
manager的进程控制磁盘的缓存大小,它被用来删除不活动的缓存和控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出
max_size指定的值之后,超过其大小后最少使用数据(LRU替换算法)将被删除。内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元
数据大小按照操作系统来定,如FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。
proxy_cache 指令 可以使用  http, server, location 区域
  语法:proxy_cache zone_name;
  设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。
  在
0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control:
max-age=XXX”头部字段,0.7.66版本以后,”Cache-Control:“private”和”no-store”头同样被遵循。
nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置
“no-cache”或者”max-age=0”头,或者proxy_cache_key包含用户指定的数据如$cookie_xxx,使用cookie
的值作为proxy_cache_key的一部分可以防止缓存私有数据,所以可以在不同的location中分别指定proxy_cache_key的值
以便分开私有数据和公有数据。
  缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。
proxy_cache_valid 指令 可以使用  http, server, location  区域
  语法:proxy_cache_valid reply_code [reply_code …] time;
  为不同的应答设置不同的缓存时间,例如:
proxy_cache_valid  200 302  10m;  
proxy_cache_valid  404      1m;
  为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。
  如果只定义时间:
proxy_cache_valid 5m;  那么只对代码为200, 301和302的应答进行缓存。
  同样可以使用any参数任何应答。
proxy_cache_valid  200 302 10m;  
proxy_cache_valid  301 1h;
  
proxy_cache_valid  any 1m;
  配置nginx缓存;
   [root@master conf]# mkdir -p /opt/nginx/nginx/proxy_cache/webGroup  
   [root@master conf]# vim nginx.conf
  
   proxy_cache_path /opt/nginx/nginx/proxy_cache/webGroup levels=1:2 keys_zone=webGroup:20m max_size=128m;
  

  
    upstream webGroup {
  
        ip_hash;
  
        server 192.168.10.129:80        weight=1        max_fails=2     fail_timeout=2;
  
        server 192.168.10.202:80        weight=1        max_fails=2     fail_timeout=2;
  
        }
  

  
    server {
  
        listen  1080 default_server;
  
        server_name     www.lansgg.com lansgg.com;
  
        access_log      logs/lansgg.access.log main;
  
        error_log       logs/lansgg.error.log;
  
        root            /opt/nginx/nginx/html;
  
        index           index.html;
  
        location / {
  
        proxy_pass      http://webGroup;
  
        proxy_set_header    X-Real-IP $remote_addr;
  
        proxy_cache     webGroup;
  
        proxy_cache_valid       200     10m;
  
        }
DSC0004.jpg

  测试:http://www.lansgg.com:1080
DSC0005.jpg

  缓存变量说明
$server_addr
  服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$upstream_cache_status
  0.8.3版本中其值可能为:

  •   MISS 未命中
  •   EXPIRED - expired。请求被传送到后端。
  •   UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。
  •   STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。
  •   HIT 命中
DSC0006.jpg

  访问:http://www.lansgg.com:1080
DSC0007.jpg

DSC0008.jpg




运维网声明 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.iyunv.com/thread-632177-1-1.html 上篇帖子: Nginx性能测试(未优化篇) 下篇帖子: Cento7+Nginx 之 URL重写
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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