Nginx复习

113 阅读9分钟

什么是正向代理?什么是反向代理?

  • 正向代理服务器

    • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器

    • 核心:用户知道自己访问的目标服务器

    • 场景:跳板机、访问原来无法访问的网站, 比如国外的一些站点

      image-20200803160535943

 

  • 反向代理服务器(Nginx)

    • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器
    • 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求
    • 场景:访问淘宝,知道访问的域名是taobao.com, 但是后面提供数据的具体是什么域名或ip我们是不知道的

image-20200803160650820

Nginx访问日志的用处

Nginx统计站点访问量、高频url统计

  • 查看访问最频繁的前100个IP
awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
  • 统计访问最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
  • 基础

    awk 是文本处理工具,默认按照空格切分,$N 是第切割后第N个,从1开始
    
    sort命令用于将文本文件内容加以排序,-n 按照数值排,-r 按照倒序来排
      案例的sort -n 是按照第一列的数值大小进行排序,从小到大,倒序就是 sort -rn
    
    uniq 去除重复出现的行列, -c 在每列旁边显示该行重复出现的次数。
    
    head -n 100 前100条
    
    空格是分割符 $取第几个
    

自定义日志格式,统计接口响应耗时

  • 日志格式增加  $request_time

    从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间
    ​
    $upstream_response_time:指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间
    ​
    $request_time一般会比upstream_response_time大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多
    

     

  • 配置自定义日志格式

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" $request_time';
    ​
    ​
    server {
            listen       80;
            server_name  aabbcc.com;
    ​
            location / {
                root   /usr/local/nginx/html;
                index  xdclass.html;
            }
            #charset koi8-r;
            #
            access_log  logs/host.access.log  main;
    }
    
  • 统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条

cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
​
备注:$NF 表示最后一列, awk '{print $NF}'

压缩是时间换空间,还是空间换时间?

  • web层主要涉及浏览器和服务器的网络交互,而网络交互显然是耗费时间的

  • 要尽量减少交互次数

  • 降低每次请求或响应数据量。

  • 开启压缩

    • 在服务端是时间换空间的策略,服务端需要牺牲时间进行压缩以减小响应数据大小
    • 压缩后的内容可以获得更快的网络传输速度,时间是得到了优化
    • 所以是双向的

Nginx的第三方利器OpenResty+Lua介绍

简介: 介绍Nginx的扩展 整合框架OpenResty

  • 什么是OpenResty, 为什么要用OpenResty?

    由章亦春发起,是基于Ngnix和Lua的高性能web平台,内部集成精良的LUa库、第三方模块、依赖, 开发者可以方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。 
    ​
    OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起
    ​
    Nginx是C语言开发,如果要二次扩展是很麻烦的,而基于OpenResty,开发人员可以使用 Lua 编程语言对 Nginx 核心模块进行二次开发拓展
    ​
    性能强大,OpenResty可以快速构造出1万以上并发连接响应的超高性能Web应用系统
    

拓展

让Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL, Memcaches 以及 Redis 等都进行一致的高性能响应。所以对于一些高性能的服务来说,可以直接使用 OpenResty 访问 Mysql或Redis等,而不需要通过第三方语言(PHP、Python、Ruby)等来访问数据库再返回,这大大提高了应用的性能
  • 什么是ngx_lua

    ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,部署到Nginx中运行,
    ​
    即Nginx变成了一个Web容器;开发人员就可以使用Lua语言开发高性能Web应用了。
    

     

  • OpenResty提供了常用的ngx_lua开发模块

    • lua-resty-memcached
    • lua-resty-mysql
    • lua-resty-redis
    • lua-resty-dns
    • lua-resty-limit-traffic
    通过上述的模块,可以用来操作 mysql数据库、redis、memcached等,也可以自定义模块满足其他业务需求,
    很多经典的应用,比如开发缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控、限流、防火墙、黑白名单等
    

OpenResty + Lua相关环境准备

简介:OpenResty和Lua相关环境准备

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
​
# update the yum index:
sudo yum check-update
​
sudo yum install openresty
​
#安装命令行工具
sudo yum install openresty-resty
​
# 列出所有 openresty 仓库里的软件包
sudo yum --disablerepo="*" --enablerepo="openresty" list available
​
#查看版本
resty -V

注意:如果需要指定配置文件 nginx -c 配置文件路径
比如  ./nginx -c /usr/local/nginx/conf/nginx.conf

Nginx+OpenResty +Lua开发内网访问限制

简介: 讲解Nginx+OpenRestry开发网络访问限制

  • 生产环境-管理后台一般需要指定的网络才可以访问,网段/ip等
  • Nginx+OpenRestry+Lua开发
http{

# 这里设置为 off,是为了避免每次修改之后都要重新 reload 的麻烦。
# 在生产环境上需要 lua_code_cache 设置成 on。

lua_code_cache off;

# lua_package_path可以配置openresty的文件寻址路径,$PREFIX 为openresty安装路径
# 文件名使用“?”作为通配符,多个路径使用“;”分隔,默认的查找路径用“;;”
# 设置纯 Lua 扩展库的搜寻路径
lua_package_path "$prefix/lualib/?.lua;;";

# 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;')
lua_package_cpath "$prefix/lualib/?.so;;";

server {
     location / {
     access_by_lua_file lua/white_ip_list.lua;
     proxy_pass http://lbs;
     }
}
  • lua/white_ip_list.lua
local black_ips = {["127.0.0.1"]=true}

local ip = ngx.var.remote_addr
if true == black_ips[ip] then
    ngx.exit(ngx.HTTP_FORBIDDEN)
    return;
end
  • 拓展

    • 如何做一个动态黑名单控制?
    • 里面 /usr/local/openresty/lualib/resty 很多第三方模块

image-20200822210816997

Nginx+OpenRestry开发下载限速

  • 限速限流应用场景

    • 下载限速:保护带宽及服务器的IO资源

    • 请求限流:防止恶意攻击,保护服务器及资源安全

      • 限制某个用户在一个给定时间段内能够产生的HTTP请求数
      • 限流用在保护上游应用服务器不被在同一时刻的大量用户访问
  • openResty下载限速案例实操

    • Nginx 有一个 $limit_rate,这个反映的是当前请求每秒能响应的字节数, 该字节数默认为配置文件中 limit_rate 指令的设值
    #当前请求的响应上限是 每秒 300K 字节
     location /download {
        access_by_lua_block {
           ngx.var.limit_rate = "300K"
        }
    ​
        alias /usr/local/software/app;
    ​
     }
    ​
    

    网盘静态资源下载限速实现原理

简介: 讲解常见的资源下载限速实现原理

  • 下载限速实现原理

    • 目的:限制下载速度
    • 常用的是漏桶原理和令牌桶原理

 

  • 什么是漏桶算法

    • 备注:如果是请求限流,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快也就是请求过多,桶就会直接溢出,也就是请求被丢弃拒绝了,所以漏桶算法能强行限制数据的传输速率或请求数

image-20200823174825345

 

  • 什么是令牌桶算法

    • 备注:只要突发并发量不高于桶里面存储的令牌数据,就可以充分利用好机器网络资源。

      如果桶内令牌数量小于被消耗的量,则产生的令牌的速度就是均匀处理请求的速度

     

image-20200823174904826

Ngnix高可用解决方案LVS+KeepAlived

  • Nginx集群架构(vip )

image-20200810110142700

 

  • Nginx高可用解决方案-基础

    国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。
    ​
    从低到高分别是:
    ​
    物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
    ​
    四层工作在OSI第四层 也就是传输层
    ​
    七层工作在最高层,也就是应用层
    
    • F5、LVS(四层负载 tcp

      • 用虚拟ip+port接收请求,再转发到对应的真实机器
    • HAproxy、Nginx(七层负载)

      • 用虚拟的url或主机名接收请求,再转向相应的处理服务器

讲解业界主流高可用方案Linux虚拟服务器 LVS讲解

LVS是Linux Virtual Server,Linux虚拟服务器,是一个虚拟的服务器集群系统
​
项目是由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
​
Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分
​
软件负载解决的两个核心问题是:选谁、转发

image-20200824224413529

  • 提供了10多种调度算法: 轮询、加权轮询、最小连接、目标地址散列、源地址散列等

 

  • 三种负载均衡转发技术

    • NAT:数据进出都通过 LVS, 前端的Master既要处理客户端发起的请求,又要处理后台RealServer的响应信息,将RealServer响应的信息再转发给客户端, 容易成为整个集群系统性能的瓶颈; (支持任意系统且可以实现端口映射)
    • DR: 移花接木,最高效的负载均衡规则,前端的Master只处理客户端的请求,将请求转发给RealServer,由后台的RealServer直接响应客户端,不再经过Master, 性能要优于LVS-NAT; 需要LVS和RS集群绑定同一个VIP(支持多数系统,不可以实现端口映射)
    • TUNL:隧道技术,前端的Master只处理客户端的请求,将请求转发给RealServer,然后由后台的RealServer直接响应客户端,不再经过Master;(支持少数系统,不可以实现端口映射))

讲解业界主流高可用方案keepalived讲解

  • 什么是keepalived

    • 核心:监控并管理 LVS 集群系统中各个服务节点的状态
keepalived是一个类似于交换机制的软件,核心作用是检测服务器的状态,如果有一台web服务器工作出现故障,Keepalived将检测到并将有故障的服务器从系统中剔除,使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成。
​
后来加入了vrrp(虚拟路由器冗余协议),除了为lvs提供高可用还可以为其他服务器比如Mysql、Haproxy等软件提供高可用方案
  • 安装
yum install -y keepalived
​
#路径
cd /etc/keepalived

 

  • 启动和查看命令
#启动
service keepalived start
​
#停止
service keepalived stop
​
#查看状态
service keepalived status
​
#重启
service keepalived restart
​
#停止防火墙
systemctl stop firewalld.service
  • 注意: 如果有缺少依赖可以执行下面的命令
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget

Keepalived核心配置讲解

简介:Keepalived核心配置讲解

  • 配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {
​
   router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
   enable_script_security #允许执行外部脚本
}
​
​
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
    script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
    interval 2
#当检查失败后,将vrrp_instance的priority减小5
    weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
    fall 3
#连续监测2次成功,就认为成功。但不调整优先级
    rise 2
​
    user root
}
​
​
​
#配置对外提供服务的VIP vrrp_instance配置
​
vrrp_instance VI_1 {
​
#指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
    state MASTER
​
#指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
    interface ens33
​
#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
    virtual_router_id 51#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
    priority 100#心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
    advert_int 1
​
    authentication {
        auth_type PASS
        auth_pass 1111
    }
​
#定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
    virtual_ipaddress {
        192.168.159.100
    }
​
    #本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
  track_script {
      chk_real_server
    }
}
​
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.159.100 80 {
    # 设置健康检查时间,单位是秒
    delay_loop 6
​
    # 设置负载调度的算法为rr
    lb_algo rr
​
    # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    lb_kind NAT
​
    # 会话保持时间
    persistence_timeout 50
​
   #指定转发协议类型(TCP、UDP)
    protocol TCP
​
    # 指定real server1的IP地址
​
    real_server 192.168.159.146 80 {
        # 配置节点权值,数字越大权重越高
        weight 1
​
        # 健康检查方式
        TCP_CHECK {                  # 健康检查方式
            connect_timeout 10       # 连接超时
            retry 3           # 重试次数
            delay_before_retry 3     # 重试间隔
            connect_port 80          # 检查时连接的端口
        }
​
    }
​
}

 

image-20200824224413529

  • 配置注意

    router_id后面跟的自定义的ID在同一个网络下是一致的
    ​
    state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题
    ​
    interface 网卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a  查询
    ​
    在BACKUP节点上,其keepalived.conf与Master上基本一致,修改state为BACKUP,priority值改小即可
    ​
    authentication主备之间的认证方式,一般使用PASS即可;主备的配置必须一致,不能超过8

Nginx高性能原理和课程总结

Nginx基础架构master-worker进程剖析

简介:Nginx基础架构模型剖析

  • master 进程负责管理 Nginx 本身和其他 worker 进程

img

 

  • 高性能原理

    • nginx 通过 多进程 + io多路复用(epoll) 实现了高并发
    • 采用多个worker 进程实现对 多cpu 的利用 通过eopll 对 多个文件描述符 事件回调机制

img

  • 拓展:linux I/O多路复用有select,poll,epoll
I/O模式一般分为同步IO和异步IO。
​
同步IO会阻塞进程,异步IO不会阻塞进程。
​
目前linux上大部分用的是同步IO,异步IO在linux上还不太成熟(有部分)
​
同步IO又分为阻塞IO,非阻塞IO,IO多路复用, 很多人对这个就有疑问了????
​
同步IO会阻塞进程,为什么也包括非阻塞IO? 因为非阻塞IO虽然在请求数据时不阻塞,但真正数据来临时,也就是内核数据拷贝到用户数据时,此时进程是阻塞的。
​
​
推荐书籍《Unix网络编程》

来源 小滴课堂千万级连接-高性能服务器 Nginx专题课程介绍