Nginx功能部署(1)

介绍

  • Nginx是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

  • 在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

Nginx的源码安装

Nginx的安装和配置

Nginx的配置参数

  1. 指定开启用户
  • vim /usr/local/nginx/conf/nginx.conf
- user  nginx nginx; ##指定开启用户

在这里插入图片描述

systemctl restart nginx.service重启nginx服务
ps -aux | grep nginx查看nginx运行用户

在这里插入图片描述

  1. 指定worker进程数
  • vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

systemctl restart nginx.service重启nginx服务
ps -aux | grep nginx查看nginx运行进程

在这里插入图片描述

  1. 指定最大连接数
  • vim /usr/local/nginx/conf/nginx.conf
events {
    worker_connections  65535;
} 

在这里插入图片描述

Nginx版本的热部署

  • nginx 支持热加载 热部署 ,在不打断用户请求的情况下更新版本
  • Nginx 采用了高度模块化的设计思路,并且内部的进程主要有两类,master 进程 和 worker 进程。其中 master 进程只有一个,worker 进程可以有多个。
  • worker 进程才是真正 working 的进程,才是真正处理请求的进程。worker 进程全部都是 master 进程的子进程。worker 进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限。
  • nginx 的热部署和其并发模型有着密不可分的关系。说白了,就是因为 master 进程的关系。当通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中。而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死,然后使用新的配置创建新的 worker。
Nginx版本的平滑升级
  • 实验环境:将nginx-1.18.0更新为nginx-1.19.10
  • 常见的几个命令
- /usr/local/nginx/sbin/nginx -v##查看nginx版本
- /usr/local/nginx/sbin/nginx -t ##检查nginx配置文件语法是否有错误
- /usr/local/nginx/sbin/nginx -s reload##重新载入配置文件
- /usr/local/nginx/sbin/nginx -s reopen##重启 Nginx
- /usr/local/nginx/sbin/nginx -s stop ##停止 Nginx
  • 如果不知道自己的安装目录,先获取原nginx的安装目录
  • whereis nginx
  1. 备份旧版本(以访更新失败)
  • cd /usr/local/nginx/sbin/
  • cp nginx nginx.old将原版本复制一份并且重命名为nginx.old
    在这里插入图片描述
  1. 对新版本重新编译
  • 可以自己从官网下载新的版本包http://nginx.org/en/download.html
  • wget http://nginx.org/download/nginx-1.19.1.tar.gz从官网下载
##解压
- tar -zxvf nginx-1.19.1.tar.gz
##对新版本重新预编译
- ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
- make ##注意这里只编译不安装,不能执行make install 否则会覆盖掉旧版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 把新编好的二进制程序放安装目录覆盖原来的文件
    cd objs/切换目录
    cp -f nginx /usr/local/nginx/sbin/nginx如果程序正常运行强制复制

在这里插入图片描述
在这里插入图片描述

  1. 将原先在旧的配置下启动的worker杀死,然后使用新的配置创建新的worker
  • ps -ax |grep nginx查看nginx进程
  • kill -USR2 19439旧版本停止接收请求,并开启新的master产生新的worker
  • kill -WINCH 19439等待旧版本处理完关闭worker进程
    在这里插入图片描述
  • 若是想直接杀掉旧版本进程 kill -9 19439
  • 注意:pid 也可以通过cat /usr/local/nginx/logs/nginx.pid查看
Nginx版本的回退
  1. 旧版本备份的二进制程序覆盖新版本
cd /usr/local/nginx/sbin
cp -f nginx.old nginx

在这里插入图片描述

  1. 关闭新版本的进程,开启旧版本进程
    kill -HUP 20986启动旧版本的worker进程
    kill -USR2 21225新版本不再接收请求
    kill -WINCH 21225关闭新版本的worker进程
    kill -9 21225关闭新版本的masterr进程
    在这里插入图片描述

Nginx的日志切割

在这里插入图片描述

  • nginx运行时会产生大量的日志,为了方便查询日志,所以有是时候需要将日志文件进行分割
  • 日志切割
mv access.log `date +%F -d -1day`_access.log###备份前一天日志
/usr/local/nginx/sbin/nginx -s reload ##重新打开一个access.log记录新日志

在这里插入图片描述
在这里插入图片描述

Nginx 限制并发、限制访问速率、限制流量

  • 测试素材
- cd /usr/local/nginx/html
- mkdir download/
  • 在download中放一张图片用于测试
  1. limit_conn_zone 模块 - 限制同一 IP 地址并发连接数;

  2. limit_request 模块 - 限制同一 IP 某段时间的访问量;

  3. core 模块提供 - limit_rate 限制同一 IP 流量。

  • 在 Nginx 中 以 LIMIT 开头的 配置项,都是做 限制 功能,以上三个功能都是 Nginx 编译后就有的功能,属于内置模块。
limit_conn_zone 模块
  • 通过 limit_zone 模块来达到限制用户的连接数的目的,即限制同一用户 IP 地址的并发连接数。
  • 案例
    limit_conn_zone $binary_remote_addr zone=one:10m;
    server {
        listen  80;
        server_name localhost;
        location /download {
        limit_conn one 1;
        root html;
        index index.html;
}
}
  • 指令名称:limit_conn_zone(nginx 1.18以后用 limit_conn_zone 取代了 limit_conn)
- 语法:limit_conn_zone key zone=name:size;
- 默认:no
- 区域:http
- 功能:该指令定义一个 zone,该 zone 存储会话的状态。
- 例如:上面的例子中,$binary_remote_addr  是 获取客户端ip地址的变量,长度为 4 字节,会话信息的长度为 32 字节。
  • $binary_remote_addr$remote_addr(客户端IP)的二进制格式,固定占用4个字节
  • 指令名称:limit_conn
- 语法:limit_conn zone number;
- 默认:no
- 区域:http、server、location

- 功能:该指令用于为一个会话设定最大并发连接数。如果并发请求超过这个限制,那么将返回预定错误(limit_conn_status )
  • 指令名称:limit_conn_status
语法:limit_conn_status code;
默认:limit_conn_status 503;
区域:http、server、location
功能:设置要返回的状态码以响应被拒绝的请求。
  • 指令名称:limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error
默认值:error
区域:http、server、location
功能:该指令用于设置日志的错误级别,当达到连接限制时,将会产生错误日志。
  • 上面的配置示例中,没有显式配置 limit_conn_status 、limit_conn_log_level,如果没有配置,则启用它们的默认值。

在这里插入图片描述

测试:通过 ab 命令模拟并发访问:

ab -n 10 -c 1 http://192.168.43.10/download/linux.png
-n:总请求数:10

-c:单个时刻并发 10

在这里插入图片描述
在这里插入图片描述

  • 对文件下载进行测试,或者是访问较大的文件,生成一个 100M 的文件
dd if=/dev/zero of=testfile bs=1M count=100

在这里插入图片描述

limit_request 模块
  • 使用 ngx_http_limit_req_module 模块可以 限制某一 IP 在一段时间内对服务器发起请求的连接数,该模块为内置模块。

在这里插入图片描述

  • 指令名称:limit_req_zone
语法:limit_req_zone key zone=name:size rate= number r/s
默认值:no
区域:http
使用示例:limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s

解释:

$binary_remote_addr :表示通过remote_addr 这个标识来做限制.

zone=addr:10m:表示生成一个 10M ,名字为 addr 的内存区域,用来存储访问的频次信息

rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求,还可以有比如 30r/m , 即限制每2秒 访问一次,即每 2秒 才处理一个请求。

  • 指令名称:limit_req
语法:limit_req zone=name [burst=number] [nodelay | delay=number];
默认:no
区域:http、server、location
使用示例:limit_req zone=zone burst=5 nodelay;

zone=zone:设置使用哪个配置名来做限制,与上面 limit_req_zone 里的 name 对应

burst=5 :这个配置的意思是设置一个大小为5的缓冲区,当有大量请求过来时,超过访问频次限制 rate=1r/s的请求可以先放到这个缓冲区内等待,但是这个缓冲区只有5个位置,超过这个缓冲区的请求直接报503并返回。

nodelay:如果设置,会在瞬间提供处理(rate+burst)个请求的能力,请求超时(rat+burst)的时候直接返回503,永远不存在请求需要等待的情况。如果没有设置,则所有请求会依次等待排队;

  • 指令名称:limit_req_status
语法:limit_req_status code;
默认:limit_req_status 503;
区域:http、server、location
功能:设置要返回的状态码以响应被拒绝的请求。
  • 指令名称:limit_req_log_level

(该指令出现在版本0.8.18中)

语法:limit_req_log_level info | notice | warn | error;

默认:limit_req_log_level error;

区域:http、server、location

功能:该指令用于设置日志的错误级别,当达到连接限制时,将会产生错误日志。
  • 示例内容没有写 limit_req_status 、limit_req_log_level 两个配置项,所以采用默认值。

  • rate 为规定时间内连接请求的数量,单位(request/second)

  • burst 为爆咋的意思,这里可以理解为连接等待队列长度。

  • 分三次测试

  1. 不加burst和nodelay
  • 配置文件
    在这里插入图片描述

在这里插入图片描述

  • 通过 ab 测试后的结果,10 个并发连接,只有 1 个成功,剩余 9 个都返回 非200 状态,查看 Nginx 日志
  • cat /usr/local/nginx/logs/access.log

在这里插入图片描述

  • 1秒钟的10次并发请求,只有 1 个返回 200 ,剩余全是 503 请求被拒绝。
  • 不加 burst 和 不加 nodelay 的情况下,rate=1r/s 1 秒钟只能处理 1 个请求,剩余的所有请求都会直接返回 503.
  1. 加burst不加nodelay
  • 配置文件
    在这里插入图片描述

在这里插入图片描述

  • 处理了10个连接请求,其中失败了 4 个,成功了 6个。

  • 使用 burst = 5 建立了一个可以存放 5 个并发连接的缓冲区。

  • 一共需要 6 秒才能处理完所有的请求,查看 Nginx 日志,验证推算正确
    在这里插入图片描述

  • 第一秒处理了 1 个请求,拒绝了 4 个连接,剩下的请求分别是每秒 1个连接请求的处理。
    规则:rate=1r/s 、burst=5

  • 一次10 个连接并发请求,处理 1 个,缓存 5 个后续 1 秒一个的处理,其他的全部丢弃。

  1. 加burst 和nodelay
  • 配置文件
    在这里插入图片描述
    在这里插入图片描述

  • 这次的测试结果,同一秒钟,处理了 rate+burst 个请求,其他的全部返回连接请求拒绝
    在这里插入图片描述

  • 总结

  • 3种测试,返回了不同的结果,

  • (1)不加 burst 和 不加 nodelay 的情况:按照 rate 设定的规则,严格执行。例如:rate=1r/s ,则1秒只处理1个请求,其他的全部返回连接503

  • (2)加 burst 和 不加 nodelay 的情况:首先按照 rate 规则处理,并且缓存 burst 个连接,剩余的全部返回503,后续缓存的 burst 按照 rate 规则进行处理

  • (3)加 burst 和 nodelay 的情况:第一次处理 rate+burst 个连接请求,剩余的请求全部返回 503

limit_rate 限制流量

在这里插入图片描述
指令名称:limit_rate

语法:limit_rate speed;
默认值:no
使用环境:http、server、location
示例: limit_rate 512k;
功能:该指令用于指定向客户端传输数据的速度,速度的单位是每秒传输的字节数。注意:该限制只是针对一个连接的设定,也就是说,如果同时有2个连接,那么它的速度将会是该指令设置的两倍。

指令名称:limit_rate_after

语法:limit_rate_after size;
默认值:limit_rate_after 1m;
使用环境:http、server、location
示例:limit_rate_after 3m;
功能:以最大的速度下载 size大小后,在进行 limit_rate speed 限速,例如:limit_rate_after 3m 解释为:以最大的速度下载3m后,再进行限速。
  • 上面的两个模块都有声明 $binary_remote_addr 远端ip地址进行操作的,而 limit_rate 什么都没规定。

  • 测试

  • 配置文件:
    在这里插入图片描述

  • 生成一个较大的下载文件:

  • dd if=/dev/zero of=testfile bs=1M count=100

  • 进行下载测试
    在这里插入图片描述
    在这里插入图片描述

  • 观察到下载全程,速度没有超过512k

  • 如果再同时开一个终端进行下载,速度也没有什么变化,两个终端内的速度均为500k左右。所以同一个ip无论发起多少个请求,每个请求都会是 512k 下载。

  • 因此,如果要进行限速,可以和 limit_conn_zone 模块配合进行使用。配置如下:
    在这里插入图片描述

  • 限制同一时刻,只有一个连接请求。

  • 再进行同主机多线程下载:

  • 当再次发起第二个连接的时候,服务器就直接拒绝503,这样就达到了限速的目的。
    在这里插入图片描述

  • 注意:当需要进行限速操作时,需要 limit_rate 和 limit_conn 模块联合起来使用才能达到限速的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值