nginx扩展功能

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

本文系统: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示例图:

wKiom1RgiZfRUYAEAAHU8Rzq7qI777.jpg

1.2.1、配置nginx proxy主机;nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     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;
         }
         }

测试:

wKiom1RgkIySZtChAAD9FJaWLqE914.jpg

1.2.2、配置nginx针对后台服务器进行健康检测;当后端服务器宕掉的话,就会自动踢掉;

1
2
3
4
     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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     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;
         }
1
2
mkdir  /opt/nginx/nginx/html/error
echo  "Test error index"  /opt/nginx/nginx/html/error/index .html

关闭后端两台服务器httpd服务,进行测试;他会自动转到本地的1020端口;

wKiom1Rgl6qzLeblAABhnWZB4sY689.jpg

1.3、配置ip_hash负载均衡

  ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,可以解决网页session共享问题。

1
2
3
4
5
     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;

wKioL1RgmqDyjvumAABfE_y-5_8108.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参数指定缓存的子目录数,例如:

1
proxy_cache_path   /data/nginx/cache   levels=1:2   keys_zone=one:10m;

文件名类似于:

1
/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指的是共享池的大小。  
注意每一个定义的内存池必须是不重复的路径,例如:

1
2
3
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;  
为不同的应答设置不同的缓存时间,例如:

1
2
proxy_cache_valid  200 302  10m;
proxy_cache_valid  404      1m;

为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。  
如果只定义时间:

1
proxy_cache_valid 5m;

那么只对代码为200, 301和302的应答进行缓存。  
同样可以使用any参数任何应答。

1
2
3
proxy_cache_valid  200 302 10m;
proxy_cache_valid  301 1h;
proxy_cache_valid  any 1m;

配置nginx缓存;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    [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;
         }

wKioL1RgpAfzOwW-AAEOvOk-1b8618.jpg

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

wKiom1RgpFrig2DMAACWdZr7Wv4408.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 命中

wKiom1RgpYbBecbTAAFWf04IjEk153.jpg

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

wKioL1RgpliyYzUZAACfaE3c5hE355.jpg

wKioL1RgpqDx0Eg9AAC6k-rTRoM973.jpg



本文转自 西索oO 51CTO博客,原文链接:http://blog.51cto.com/lansgg/1575838

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
负载均衡 网络协议 应用服务中间件
【Nginx】Nginx 功能特性
【1月更文挑战第25天】【Nginx】Nginx 功能特性
|
应用服务中间件 nginx
nginx防盗链功能
nginx防盗链功能
|
1月前
|
负载均衡 安全 应用服务中间件
nginx的强大功能和如何使用?
nginx的强大功能和如何使用?
58 2
|
3月前
|
运维 算法 应用服务中间件
运维系列.Nginx中使用HTTP压缩功能(一)
运维系列.Nginx中使用HTTP压缩功能(一)
67 1
|
3月前
|
运维 应用服务中间件 网络安全
运维系列.Nginx配置文件结构功能总结
运维系列.Nginx配置文件结构功能总结
65 0
运维系列.Nginx配置文件结构功能总结
|
3月前
|
缓存 负载均衡 安全
介绍一下Nginx的反向代理功能吧
【8月更文挑战第22天】介绍一下Nginx的反向代理功能吧
67 0
|
3月前
|
缓存 安全 应用服务中间件
Nginx的反向代理功能有哪些应用场景呢
【8月更文挑战第22天】Nginx的反向代理功能有哪些应用场景呢
203 0
|
3月前
|
缓存 负载均衡 监控
Nginx的反向代理功能如何实现的呢
【8月更文挑战第22天】Nginx的反向代理功能如何实现的呢
36 0
|
3月前
|
缓存 应用服务中间件 nginx
运维系列.Nginx中使用HTTP压缩功能(二)
运维系列.Nginx中使用HTTP压缩功能(二)
50 0
|
5月前
|
JavaScript Ubuntu 应用服务中间件
nginx扩展 OpenResty 实现防cc攻击教程
使用OpenResty实现CC攻击防护,包括两个主要步骤:限制请求速度和JS验证。首先,安装依赖(RHEL/CentOS需安装readline-devel, pcre-devel, openssl-devel,Ubuntu需安装libreadline-dev等)。然后,安装Luajit和OpenResty。在Nginx配置中,创建`lua`共享字典并设置`content_by_lua_file`调用lua脚本。lua脚本检查请求频率,超过限制则返回503,否则增加计数。同时,通过JS验证,生成随机码并重定向用户,用户需携带正确验证码请求才能访问。
139 0