首页 > 编程知识 正文

nginx——版本的热省级和版本回退

时间:2023-05-03 19:25:34 阅读:271915 作者:2609

nginx简介及工作原理

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
1、 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率, 这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应
2、 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
3、 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少,Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。占有内存少,并发能力强,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等.
一、nginx架构:
nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。
master与worker
nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,
包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。
一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。
master与处理请求
那么我们该怎么操作ngnix呢?其实我们只需要通过与master进行通信(命令)就可以操作ngnix,master进程会接收来自外界发来的信号,再根据信号做不同的事情。
比如kill -HUP pid,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以退出了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。
当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。
比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
worker与处理请求

前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。怎么做到的呢?
首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读。为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了
多进程IO模型好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

前提准备:

封装好的rhe7.3的虚拟机
在生产环境中,进行nginx升级时是不能影响到服务的正常运行的,如果升级失败则立即回退为原来的版本,现在就来模拟一下这个过程。

获得nginx两个版本的安装包


安装包在官网直接下载即可。nginx官网

1. 安装nginx-1.16.0

1.解压

[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz

2.关闭debug日志

[root@server1 nginx-1.16.0]# vim auto/cc/gcc


将debug日志功能注释,防止产生过多的日志占用空间。
3.安装所需要的软件

[root@server1 nginx-1.16.0]# yum install gcc pcre-devel zlib-devel openssl-devel -y[root@server1 nginx-1.16.0]# yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm

安装所需要的依赖软件。

4.安装

[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module [root@server1 nginx-1.16.0]# make && make install


安装完成

2.配置nginx-1.16.0

1.添加nginx用户

[root@server1 nginx-1.16.0]# useradd nginx

2.修改配置文件

[root@server1 nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf 2 user nginx nginx;##修改用户和组 3 worker_processes 2; 4 5 #error_log logs/error.log; 6 #error_log logs/error.log notice; 7 #error_log logs/error.log info; 8 9 #pid logs/nginx.pid; 10 11 12 events { 13 worker_connections 65535;##修改打开的最大进程数 14 } [root@server1 nginx-1.16.0]# vim /etc/security/limits.conf


使上面修改的打开最大进程数生效。

[root@server1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx -t


查看修改的文件是否有语法错误

[root@server1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx

启动nginx。

3.版本回退

现在我们就将nginx-1.16.0的版本回退。
1.获取nginx-1.15.8.tar.gz包并解压,编译

[root@server1 ~]# tar zxf nginx-1.15.8.tar.gz [root@server1 ~]# cd nginx-1.15.8/[root@server1 nginx-1.15.8]# lsauto CHANGES.ru configure html man srcCHANGES conf contrib LICENSE README [root@server1 nginx-1.15.8]# ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module [root@server1 nginx-1.15.8]# make


注意这里只进行编译,不进行安装。
2.备份原版本,查看进程,进行版本回退

进入将1.16版本的启动脚本进行备份,因为后面还要做版本升级

查看进程,此时,nginx1.16版本还有1个master进程,2个worker进程在运行。

进入1.15版本的解压目录,在objs目录中找到启动脚本,复制到/usr/local/nginx/sbin下,因为此时这个脚本正被使用,所以要用-f强制覆盖。

查看进程,可以看到master进程pid

[root@server1 objs]# kill -USR2 6294


使原本的1.16版本不再接受新的请求,所以会发现下面 回多出一个master进程和两个worker进程,这是因为回退的版本1.15进行了处理。

[root@server1 objs]# kill -WINCH 6294


关闭1.16的worker进程。

[root@server1 objs]# /usr/local/nginx/sbin/nginx -V


查看版本,版本回退成功。

4.版本升级

现在再把回退的版本升级。

同样,用1.16的脚本替代1.15的脚本。

查看进程

[root@server1 sbin]# kill -USR2 9016


使1.15版本的master不再接受新请求,9016就是1.15版本的马斯图尔进程pid

[root@server1 sbin]# kill -HUP 6294


再将1.16版本的master进程提起来

[root@server1 sbin]# kill -WINCH 9016

[root@server1 sbin]# /usr/local/nginx/sbin/nginx -V


查看版本号,升级成功。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。