Nginx热部署详解
前言
原理:
- nginx 支持热加载 热部署 ,在不打断用户请求的情况下更新版本
- Nginx 只所以出名,和它内部的精密设计有关。Nginx 采用了高度模块化的设计思路,并且内部的进程主要有两类,master 进程 和 worker 进程。其中 master 进程只有一个,worker 进程可以有多个。
- worker 进程才是真正 working 的进程,才是真正处理请求的进程。worker 进程全部都是 master 进程的子进程。worker 进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限。
- nginx 的热部署和其并发模型有着密不可分的关系。说白了,就是因为 master 进程的关系。当通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中。而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死,然后使用新的配置创建新的 worker。
实验环境:
- rhel7.3版本的虚拟机
- 两个不同版本的nginx安装包
一、配置过程
1.下载两个不同版本的安装包
[root@server1 ~]# ls
nginx-1.15.9.tar.gz nginx-1.16.0.tar.gz
配置一个1.16.0版本的nginx
2.解压1.16.0版本,作为旧的版本
[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz
[root@server1 ~]# ls
nginx-1.15.9.tar.gz nginx-1.16.0 nginx-1.16.0.tar.gz
3.关闭debug日志,编译,安装
解压出来的源码安装包下的文件的解释
.
(1)关闭debug日志
[root@server1 nginx-1.16.0]# vim auto/cc/gcc ##关闭日志
(2)安装依赖性
[root@server1 nginx-1.16.0]# yum install -y pcre-devel zlib-devel gcc
(3)编译
[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-file-aio
(4)编译之后出现了objs目录
(5)安装
[root@server1 nginx-1.16.0]# make
make后objs/下出现了二进制执行文件
[root@server1 nginx-1.16.0]# ls
[root@server1 nginx-1.16.0]# cd objs/
[root@server1 objs]# ls
(6)make install
[root@server1 nginx-1.16.0]# make install
make install 实际上就是将二进制执行文件和一些配置文件复制到/usr/local/nginx目录下
4.配置nginx服务
(1)查看配置文件,第一行是nobody
不写的话nginx进程默认用户是nobody 可以开启服务用ps aux查看
(2)进行语法检测
[root@server1 conf]# ../sbin/nginx -t
(3)查看版本号
[root@server1 conf]# ../sbin/nginx -V
(4)打开服务
[root@server1 conf]# ../sbin/nginx
(5)查看进程所有人是nobody
[root@server1 conf]# ps aux | grep nginx
(6)创建nginx用户
[root@server1 conf]# useradd nginx
[root@server1 conf]# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)
(7)关闭之前的nginx服务
[root@server1 conf]# ../sbin/nginx -s stop
(8)编辑配置文件
[root@server1 conf]# vim nginx.conf ##改变用户
user nginx nginx;
worker_processes 2;
(9)先在系统安全的配置文件中设定nginx用户允许的最大文件数
[root@server1 conf]# vim /etc/security/limits.conf
(10)再次编辑nginx配置文件,在配置文件设置最大并发数
[root@server1 conf]# vim nginx.conf ##改变最大并发数12 events {13 worker_connections 65535;14 }
(11)打开服务,查看进程,进程所有人是nginx用户
[root@server1 conf]# ../sbin/nginx
[root@server1 conf]#
[root@server1 conf]# ps aux
(12)打开浏览器测试,访问成功
访问到nginx的默认页面
二、更新nginx
1.解压另一个版本的nginx
[root@server1 ~]# cd nginx-1.15.9
[root@server1 nginx-1.15.9]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
2.编译安装,同样关闭debug日志,不取消版本号方便观察
注意:千万不要make insatll 否则会把二进制执行文件复制到/usr/local下的nginx目录 覆盖之前的文件
(1)编译
[root@server1 nginx-1.15.9]# ./configure --prefix=/usr/local/nginx --with-file-aio
(2)同样出现objs目录
(3)安装
[root@server1 nginx-1.15.9]# make
objs目录下的文件增加
[root@server1 nginx-1.15.9]# cd objs/
[root@server1 objs]# ls
(4)备份旧版本的nginx二进制执行文件
[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# cp nginx nginx.old
[root@server1 sbin]# ls
nginx nginx.old
(5)替换二进制文件(将新版本的二进制执行文件覆盖过去,要加 -f 否则报错正忙)
[root@server1 objs]# cp -f nginx /usr/local/nginx/sbin/nginx
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
(6)查看nginx进程,一个master,两个worker
[root@server1 objs]# ps -ef | grep nginx
(7)查看当前版本
[root@server1 objs]# cd -
/usr/local/nginx/sbin
[root@server1 sbin]# ./nginx -V
注意:虽然当前版本已经变成了1.15.9版本,这个时候表面上看起来是更新成了新版本,但还是旧版本的在工作,接收客户端请求的仍然是1.16.0版本的nginx,这就有了下面的平滑升级
三、平滑升级
1.kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
[root@server1 objs]# kill -USR2 4810
[root@server1 objs]# ps -ef | grep nginx
可以看到现在有2个master,4个worker
2.kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)
[root@server1 objs]# kill -WINCH 4810
[root@server1 objs]# ps -ef | grep nginx
可以看到现在有2个master,2个worker
旧版本的worker被关闭
3.查看版本号现在用的是新版本
四、版本的回退(如果升级后有问题可以立即回退来恢复)
命令 | 作用 |
---|---|
kill -USER2 进程号 | 不再让worker进程接受请求,当前请求处理完就让worker进程退出 |
kill -WINCH 进程号 | 处理完关闭 |
kill -HUP 进程号 | 启动进程 |
1.先将二进制执行文件还原,不加-f会提示文件正忙
操作前的进程nginx情况
开始回退
[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx nginx.old
[root@server1 sbin]# cp nginx.old nginx
cp: overwrite ‘nginx’? y
cp: cannot create regular file ‘nginx’: Text file busy[root@server1 sbin]#
[root@server1 sbin]# cp -f nginx.old nginx
cp: overwrite ‘nginx’? y
2.现在依旧是2个master 2个worker
3.kill -HUP 旧版本的进程号 (拉起旧版本的worker进程)
[root@server1 sbin]# kill -HUP 4810
[root@server1 sbin]# ps -ef | grep nginx
2个master 4个worker
5.kill -WINCH 新版本的主进程号 (关闭新版本的worker进程)
[root@server1 sbin]# kill -WINCH 16940
[root@server1 sbin]# ps -ef | grep nginx
6.查看版本号,是旧版本的nginx
[root@server1 sbin]# /usr/local/nginx/sbin/nginx -V
Nginx热部署详解相关推荐
- Java编程工具(11):IDEA 服务器热部署详解E
IDEA 服务器热部署详解(On Update action/On frame deactivation) IDEA 服务器热部署详解(On Update action/On frame deacti ...
- Intellij IDEA 安装使用Jrebel热部署详解
JRebel介绍: JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效.IDEA上原生是不支持热部署的,正常情况下,我们使用IDEA(或Eclipse等IDE)+tomcat ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解...
大纲 一.前言 二.环境准备 三.安装与配置Nginx (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡 (负载均衡算法:nginx负载算法 up ...
- Nginx的配置详解
人无再少年,花有重开日--风城玫瑰 德里克·罗斯 Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡. Ngin ...
- Nginx之代理详解
Nginx之代理详解 何为代理 要说清楚什么是反向代理,我们就需要先从最简单的C/S架构说起,C/S架构,也即是Client-Server的架构.而最简单的C/S架构,也即是以单个节点作为后端Serv ...
- Nginx配置文件nginx.conf中文详解(转)
######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组 user www www;#nginx进程数,建议设置为等于CPU总核心数. worker_pr ...
- MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解
MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...
- nginx.conf配置详解
######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组 user www www;#nginx进程数,建议设置为等于CPU总核心数. worker_pr ...
- nginx.conf 配置文件详解
本文来说下nginx.conf 配置文件详解 文章目录 Nginx 配置文件概述 nginx.conf 配置文件 通用(这里是 windows 系统系 nginx1.14.2 下 nginx.conf ...
最新文章
- 万字长文概览深度学习的可解释性研究
- Android Error: This attribute must be localized.
- 江西财经大学第一届程序设计竞赛 G题小Q的口袋校园
- 【2021年度训练联盟热身训练赛第二场】Binarize It(python)
- WIN7服务优化,别关太多,小心启动不
- STM32F1笔记(八)时钟
- 请领导批阅文件怎么说_请领导吃饭,不要对外说,职场员工为何如此保密?
- 人工智能入门,怎么选择脚踏实地的工作岗位?
- 中国急性髓系白血病药物市场趋势报告、技术动态创新及市场预测
- VS2013搭建wxWidgets开发环境
- springboot显示信息并且修改_Spring Boot小结-03--增.删.改.查
- python教程视频哪个好-Python视频教程谁的好
- 电脑、手机 自动化 键鼠操作( 类似按键精灵 )
- bandicam去水印
- 4. gstimxv4l2src.c源码分析
- u盘安装系统win2019服务器系统,U盘如何安装原版Windows server 2019?
- 2020java开发面试题
- OA系统添加审批模板
- 京东程序员回应“被猝死”:程序员该如何保护自己的健康?
- Ubuntu16桌面版安装realsense SDK
热门文章
- R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系)、交叉验证获取最优子树之后构建最优xgboost模型
- R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例、拟合方差分析模型(two-way ANOVA)、计算Eta Squared
- ERROR while rich displaying an object: Error: Continuous value supplied to discrete scale
- R可视化删除ggplot2图中的网格线(Gridlines)
- 特征交互(Feature Interaction)及多项式特征(PolynomialFeatures)
- java SE8 和 jdk1.8的关系 java版本号
- Badread: simulation of error-prone long reads Badread:模拟容易出错的长读断
- Linux之查看组操作
- TensorFlow基础11-(小批量梯度下降法和梯度下降法的优化)
- coco数据集大小分类_MicroSoft COCO数据集