nginx学自b站的遇见狂神说尚硅谷,感谢老师!


作用

HTTP代理,反向代:作为web服务器最常用的功能之一,尤其是反向代理。

正向代理:

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。例如vpn。

反向代理:

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

负载均衡:内置策略和扩展策略

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、指定权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3、IP绑定 ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种, 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案; 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

限流熔断

1、令牌桶算法

算法思想

  1. 令牌以固定速率产生,并缓存到令牌桶中
  2. 令牌桶放满时,多余的令牌被丢弃
  3. 请求要消耗等比例的令牌才能被处理
  4. 令牌不够时,请求被缓存
2、漏桶算法

算法思想

  1. 水(请求)从上方倒入水桶,从水桶下方流出(被处理)

  2. 来不及流出的水存在水桶中(缓冲)

  3. 水桶满后水溢出(丢弃)

  4. 这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃

    相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的

从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输

nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值

安装

菜鸟教程

常用命令

1
2
3
4
5
6
cd /usr/local/nginx/sbin/
./nginx #启动
./nginx -s stop #停止
./nginx -s quit #安全退出
./nginx -s reload #重新加载配置文件
ps aux|grep nginx #查看nginx进程

注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口
相关命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;

示例

反向代理与负载均衡详解

负载均衡和动静分离配置

重定向

高可用主从模式

准备工作
  1. 需要两台服务器 192.168.253.128 192.168.253.129

  2. 在两台服务器上安装 nginxkeepalived

    yum install keepalived -y

    安装之后,在 /etc/keepalived 中有 keepalived.conf 配置文件

  3. 文件配置

    master配置

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    global_defs { #全局配置
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.253.128
    smtp_connect_timeout 30
    router_id LVS_DEVEL #访问到服务器
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    }

    vrrp_script chk_http_port { #检测脚本配置
    script "/usr/local/src/nginx_check.sh"
    interval 2 #(检测脚本执行的间隔)
    weight 2 #权重
    }

    vrrp_instance VI_1 { #虚拟ip配置
    state MASTER #角色 master主机 backup从机
    interface ens33 #网卡
    virtual_router_id 51 #主、从机的virtual_router_id必须相同
    priority 100 #主、从机的优先级,主机较大,从机较小
    advert_int 1 #心跳
    authentication { #认证
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress { #虚拟地址
    192.168.253.110
    }
    }

    backup配置

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    global_defs { #全局配置
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.253.129
    smtp_connect_timeout 30
    router_id LVS_DEVEL #访问到服务器
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    }

    vrrp_script chk_http_port { #检测脚本配置
    script "/usr/local/src/nginx_check.sh"
    interval 2 #(检测脚本执行的间隔)
    weight 2 #权重
    }

    vrrp_instance VI_1 { #虚拟ip配置
    state BACKUP #角色 master主机 backup从机
    interface ens33 #网卡
    virtual_router_id 51 #主、从机的virtual_router_id必须相同
    priority 90 #主、从机的优先级,主机较大,从机较小
    #nopreempt //非抢占式配置。添加后不再有主从区分,全部为backup从机
    advert_int 1 #心跳
    authentication { #认证
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress { #虚拟地址
    192.168.253.110
    }
    }

    检测脚本配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
    /www/server/nginx/sbin/nginx #nginx执行文件
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived
    fi
    fi
  4. 启动 nginxkeepalived

    nginx

    /www/server/nginx/sbin/nginx

    keepalived

    systemctl start keepalived.service

    查看进程

    ps -ef | grep keepalived

测试
  1. 在浏览器地址栏输入虚拟ip地址 192.168.253.110

  2. 把主服务器(192.168.253.128) nginxkeepalived 停止

原理

  1. mater 和 worker

  2. worker 如何进行工作的

  3. 一个 master 和多个 woker 有好处

    • 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
    • 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断
  4. 设置多少个 woker 合适

    worker 数和服务器的 cpu 数相等是最为适宜的

  5. 连接数 worker_connection

    第一个:发送请求,占用了 woker 的几个连接数?

    • 2 或者 4 个

    第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的 最大并发数是多少?

    • 普通的静态访问最大并发数是: worker_connections * worker_processes /2
    • 而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4