写在前面

在《【高并发】面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!》一文中,我们主要介绍了如何使用Nginx进行限流,以避免系统被大流量压垮。除此之外,Nginx还有很多强大的功能,例如:负载均衡、缓存、黑白名单、灰度发布等。今天,我们就来一起探讨Nginx支持的这些强大的功能!

Nginx安装

注意:这里以CentOS 6.8服务器为例,以root用户身份来安装Nginx。

1.安装依赖环境

  1. yum -y install wget gcc-c++ ncurses ncurses-devel cmake make perl bison openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpng* freetype* autoconf automake zlib* fiex* libxml* libmcrypt* libtool-ltdl-devel* libaio libaio-devel bzr libtool

2.安装openssl

  1. wget https://www.openssl.org/source/openssl-1.0.2s.tar.gz
  2. tar -zxvf openssl-1.0.2s.tar.gz
  3. cd /usr/local/src/openssl-1.0.2s
  4. ./config --prefix=/usr/local/openssl-1.0.2s
  5. make
  6. make install

3.安装pcre

  1. wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
  2. tar -zxvf pcre-8.43.tar.gz
  3. cd /usr/local/src/pcre-8.43
  4. ./configure --prefix=/usr/local/pcre-8.43
  5. make
  6. make install

4.安装zlib

  1. wget https://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
  2. tar -zxvf zlib-1.2.11.tar.gz
  3. cd /usr/local/src/zlib-1.2.11
  4. ./configure --prefix=/usr/local/zlib-1.2.11
  5. make
  6. make

5.安装Nginx

  1. wget http://nginx.org/download/nginx-1.17.2.tar.gz
  2. tar -zxvf nginx-1.17.2.tar.gz
  3. cd /usr/local/src/nginx-1.17.2
  4. ./configure --prefix=/usr/local/nginx-1.17.2 --with-openssl=/usr/local/src/openssl-1.0.2s --with-pcre=/usr/local/src/pcre-8.43 --with-zlib=/usr/local/src/zlib-1.2.11 --with-http_ssl_module
  5. make
  6. make install

这里需要注意的是:安装Nginx时,指定的是openssl、pcre和zlib的源码解压目录,安装完成后Nginx配置文件的完整路径为:/usr/local/nginx-1.17.2/conf/nginx.conf。

Nginx负载均衡配置

1.负载均衡配置

  1. http {
  2. ……
  3. upstream real_server {
  4. server 192.168.103.100:2001 weight=1; #轮询服务器和访问权重
  5. server 192.168.103.100:2002 weight=2;
  6. }
  7. server {
  8. listen 80;
  9. location / {
  10. proxy_pass http://real_server;
  11. }
  12. }
  13. }

2.失败重试配置

  1. upstream real_server {
  2. server 192.168.103.100:2001 weight=1 max_fails=2 fail_timeout=60s;
  3. server 192.168.103.100:2002 weight=2 max_fails=2 fail_timeout=60s;
  4. }

意思是在fail_timeout时间内失败了max_fails次请求后,则认为该上游服务器不可用,然后将该服务地址踢除掉。fail_timeout时间后会再次将该服务器加入存活列表,进行重试。

三、Nginx限流配置

1.配置参数

limit_req_zone指令设置参数

  1. limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
  • limit_req_zone定义在http块中,$binary_remote_addr表示保存客户端IP地址的二进制形式。
  • Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,所以示例中区域可以存储160000个IP地址。
  • Rate定义最大请求速率。示例中速率不能超过每秒10个请求。

2.设置限流

  1. location / {
  2. limit_req zone=mylimit burst=20 nodelay;
  3. proxy_pass http://real_server;
  4. }

burst排队大小,nodelay不限制单个请求间的时间。

3.不限流白名单

  1. geo $limit {
  2. default 1;
  3. 192.168.2.0/24 0;
  4. }
  5. map $limit $limit_key {
  6. 1 $binary_remote_addr;
  7. 0 "";
  8. }
  9. limit_req_zone $limit_key zone=mylimit:10m rate=1r/s;
  10. location / {
  11. limit_req zone=mylimit burst=1 nodelay;
  12. proxy_pass http://real_server;
  13. }

上述配置中,192.168.2.0/24网段的IP访问是不限流的,其他限流。

IP后面的数字含义:

  • 24表示子网掩码:255.255.255.0
  • 16表示子网掩码:255.255.0.0
  • 8表示子网掩码:255.0.0.0

Nginx缓存配置

1.浏览器缓存

静态资源缓存用expire

  1. location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
  2. expires 2d;
  3. }

Response Header中添加了Expires和Cache-Control,

静态资源包括(一般缓存)

  • 普通不变的图像,如logo,图标等
  • js、css静态文件
  • 可下载的内容,媒体文件

协商缓存(add_header ETag/Last-Modified value)

  • HTML文件
  • 经常替换的图片
  • 经常修改的js、css文件
  • 基本不变的API接口

不需要缓存

  • 用户隐私等敏感数据
  • 经常改变的api数据接口

2.代理层缓存

  1. //缓存路径,inactive表示缓存的时间,到期之后将会把缓存清理
  2. proxy_cache_path /data/cache/nginx/ levels=1:2 keys_zone=cache:512m inactive = 1d max_size=8g;
  3. location / {
  4. location ~ \.(htm|html)?$ {
  5. proxy_cache cache;
  6. proxy_cache_key $uri$is_args$args; //以此变量值做HASH,作为KEY
  7. //HTTP响应首部可以看到X-Cache字段,内容可以有HIT,MISS,EXPIRES等等
  8. add_header X-Cache $upstream_cache_status;
  9. proxy_cache_valid 200 10m;
  10. proxy_cache_valid any 1m;
  11. proxy_pass http://real_server;
  12. proxy_redirect off;
  13. }
  14. location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
  15. root /data/webapps/edc;
  16. expires 3d;
  17. add_header Static Nginx-Proxy;
  18. }
  19. }

在本地磁盘创建一个文件目录,根据设置,将请求的资源以K-V形式缓存在此目录当中,KEY需要自己定义(这里用的是url的hash值),同时可以根据需要指定某内容的缓存时长,比如状态码为200缓存10分钟,状态码为301,302的缓存5分钟,其他所有内容缓存1分钟等等。

可以通过purger的功能清理缓存。

AB测试/个性化需求时应禁用掉浏览器缓存。

Nginx黑名单

1.一般配置

  1. location / {
  2. deny 192.168.1.1;
  3. deny 192.168.1.0/24;
  4. allow 10.1.1.0/16;
  5. allow 2001:0db8::/32;
  6. deny all;
  7. }

2. Lua+Redis动态黑名单(OpenResty)

安装运行

  1. yum install yum-utils
  2. yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
  3. yum install openresty
  4. yum install openresty-resty
  5. 查看
  6. yum --disablerepo="*" --enablerepo="openresty" list available
  7. 运行
  8. service openresty start

配置(/usr/local/openresty/nginx/conf/nginx.conf)

  1. lua_shared_dict ip_blacklist 1m;
  2. server {
  3. listen 80;
  4. location / {
  5. access_by_lua_file lua/ip_blacklist.lua;
  6. proxy_pass http://real_server;
  7. }
  8. }

lua脚本(ip_blacklist.lua)

  1. local redis_host = "192.168.1.132"
  2. local redis_port = 6379
  3. local redis_pwd = 123456
  4. local redis_db = 2
  5. -- connection timeout for redis in ms.
  6. local redis_connection_timeout = 100
  7. -- a set key for blacklist entries
  8. local redis_key = "ip_blacklist"
  9. -- cache lookups for this many seconds
  10. local cache_ttl = 60
  11. -- end configuration
  12. local ip = ngx.var.remote_addr
  13. local ip_blacklist = ngx.shared.ip_blacklist
  14. local last_update_time = ip_blacklist:get("last_update_time");
  15. -- update ip_blacklist from Redis every cache_ttl seconds:
  16. if last_update_time == nil or last_update_time < ( ngx.now() - cache_ttl ) then
  17. local redis = require "resty.redis";
  18. local red = redis:new();
  19. red:set_timeout(redis_connect_timeout);
  20. local ok, err = red:connect(redis_host, redis_port);
  21. if not ok then
  22. ngx.log(ngx.ERR, "Redis connection error while connect: " .. err);
  23. else
  24. local ok, err = red:auth(redis_pwd)
  25. if not ok then
  26. ngx.log(ngx.ERR, "Redis password error while auth: " .. err);
  27. else
  28. local new_ip_blacklist, err = red:smembers(redis_key);
  29. if err then
  30. ngx.log(ngx.ERR, "Redis read error while retrieving ip_blacklist: " .. err);
  31. else
  32. ngx.log(ngx.ERR, "Get data success:" .. new_ip_blacklist)
  33. -- replace the locally stored ip_blacklist with the updated values:
  34. ip_blacklist:flush_all();
  35. for index, banned_ip in ipairs(new_ip_blacklist) do
  36. ip_blacklist:set(banned_ip, true);
  37. end
  38. -- update time
  39. ip_blacklist:set("last_update_time", ngx.now());
  40. end
  41. end
  42. end
  43. end
  44. if ip_blacklist:get(ip) then
  45. ngx.log(ngx.ERR, "Banned IP detected and refused access: " .. ip);
  46. return ngx.exit(ngx.HTTP_FORBIDDEN);
  47. end

Nginx灰度发布

1.根据Cookie实现灰度发布

根据Cookie查询version值,如果该version值为v1转发到host1,为v2转发到host2,都不匹配的情况下转发到默认配置。

  1. upstream host1 {
  2. server 192.168.2.46:2001 weight=1; #轮询服务器和访问权重
  3. server 192.168.2.46:2002 weight=2;
  4. }
  5. upstream host2 {
  6. server 192.168.1.155:1111 max_fails=1 fail_timeout=60;
  7. }
  8. upstream default {
  9. server 192.168.1.153:1111 max_fails=1 fail_timeout=60;
  10. }
  11. map $COOKIE_version $group {
  12. ~*v1$ host1;
  13. ~*v2$ host2;
  14. default default;
  15. }
  16. lua_shared_dict ip_blacklist 1m;
  17. server {
  18. listen 80;
  19. #set $group "default";
  20. #if ($http_cookie ~* "version=v1"){
  21. # set $group host1;
  22. #}
  23. #if ($http_cookie ~* "version=v2"){
  24. # set $group host2;
  25. #}
  26. location / {
  27. access_by_lua_file lua/ip_blacklist.lua;
  28. proxy_pass http://$group;
  29. }
  30. }

2.根据来路IP实现灰度发布

  1. server {
  2. ……………
  3. set $group default;
  4. if ($remote_addr ~ "192.168.119.1") {
  5. set $group host1;
  6. }
  7. if ($remote_addr ~ "192.168.119.2") {
  8. set $group host2;
  9. }

3.更细粒度灰度发布

参考:https://github.com/sunshinelyz/ABTestingGateway

好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!

写在最后

如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!

【Nginx】实现负载均衡、限流、缓存、黑白名单和灰度发布,这是最全的一篇了!的更多相关文章

  1. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  2. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  3. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  4. [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  5. Nginx实现负载均衡&Nginx缓存功能

    一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...

  6. (转)Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    原文:http://blog.51cto.com/freeloda/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Ng ...

  7. nginx实现负载均衡、缓存功能实战

    nginx实现负载均衡.缓存功能实战 什么是正向代理?应用场景:翻墙 什么是反向代理?例如:haproxy和nginx   Nginx实现反向代理 nginx代理基于是ngx_http_proxy_m ...

  8. Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡

    文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...

  9. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

随机推荐

  1. [转] 图解单片机下载程序电路原理之USB转串口线、CH340、PL2303、MAX232芯片的使用

    点击阅读原文 目前为止,我接触单片机已有不少时日,从选择元器件.原理图.PCB.电路硬件调试.软件开发也算小有心得 .单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈 ...

  2. python + selenium登陆并点击百度平台

    from PIL import Imagefrom selenium.webdriver import DesiredCapabilitiesfrom selenium import webdrive ...

  3. Clear Writer v1.7 更新

    拖更了这么久了的我终于来更新了--这可能是今年上半年最后一次更新了-- 这次我打算把 Clear Writer 公开发布了. 下载链接 下载链接在这里. (这次用蓝奏,不用奶牛快传了) Clear W ...

  4. CODING DevOps 系列第一课:基于开源工具链打造持续交付平台

    当下软件发展趋势 当今 IT 行业发展中比较流行的几个技术,首先是微服务化,将原有的一个系统拆分成多个,意味着有多个系统需要构建.测试.部署和运维. 第二个是敏捷开发模式,需求粒度更细化,要求一个可独 ...

  5. Eplan如何调用经常使用的自绘部件?

    Eplan如何调用经常使用的自绘部件?采用宏的简单应用,即可. 参考文档:https://blog.csdn.net/txwtech/article/details/90510106

  6. CODING DevOps 系列第三课:云计算、云原生模式下 DevOps 的建设

    本文首先会和大家分享当前整个应用生命周期的演变历程,然后讲解云计算模式下 DevOps 建设包含的过程.流程规范和标准,最后讲解云原生时代到来会带来哪些改变,以及标准化的建设会有哪些改变和突破. 应用 ...

  7. JavaWeb网上图书商城完整项目--12.项目所需jquery函数介绍之ajax

    jquery中使用ajax发送异步请求 下面的一个案例在input输入框失去焦点的时候发送一个异步的请求: 我们来看程序的案例: 这里要强调的是返回值最好选择是json,json对应的就是对象,Jav ...

  8. 用一杯茶时间搭建Gitea服务器

     一.简单介绍 Gitea搭建局域网内的基于git的代码托管服务器,可以实现的功能包括:组织管理.团队管理.组织仓库设定.团队仓库分配.组织及团队权限分配管理.仓库添加PC协作者.仓库添加组织团队.分 ...

  9. 深入理解JVM(③)虚拟机的类加载过程

    前言 上一篇我们介绍到一个类的生命周期大概分7个阶段:加载.验证.准备.解析.初始化.使用.卸载.并且也介绍了类的加载时机,下面我们将介绍一下虚拟机中类的加载的全过程.主要是类生命周期的,加载.验证. ...

  10. ajax前后端交互原理(3)

    3.HTTP服务器 3.3.相关前置知识 1 什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的UR ...