一、Nginx高性能的 Web服务端
Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.02019年3月11日F5与NGINX达成协议,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。6.7亿美金约合44.97亿人民币,nginx核心模块代码长度198430(包括空格、注释),所以一行代码约为2.6万人民币。
基于Nginx的工作场景
正向代理:代理的客户端(科学上网)
反向代理:代理的服务端
官网地址 www.nginx.org
稳定版是偶数版,奇数版是测试版
Nginx历经十几年的迭代更新(https://nginx.org/en/CHANGES),目前功能已经非常完善且运行稳定,另外Nginx的版本分为开发版、稳定版和过期版,nginx以功能丰富著称,它即可以作为http服务器,也可以作为反向代理服务器或者邮件服务器,能够快速的响应静态网页的请求,支持FastCGl/SL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth/http或者TCP的负载均衡(1.9版本以上月开启stream模块)等功能.并且支持第三方的功能扩展。天猫 淘宝 京东 小米 163 新浪等一线互联网公司都在用Nginx或者进行二次开发
1.1yum 安装
[root@centos2 ~]#yum install epel-release -y
[root@centos2 ~]#yum install nginx -y
[root@centos2 ~]#rpm -q nginx
nginx-1.20.1-10.el7.x86_64
[root@centos2 ~]#nginx -v
nginx version: nginx/1.20.1
[root@centos2 ~]#
1.2官网文件安装
复制稳定版,注意不要多空格
[root@centos1 ~]#cd /etc/yum.repos.d/
[root@centos1 yum.repos.d]#ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
[root@centos1 yum.repos.d]#vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@centos1 yum.repos.d]#yum install nginx -y
1.3Input Output 模型
I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。
Linux 的 I/O
①磁盘I/O 磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
②网络I/O : 一切皆文件,本质为对socket文件的读写 网络通信就是网络协议栈到用户空间进程的IO就是网络IO
用户态:应用程序 我们可以控制
内核态:操作系统层面,我们不容易去控制的操作
1.当用户 发起 http 请求需要请求一个index.html 网页文件
2.客户端请求与服务器端 建立连接,建立连接后, 会发送请求报文
服务端的网卡收到请求报文, 会将该报文复制到 内核空间, 内核空间分析报文后交给对应的程序
3.nginx 分析该报文, 将报文和自己的配置文件,一一比对,按照配置文件完成请求, 分析后发现 客户需要 index.html
4.由于 程序的权限问题, 没有资格直接调用磁盘上的文件,程序会再将这个请求 再次转发给内核内核得到后请求 去磁盘上找文件,找到文件后 复制给程序nginx
5.程序会构建响应报文, 构建好 后 在交给内核空间
6.内核空间 得到响应报文后,再 交给网卡最后 发给 客户
零拷贝技术
传统的 Linux 系统的标准 I/O 接口(read、write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_user,这样做的好处是,通过中间缓存的机制,减少磁盘 I/O 的操作,但是坏处也很明显,大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,严重影响数据传输的性能,统计表明,在Linux协议栈中,数据包在内核态和用户态之间的拷贝所用的时间甚至占到了数据包整个处理流程时间的57.1%
什么是零拷贝
零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化
减少 内核空间 和 用户空间 之间拷贝次数
1.4 I/O 模型相关概念
同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
-
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
-
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1.5网络I/O模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
阻塞型 I/O 模型(blocking IO)
阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够
-
优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
-
缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式。
同步阻塞:程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求,并由进程轮训查看I/O是否完成,完成后进程将I/O结果返回给Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种方式简单,但是比较慢,用的比较少
非阻塞型 I/O 模型 (nonblocking IO)
非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完成。
理解下:
一般使用 异步非阻塞
多路复用 I/O 型 ( I/O multiplexing )
I/O multiplexing 主要包括:select,poll,epoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。Apache prefork是此模式的select,work是poll模式。
信号驱动式 I/O 模型 (signal-driven IO)
在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞
当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。
-
优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
-
缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知
异步 I/O 模型 (asynchronous IO)
异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知我们何时开始一个I/O操作,而异步I/O是由内核通知我们I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了。所有事情都交给内核处理。
这五种 I/O 模型中,越往后,阻塞越少,理论上效率也是最优前四种属于同步 I/O,因为其中真正的I/O 操作(recvfrom)将阻塞进程/线程,只有异步 I/O 模型才与 POSIX 定义的异步 I/O 相匹配
Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,主要有以下实现方式:
1、select:
select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部
分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型。
2、poll:
在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编
译nginx的时候可以使用--with-poll_module和--without-poll_module这两个指定是否编译select
库。
3、epoll:
epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和
select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.
epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个
表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大
数,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行
操作。
4、rtsig:
不是一个常用事件驱动,最大队列1024,不是很常用
5、kqueue:
用于支持BSD系列平台的高校事件驱动模型,主要用在FreeBSD 4.1及以上版本、OpenBSD 2.0级以上版
本,NetBSD级以上版本及Mac OS X 平台上,该模型也是poll库的变种,因此和epoll没有本质上的区别,
都是通过避免轮训操作提供效率。
6、/dev/poll:
用于支持unix衍生平台的高效事件驱动模型,主要在Solaris 平台、HP/UX,该模型是sun公司在开发
Solaris系列平台的时候提出的用于完成事件驱动机制的方案,它使用了虚拟的/dev/poll设备,开发人员
将要见识的文件描述符加入这个设备,然后通过ioctl()调用来获取事件通知,因此运行在以上系列平台的时
候请使用/dev/poll事件驱动机制。
7、eventport:
该方案也是sun公司在开发Solaris的时候提出的事件驱动库,只是Solaris 10以上的版本,该驱动库看防
止内核崩溃等情况的发生。
8、Iocp:
Windows系统上的实现方式,对应第5种(异步I/O)模型。
例题:
select 与poll 与epoll 间的区别
总结 select 和 epoll 之间的区别
select:会轮询遍历所有的 事作集合,其次遍历的事件个数有限制
epoll:只会遍历已准备好的事件集合,事件个数无限制
Nginx概述
Nginx 功能介绍
-
静态的web资源服务器html,图片,js,css,txt等静态资源
-
http/https协议的反向代理 ,7层 url
-
结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求
-
tcp/udp协议的请求转发(反向代理) 4层
基础特性
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
-
event-driven, aio, mmap,sendfile
Web 服务相关的功能
-
虚拟主机(server)
-
支持 keep-alive 和管道连接(利用一个连接做多次请求)
-
访问日志(支持基于日志缓冲提高其性能)
-
url rewirte
-
路径别名
-
基于IP及用户的访问控制
-
支持速率限制及并发数限制
-
重新配置和在线升级而无须中断客户的工作进程
Nginx 进程结构
web请求处理机制
-
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
-
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
主进程(master process)的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
主进程不干活,干活的是worker
nginx 模块
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
安装及使用Nginx
1. 编译安装nginx
源码包内的文件:
contrib:vim 格式文件,修改nginx配置文件的格式,高亮 cp -r /opt/nginx-1.18.0/contrib/vim/* /usr/share/vim/vimfiles/
conf:配置文件
man:man帮助 man man/nginx.8 不加路径看不了 nginx.8 文件
src:源码包 点c 点h 结尾的文件 find src -type f |xargs cat |wc -l 193678
关闭防火墙
安装编译安装需要的依赖包和工具
新建nginx用户便于管理
官网下载安装包
进入后找到右边菜单栏的download,进入后选择自己想要下载的版本可以直接下载到本地然后传到Linux系统中或右键复制该包的下载连接在Linux系统中wget此地址直接下载到Linux系统中。
编译安装nginx
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
#直接复制进去就可以
make -j 2 && make install
make -j 2 ##表示cpu有2核,使用2个cpu同时一起编译,make是将源代码翻译成二进制make install ##表示将二进制文件放到指定的目录中
yum -y install gcc pcre-devel openssl-devel zlib-devel
#安装编译安装需要的依赖包和工具
cd /opt
#进入指定安装包下载的目录 /opt下
tar xf nginx-1.18.0.tar.gz
#将nginx包解压到当前文件夹
cd nginx-1.18.0
#进入解压后nginx包中
./configure
#执行当前目录下的configure脚本检测编译安装环境和工具
--prefix=/apps/nginx \
#执行脚本时指定路径为 /apps/nginx文件夹中,若没有此文件夹需要先创建再进行编译指定
--user=nginx \
#指定用户为nginx用户
--group=nginx \
#指定组为nginx组
--with-http_ssl_module \
#以下是编译时安装的指定模块
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make
#执行完成检测编译安装环境和工具后将nginx安装包翻译为二进制
make install
#翻译完成后将包写入磁盘中
编译安装nginx安装完成了
去看下日志
ln -s /apps/nginx/sbin/nginx /usr/sbin/ 创建软连接后直接 nginx启动
chown -R nginx.nginx /apps/nginx 修改权限
1.1启动 、 停止nginx
方法一
/apps/nginx/sbin/nginx
#使用绝对路径启动nginx
ps aux |grep nginx
#查看是否有nginx进程
killall nginx 停止nginx进程
方法二
[root@centos1 nginx]#ln -s /apps/nginx/sbin/nginx /usr/sbin/
[root@centos1 nginx]#nginx
[root@centos1 nginx]#ps aux|grep nginx
root 10150 0.0 0.0 46208 1164 ? Ss 19:54 0:00 nginx: master process nginx
nginx 10151 0.0 0.1 48736 1996 ? S 19:54 0:00 nginx: worker process
root 10153 0.0 0.0 112824 988 pts/1 S+ 19:54 0:00 grep --color=auto nginx
[root@centos1 nginx]#killall nginx
[root@centos1 nginx]#
1.2创建Nginx 自启动文件 使用systemd 进行管理
[root@centos1 nginx]#vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
[root@centos1 nginx]#systemctl daemon-reload
[root@centos1 nginx]#systemctl start nginx
[root@centos1 nginx]#systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2024-02-20 20:01:44 CST; 10s ago
Docs: http://nginx.org/en/docs/
Process: 10282 ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 10284 (nginx)
CGroup: /system.slice/nginx.service
├─10284 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
└─10285 nginx: worker process
2月 20 20:01:44 centos1 systemd[1]: Starting nginx - high performance web server...
2月 20 20:01:44 centos1 systemd[1]: Started nginx - high performance web server.
简单解释下:
vim /lib/systemd/system/nginx.service
[Unit] ##服务说明
Description=nginx ##描述服务
After=network.target ##依赖,当依赖的服务启动的时候再启动自定义的服务
[Service] ##服务运行参数的设置
Type=forking ##表示后台运行,使用启动类型应该同事指定PIDFile=,这样便于systemd能够追踪
PIDFile=/usr/local/nginx/logs/nginx.pid ##指定pid的文件
ExecStart=/usr/local/nginx/sbin/nginx ##服务启动的命令,就是绝对路径启动的命令
ExecReload=/bin/kill -s HUP $MAINPID ##加载
ExecStop=/bin/kill -s QUIT $MAINPID ##关闭
PrivateTmp=true ##表示给服务分配独立的临时空间
[Install]
WantedBy=multi-user.target ##服务安装的相关设置,可设置多用户
使用systemd 进行管理 开启nginx服务
可以模拟下关闭nginx
如果需要修改pid文件
###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid /apps/nginx/run/nginx.pid;
#找到 pid的位置修改
#######################################################
2. yum安装
[root@centos2 ~]#yum install epel-release -y
[root@centos2 ~]#yum install nginx -y
[root@centos2 ~]#rpm -q nginx
nginx-1.20.1-10.el7.x86_64
[root@centos2 ~]#nginx -v
nginx version: nginx/1.20.1
[root@centos2 ~]#
3.平滑升级及命令、信号使用
3.1信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用 有以下选项
[root@centos1 ~]#nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /apps/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
[root@centos1 ~]#
3.1.1 显示版本
3.1.2显示编译详细情况 模块等信息
3.1.3发送信号 重点
kill -l 看信号大全
nginx -h 中可以看到的信号较少
s signal : send signal to a master process: stop, quit, reopen, reload
可以使用man手册来查看详细的信号 如果没安装,去源码包里找到man文件
man 路径/nginx.8 不加路径打不开man帮助
stop SIGTERM 直接停止
quit SIGQUIT 优雅的退出:有人在访问不会结束进程
reopen SIGUSR1 分割日志
reload SIGHUP 重新加载配置文件
SIGHUP Reload configuration, start the new worker process with a new configuration, and
gracefully shut down old worker processes.
SIGQUIT Shut down gracefully. 优雅的关闭:有人在访问不会结束进程
SIGUSR1 Reopen log files. 重新分割日志
SIGUSR2 Upgrade the nginx executable on the fly. 运行中升级
SIGWINCH Shut down worker processes gracefully. 优雅的关闭worker进程,work进程负责处理请求,还有请求不会关闭
[root@centos1 logs]#man /opt/nginx-1.18.0/man/nginx.8 使用man手册查看信号
分割日志
去7-2访问
再去7-1查看日志
日志每天都要换一次,看如下方法
日志
去看下日志:
方法一:
nginx -s reopen 日志分割
方法二:
Nginx的进程
Apache和Nginx的默认端口都是80,如果其中一个已经启动了,那么再启动另一个会报错。如果想要同时使用,可以修改其中一个的端口号。
Nginx有两个进程:
master process:主进程(守护进程),用来管理工作进程。
worker process:工作进程,用来处理用户的请求。
3.1.4 指定配置 不已配置文件中的为准
nginx -g 'user zhangsan;' 已张三身份运行,默认是以nginx身份
nginx -g 'daemon off;' 前台运行命令
重新加载 [root@centos1 ~]#nginx -s reload 如果重启服务会导致断开 最好重新加载
进入配置文件
不进配置文件就可以修改
nginx -s stop #立即关闭nginx
nginx -s quit #优雅退出 不影响业务的状态下退出
nginx -s reload #重新加载
3.1.5 检查语法格式
nginx -T 检查所有并退出
nginx -s发送信号
帮助: -? -h
使用指定的配置文件: -c
指定配置指令:-g
指定运行目录:-p
测试配置文件是否有语法错误:-t -T
打印nginx的版本信息、编译信息等:-v -V
发送信号: -s 示例: nginx -s reload
3.2 升级 nginx1.18 nginx1.20
热升级:不影响用户访问
-
将旧Nginx文件换成新Nginx文件(注意备份)
-
向master进程发送USR2信号
-
master进程修改pid文件名,加后缀.oldbin
-
master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务
-
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件
-
向旧master进程发送QUIT信号,关闭老master
-
如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT
实验:
关闭防火墙,核心防护
去官网复制网址
下载新的安装包
解压 安装模块
编译 但不要安装
执行make就行,不要执行make install,不然会覆盖掉之前的18版本
去查看有2个版本
[root@localhost objs]#cd objs #此文件夹中有新版本的nginx 运行程序
[root@centos1 objs]#mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名
[root@centos1 objs]#cp /opt/nginx-1.20.2/objs/nginx /apps/nginx/sbin/
#将新版本 拷入进去
去7-1
升级
[root@centos1 html]#dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
去另一台机器测试下载,注意自己的地址段 测试机去下载,模拟正在使用的环境
[root@centos2 opt]#wget --limit-rate=1M http://192.168.91.7/m.img
优雅的退出 (为了不影响用户体验)
[root@centos1 html]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
再去访问下
升级成功
补充:
测试一段时间无问题 就可以了,如果断掉第一个 下载 ,老的进程就关闭了
补充
这直接退出就不能回滚了如上图
如果你直接kill 11844停掉 就没办法回滚了 ,需要使用如下方法把名字修改下就可以了
先停掉服务
再去访问:
或者也可以优雅的退出 这样新版本有问题还可以回滚
使用此方法可以回滚
再去访问
3.3 回滚
kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
补充:
4.配置详细解释
nginx 官方帮助文档:nginx documentation
tengine 帮助文档:Nginx文档
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
可以加上编译安装的路径也可以看到 即绝对路径
配置文件由指令和指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
pid /apps/run/nginx.pid
指令已{}达括号将多条指令组织在一起且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
#事件驱动相关的配置 同步
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {负载均衡
...
}
4.1全局配置
nginx 有多种模块
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
4.1.1 关闭版本或修改版本
server_tokens off;
去7-2检测
自行修改
#去修改源码,在安装包里, 再重新编译 #号不要去掉
#先把服务关闭,不然编译不成功
[root@centos1 src]#vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
修改之后,重新编译安装
去检测:
[root@centos1 nginx-1.18.0]#vim /apps/nginx/conf/nginx.conf 进入配置文件
实验效果
server_tokens on; nihaoz/10086
server_tokens off; lucky
4.1.2 修改启动的进程数
worker_processes 2;
[root@centos1 nginx-1.18.0]#ps axo pid,cmd,psr|grep nginx
补充:解释下
设置: ##应用程序的配置,修改配置文件 第一步:设置worker_processes进程的数量,一般为cpu的核数,或者为auto; 第二步:进行worker_processes与cpu绑核,设置worker_cpu_affinity; 第三步:设置worker进程的最大文件打开数量worker_rlimit_nofile和worker进程的最大连接数量worker_connections;并且启动epoll开发模型; 第四步:保存退出后nginx -t检查一下语法,并重启nginx服务,ps aux|grep nginx去查看nginx的worker进程的pid号
4.1.3 cpu与work 进程 绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
实验绑定
worker_cpu_affinity 00000001 00000010 00000100 00001000;
4.1.4 PID 路径
pid /apps/nginx/run/nginx.pid;
pid 进程号文件位置 可以 自定义
4.1.5 nginx进程的优先级(work进程的优先级)
当你想将nginx的work进程的优先级调高 可以使用nice设置
[root@centos1 nginx-1.18.0]#ps -elf|grep nginx
修改:
worker_priority -20;
4.1.6 调试work进程打开的文件的个数
worker_rlimit_nofile 65536;
#所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致
去调系统进程
补充:
使用systemctl管理配置文件中要写它,然后去修改pam认证,修改之后才可以生效,如果不加此项,修改之后并没有真正的生效
去查看
4.1.7 服务是否已后台方式运行
一般服务都是后台运行,前台容器中会用到
user nginx;
worker_processes 2;
worker_cpu_affinity 00000101 00000010;
daemon off; #加入此选项
[root@localhost ~]#systemctl start nginx
4.1.8 只有 master进程没有 work进程
实际生产中使用较少
master_process off|on;
#是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on