nginx的平滑升降级及配置管理

目录

平滑升级:

 版本的回退(如果升级后有问题可以立即回退来恢复)

nginx 限流

​ nginx配置管理


 

1.nginx进程

nginx是以多进程的方式来工作的。
nginx在启动后,会有一个master进程和多个worker进程。 

master进程主要用来管理worker进程:
包含:
1、接收来自外界的信号,向各worker进程发送信号。
2、监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

而基本的网络事件,则是放在worker进程中来处理了。worker进程之间是对等的,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
worker进程的个数,一般会设置与机器cpu核数一致。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。

对于一个基本的web服务器来说,事件通常有三种类型:网络事件、信号、定时器。Nginx采用异步非阻塞的事件处理机制,由进程循环处理多个准备好的事件,从而实现高并发和轻量级。
        以epoll为例:当事件没有准备好时,就放入epoll里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理,只有当所有时间都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。

2.nginx进行热部署的原理

热部署,就是配置文件nginx.conf修改后,不需要stop Nginx,不需要中断请求,就能让配置文件生效,即在线升级,即不打断用户的请求下更新版本。 通过上文我们已经知道worker进程负责处理具体的请求,那么如果想达到热部署的效果,Nginx可以修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些以前的请求处理完毕后,kill掉即可。然后使用新的配置创建新的 worker,所以可以做到在线更新版本,新版本和旧版本的进程可以同时存在,不影响客户的访问
 

vim nginx.conf

ps axu

进入nginx官网:www.nginx.org  

  1. cd /lib/systemd/system

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

cd /usr/local/nginx/conf

vim nginx.conf
worker_processes //工作进程数
worker_connections  //单个工作进程并发连接数
use epoll 性能优化

 ulimit 设置永久生效
 ulimit -a 查看

 在文件中写入nginx 用户永久生效可打开的文件数65535个

平滑升级及回滚

(1) 下载新版本解压

(2)vim auto/cc/gcc 关闭debug日志 ,不取消版本号方便观察

(3)进行编译 安装make

(4)objs目录下的文件增加 ,备份旧版本的nginx二进制文件

./nginx -V  ##查看版本信息
\cp -f nginx /usr/local/nginx/sbin/ ##替换二进制文件(将新版本的二进制文件覆盖过去,加 -f 防止报错正忙)

查看nginx进程,一个master,两个worker

注意:虽然当前版本一进变成了1.21.5版本,表面上看起来更新为新版本,但还是旧版本在工作,接收客户端请求仍然是1.20.2的nginx,有了下面的平滑升级

平滑升级:

(1)kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)

可以看到现在有2个master,4个worker

(2)kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)

可以看到现在有2个master,2个worker;旧版本的worker被关闭

(3)查看版本号现在用的是新版本

 版本的回退(如果升级后有问题可以立即回退来恢复)

(1)先将二进制执行文件还原,不加-f会提示文件正忙 

现在依旧是2个master 2个worker

(2)kill -HUP 旧版本的进程号 (拉起旧版本的worker进程)

 2个master 4个worker

(3)kill -WINCH 新版本的主进程号 (关闭新版本的worker进程) 

 查看版本号,是旧版本的nginx

nginx 限流

先生成一个文件

进行压力测试,设置并发数为10,请求总数为10

 1.限制并发连接数

$binary_remote_addr表示通过remote_addr这个标识做限制, $binary_的目的是缩写内存占用量,限制同一客户端ip地址

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

limit_conn为限制并发连接数


  limit_conn_zone $binary_remote_addr zone=addr:10m;  # 开辟一个10m的连接空间,命名为addr

2.控制速率

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
	#  rate=1r/s每秒只能执行1次请求, 多的直接返回503错误。
      limit_req zone=one; 1s同一个客户端只允许连接一次

因为每秒只能通过一个,所以9个被拒绝

 我们查看/usr/local/nginx/logs/access.log日志,看到只有一个请求成功,其他的都是直接返回503,即服务器拒绝了请求。

200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。

cat /usr/local/nginx/logs/access.log

3.排队

burst=3:burst爆发,这个配置是设置一个大小为3的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有3个,超过的请求会直接报503的错误然后返回。 在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=1r/s,且这段时间内没有请求再到来,则每1s 缓冲队列就能恢复一个缓冲请求的能力,直到恢复到能缓冲3个请求位置。


 可以看到请求只成功了4次,且3.023s才完成压测。

查看/usr/local/nginx/logs/access.log日志 我们可观察到16分30秒时,即压测第1秒时,成功处理了1个请求,另外有6个请求瞬间返回了503,剩余的3个请求每隔1秒处理一次。这是因为设置了burst=3,在服务器接收到10个并发请求后,先处理1个请求,同时将3个请求放入burst缓冲队列中,等待处理。而超过burst等待区的数量的请求就被直接抛弃了,报错503然后直接返回。

 4.无延迟

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

加brust=3和nodelay的情况下, 有一个容量为3的缓冲区, rate=1r/s每秒能执行4次请求, 4=1+3,多的直接返回503错误。

 可以看到压测在0.194秒内就完成了

 查看/usr/local/nginx/logs/access.log日志,看到只有4个请求成功,其他的都是直接返回503。

可以发现在1s内,服务器端处理了4个请求(峰值速度:burst+原来的处理速度)。对于剩下的6个请求,直接返回503,在下一秒如果继续向服务端发送10个请求,服务端会直接拒绝这10个请求并返回503。因为设定了每1s处理1个请求,所以直到3s 之后,才可以再处理一个请求,即如果此时向服务端发送10个请求,会返回9个503,一个200

5.限制带宽

限速50k,下载一个200k的文件,访问10次,差不多需要40秒

 

nginx配置管理

1.自动索引

可以自动索引目录中的文件,方便下载

nginx expire缓存设置

编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间,加快访问速度

vim nginx.conf

查看到素材文件缓存到2023年

2.日志轮询

设置脚本,提供权限,产生日志

crontab -e 定时执行

3.goaccess 日志可视化

获取资源

解压并下载相关库

安装

goaccess /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html & #监控access.log日志

日志可视化界面

执行一次

有日志采集到

4.禁用不必要的日志信息,节省磁盘IO

在配置文件中设定禁用浏览器访问指定目录生成日志文件,在浏览器访问该目录时,不会生成日志信息

vim nginx.conf

5.站点目录和文件限制

在配置文件中设定指定目录只能被主机访问,拒绝其他请求

vim nginx.conf
nginx -s reload

6.中文乱码

echo 你好 > /usr/local/nginx/html/index.html

vim /usr/local/nginx/conf/nginx.conf

 

make cert.pem  ##快速生成签名证书

vim /usr/local/nginx/conf/nginx.conf

 


7.重定向

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)

地址A跳转到地址B

为什么要进行重定向?什么时候需要重定向?

    网站调整(如改变网页目录结构)
    网页被移到一个新地址
    网页扩展名改变(如应用需要把.php改成.html)

这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等

301 redirect: 301代表永久性转移(PermanentlyMoved)
302 redirect: 302代表暂时性转移(TemporarilyMoved )

301和302状态码都表示重定向,就是说浏览器在到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)

301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了) ,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址

1)防止域名恶意解析到服务器IP

2)将所有访问重定向到指定域名

rewrite ^(.*) http://www.westos.org permanent; ##^(.*)$为匹配所有,即匹配www.westos.org;

3) 80端口重定向443

由于443是https使用,所以要制作一个加密证书,并移动到配置目录中,编辑配置文件,上面已完成;将80端口定向到443端口,检测语法,重启服务,查看端口

 

rewrite ^/(.*)$ https://www.westos.org/$1 permanent;  #$1表示用户在这里输入的内容保留,只会重定向$1前面的内容,永久重定向(可以缓存,临时的不允许缓存)

 

4).虚拟主机重定向

www.westos.org重定向到bbs.westos.org

rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent; #表示访问www.westos.org并且以bbs    结尾的,都定向到http://bbs.westos.org

在真机中添加解析:

vim /etc/hosts

 bbs.westos.org 重定向www.westos.org/bbs:

 

 

5) 防盗链

防盗链: WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测,如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能

设置盗链主机server2可以访问server1上的图片

  加入防盗链,server 2被定向到其他资源

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值