目录
2.非阻塞型 I/O 模型 (nonblocking IO)
3.多路复用 I/O 型 ( I/O multiplexing )
4.信号驱动式 I/O 模型 (signal-driven IO)
3.server块构建虚拟主机 实际只有1台, 好像有多台主机
一、Nginx介绍
1、什么是Nginx
Nginx
Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求。
一款高性能、轻量级Web服务软件
- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高
- 单台物理服务器可支持30 000~50 000个并发请求
2、Nginx并发连接
Nginx并发连接能力受以下二个因素的影响:
- CPU个数
- 本地物理服务器系统的最大文件打开数
3、Nginx应用场景
- 静态服务器(图片,视频服务)
- 动态服务
- 反向代理,负载均衡
- 缓存服务
4、nginx的HTTP七层代理和四层代理
nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更高的代理性能,nginx支持了四层代理,即传输层,就是我们常说的TCP/UDP层,没有协议解析,就是简单的TCP/UDP转发,代理性能突飞猛进,该功能依赖于ngx_http_upstream_module和ngx_stream_upstream_module,互联网公司将其作为入口代理来工作。
5、反向代理
反向代理是指用户不需要知道目标服务器的地址,也不需要在用户端做任何设定,可以直接通过访问反向代理服务器来获得目标服务器的资源。反向代理提高了内部服务器的安全,加快了对内部服务器的访问速度。
1.反向代理定义
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。
同时,用户不需要知道目标服务器的地址,也无须在用户端做任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
2.反向代理优点
- 提高了内部服务器的安全
- 加快了对内部服务器的访问速度
- 节约了有限的IP资源
影响用户体验的因素
#客户端
客户端硬件配置
客户端网络速率
客户端与服务端距离
#服务器
服务端网络速率
服务端硬件配置
服务端架构设计
服务端应用程序工作模式
服务端并发数量
服务端响应文件大小及数量 buffer cache
服务端I/O压力
6、yum安装
[root@localhost ~]#yum -y install epel-release.noarch
[root@localhost ~]#yum -y install nginx
[root@localhost ~]#rpm -q nginx
nginx-1.20.1-10.el7.x86_64
[root@localhost ~]#nginx -v
nginx version: nginx/1.20.1
7、官网文件安装
注意,不要复制空格,不然会出错
[root@localhost ~]#cd /opt/
[root@localhost opt]#wget https://nginx.org/download/nginx-1.22.1.tar.gz
[root@localhost opt]#cd /etc/yum.repos.d/
[root@localhost yum.repos.d]#ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo epel-testing.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo epel.repo
[root@localhost yum.repos.d]#vim /etc/yum.repos.d/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@localhost yum.repos.d]#yum -y install nginx
[root@localhost yum.repos.d]#rpm -q nginx
nginx-1.24.0-1.el7.ngx.x86_64
[root@localhost yum.repos.d]#nginx -v
nginx version: nginx/1.24.0
二、Nginx和Apache的优缺点比较
Nginx
Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求。
Apache:
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
1、nginx相对于apache的优点:
轻量级,同样起web服务,比apache占用更少的内存及资源抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能。高度模块化的设计,编写模块相对简单。
2、apache相对于nginx的优点∶
Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
模块多,基本想到的都可以找到、少bug, nginx的bug相对较多、超稳定。
一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache。
3、Nginx和Apache最核心的区别
apache是同步多进程模型,一个连接对应一个进程,nginx是异步的,多个连接可以对应一个进程。
Nginx处理静态文件好, 耗费内存少,只适合静态和反向。
Apache在处理动态有优势。
nginx并发性比较好, CPU占用内存低,如果rewrite频繁,选用apache最佳。
4、Nginx和Apache的差异
- Nginx是一个基于事件的Web服务器,Apache是一个基于流程的服务器;
- Nginx所有请求都由一个线程处理,Apache单个线程处理单个请求;
- Nginx避免子进程的概念,Apache是基于子进程的;
- Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
- Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
- Nginx支持热部署,Apache不支持热部署;
- Nginx对于静态文件处理具有更高效率,Apache相对一般;
- Nginx在反向代理场景具有明显优势,Apache相对一般。
二、 Input Output (I/O事件模型)
I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。
Linux 的 I/O
-
磁盘I/O 磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
-
附加:(磁盘I/O==本地I/O) 从内存到磁盘
-
网络I/O : 一切皆文件,本质为对socket文件的读写 网络通信就是网络协议栈到用户空间进程的IO就是网络IO
用户态:应用程序 我们可以控制
内核态:操作系统层面 我们不容易去控制的 操作系统
1.客户端发起请求 先发送到网卡
2.网卡收到的报文复制到内核空间
3.内核空间再复制到用户空间的应用程序空间
4.nginx 分析得到一个磁盘页面文件
5.再将需求反馈给内核空间,应为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
6.内核去磁盘上找到所需要的文件,加载到内核空间
7.加载后再复制到用户空间
8.用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
整个过程会来回切换 用户空间,内核空间 那么我们可以再次基础上做优化处理
1、零拷贝技术
传统的 Linux 系统的标准 I/O 接口(read、write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_user,这样做的好处是,通过中间缓存的机制,减少磁盘 I/O 的操作,但是坏处也很明显,大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,严重影响数据传输的性能,统计表明,在Linux协议栈中,数据包在内核态和用户态之间的拷贝所用的时间甚至占到了数据包整个处理流程时间的57.1%
什么是零拷贝
零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化
MMAP ( Memory Mapping )
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问。
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
2、I/O模型模型相关概念
同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
-
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
-
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
-
3、网络I/O模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
1.阻塞型 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是否完成,这种方式简单,但是比较慢,用的比较少。
2.非阻塞型 I/O 模型 (nonblocking IO)
非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完成。
3.多路复用 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模式。
4.信号驱动式 I/O 模型 (signal-driven IO)
信号驱动I/O的意思就是我们现在不用傻等着了,也不用去轮询。而是让内核在数据就绪时,发送信号通知我们。
此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。
在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞
当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。
-
优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
-
缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知
5.异步 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 相匹配
Select:
POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者
检查存放fd标志位的数据结构来进行下一步处理
缺点
单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义
FD_SETSIZE,再重新编译内核实现,但是这样也会造成效率的降低
单个进程可监视的fd数量被限制,默认是1024,修改此值需要重新编译内核
对socket是线性扫描,即采用轮询的方法,效率较低
select 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一个用来存放大量fd的数据结
构,这样会使得用户空间和内核空间在传递该结构时复制开销大
poll:
本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
其没有最大连接数的限制,原因是它是基于链表来存储的
大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd
select是边缘触发即只通知一次
epoll:
在Linux 2.6内核中提出的select和poll的增强版本
支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会
通知一次
使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调
机制来激活该fd,epoll_wait便可以收到通知
优点:
没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口),具体查
看/proc/sys/fs/file-max,此值和系统内存大小相关
效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,
即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销
三、Nginx概述
1、Nginx功能介绍
-
静态的web资源服务器html,图片,js,css,txt等静态资源
-
http/https协议的反向代理 ,7层 url
-
结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求
-
tcp/udp协议的请求转发(反向代理) 4层
2、基础特性
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
-
event-driven, aio, mmap,sendfile
3、Web 服务相关的功能
-
虚拟主机(server)
-
支持 keep-alive 和管道连接(利用一个连接做多次请求)
-
访问日志(支持基于日志缓冲提高其性能)
-
url rewirte
-
路径别名
-
基于IP及用户的访问控制
-
支持速率限制及并发数限制
-
重新配置和在线升级而无须中断客户的工作进程
4、Nginx架构
5、Nginx进程
web请求处理机制
-
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
-
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
主进程(master process)的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(worker process)的功能:
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
四、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
1. conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
2. html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
3. logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
4. sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
useradd -M -s /sbin/nologin nginx #新建nginx用户便于管理
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel #安装依赖包
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz #官网下载安装包
tar xf nginx-1.18.0.tar.gz #解压软件包
cd nginx-1.18.0/
./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
make install
###也等于 make -j 2 && make install
ln -s /apps/nginx/sbin/nginx /usr/bin/ #创建软连接后直接 nginx启动
[root@localhost nginx]#nginx -v ###查看版本
nginx version: nginx/1.18.0
/apps/nginx/sbin/nginx #绝对路径启动
nginx #相对路径启动
killall nginx #停止服务
[root@localhost nginx]#ll /apps/
总用量 0
drwxr-xr-x 6 root root 54 2月 20 20:35 nginx
chown -R nginx.nginx /apps/nginx #修改权限
[root@localhost nginx]#ll /apps/
总用量 0
drwxr-xr-x 6 nginx nginx 54 2月 20 20:35 nginx
1.启动停止nginx
##########启动##############
/apps/nginx/sbin/nginx
#绝对路径启动
ln -s /apps/nginx/sbin/nginx /usr/sbin/
#创建软连接后直接 nginx启动
##########停止###############
killall nginx
2.创建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
nginx -t ###查看配置是否有错误
[root@localhost nginx]#systemctl daemon-reload
[root@localhost nginx]#systemctl start nginx
[root@localhost nginx]#systemctl status nginx
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 ##服务安装的相关设置,可设置多用户
如果需要修改pid文件
###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid /apps/nginx/run/nginx.pid;
#找到 pid的位置修改
注意:如果不需要,还是请不要修改pid
2、yum安装
###首先关闭防火墙和核心防护
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#systemctl disable firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum -y install epel-release.noarch ###安装额外源
[root@localhost ~]#yum -y install nginx
[root@localhost ~]#rpm -q nginx
nginx-1.20.1-10.el7.x86_64
[root@localhost ~]#nginx -v
nginx version: nginx/1.20.1
3、平滑升级及命令、信号使用
1.信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用 有以下选项
[root@node2 ~]#nginx -h
-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: /etc/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
1、nginx -v 显示版本
2、nginx -h 查看帮助
3、nginx -V 显示编译详细情况 模块等信息
4、nginx -t 检查语法错误
nginx -T 检查语法错误(全部检查一遍)
5、发送信号*****
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进程负责处理请求,还有请求不会关闭
5.1、[root@centos1 logs]#man /opt/nginx-1.18.0/man/nginx.8 使用man手册查看信号
5.2 指定配置 不已配置文件中的为准
nginx -g 'user zhangsan;' 已张三身份运行,默认是以nginx身份
nginx -g 'daemon off;' 前台运行命令
nginx -g 'worker_processes 3;' 不进配置文件就可以修改
注意:需要将配置文件的worker_processes 1;给注释了,不然报错
分割日志
reopen == USR1
7-2访问
7-1查看日志
日志每天要换一次
日志还是写在了.bak中
nginx -s reopen
[root@localhost logs]#pstree -p |grep nginx
[root@localhost logs]#kill -USR1 5235
#然后再去7-2访问7-1浏览器
[root@localhost logs]#ll
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
cd /data/
wget https://nginx.org/download/nginx-1.20.2.tar.gz
[root@localhost data]#ls
nginx-1.20.2.tar.gz
[root@localhost data]#tar xf nginx-1.20.2.tar.gz
[root@localhost data]#cd nginx-1.20.2/
[root@localhost nginx-1.20.2]#nginx -V ###可以看到编译模块
[root@localhost nginx-1.20.2]#./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 ###进行编译模块
将/apps/nginx/sbin/nginx改名为nginx.bak,再将/data/nginx/objs/nginx复制到原先的位置
7-1
[root@localhost nginx-1.20.2]#cd objs/
[root@localhost objs]#ls
[root@localhost objs]#mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak ###做备份
[root@localhost objs]#cp /data/nginx-1.20.2/objs/nginx /apps/nginx/sbin/ ###复制1.20版本到1.18版本下
[root@localhost objs]#cd /apps/nginx/sbin/
[root@localhost sbin]#ls
nginx nginx.bak
[root@localhost sbin]#nginx -v
nginx version: nginx/1.20.2
7-2
[root@localhost ~]#curl 192.168.10.101 -I ###后面加 —I 可以显示版本号
7-1
[root@localhost sbin]#ps -aux |grep nginx
[root@localhost sbin]#ps -aux |grep -v grep |grep nginx 过滤了下面显示的grep
这个时候另一台访问是还是1.18版本
优雅关闭
优雅关闭老进程
以防万一有人在访问,优雅退出也不影响他人
如果不加 -quit 那就是暴力推出了,那样就无法回滚老进程了
回滚
[root@localhost html]#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 {负载均衡
...
}
1.全局配置
nginx有多种模块
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
1.关闭版本或修改版本
[root@localhost conf]#vim /apps/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; ###关闭版本号,只添加这一行
}
#去修改源码,在安装包里, 再重新编译 #号不要去掉
#先把服务关闭,不然编译不成功
[root@localhost core]#vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
修改完在进行重新编译
--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
2.修改启动的进程数
3.cpu与work进程绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升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.PID 路径
pid /apps/nginx/run/nginx.pid;
pid 进程号文件位置可以自定义省略
5.
5.nginx进程的优先级(work进程的优先级)
当你想将nginx的work进程的优先级调高 可以使用nice设置
[root@localhost nginx-1.18.0]#ps -elf|grep nginx
优先级取值 -20 ---- 20
真实最大为19
优先级越小越好 负的优先级更高
vim /apps/nginx/conf/nginx.conf
worker_priority -20;
6.调试work进程打开的文件的个数
worker_rlimit_nofile 65536;
#所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
调系统进程
补充:
使用systemctl管理配置文件中要写它,然后去修改pam认证,修改之后才可以生效,如果不加此项,修改之后并没有真正的生效
去查看
7.服务是否一再后台方式运行
一般服务都是后台运行,前台容器中会用到
user nginx;
worker_processes 2;
worker_cpu_affinity 00000101 00000010;
daemon off; #加入此选项
[root@localhost ~]#systemctl start nginx
8.只有master进程没有work进程
实际生产中使用较少 测试环境用的多
master_process off|on;
#是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为on
2.event事件
event相当于io模型调优
events {
worker_connections 65536; #设置单个工作进程的最大并发连接数
use epoll;
#使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置。
accept_mutex on; ###开启惊群模式,有几个请求,来几个worker进程来处理
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
multi_accept on;
#ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}
小问题:一个服务端最多能接受多少客户端
服务器的硬件配置、操作系统的设置、网络带宽等。在理论上,一个服务器可以接受的最大客户端数量是有限的,这个数量通常被称为"最大并发连接数"。然而,这个数量可能会受到服务器硬件的限制,例如 CPU、内存和网络带宽的限制。此外,操作系统的设置也可能会影响这个数量,例如操作系统可能会限制一个进程可以打开的文件描述符的数量。
Nginx 是一个 HTTP 和反向代理服务器,它主要用于处理 HTTP 请求。它不能直接控制或管理设备的 MAC 地址,因为 MAC 地址是设备的物理地址,由设备的网络接口硬件决定,而不是由软件决定。
反向代理服务器是一种服务器配置,它接收客户端的请求,然后将这些请求转发给后端服务器,最后将后端服务器的响应返回给客户端。
3.http设置
http 是一个大的语句块,包含若干个小的语句块(比如server语句块)
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL { #指定URL的特性
...
if CONDITION {
...
}
}
}
}
########主要的关键字###########
listen 监听
server_name 域名、主机名
root
http协议配置说明
http {
include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
######如果在mine.types里面支持显示,如果不在,那就是下载了
default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#自定义优化参数
sendfile on; ###减少内核和用户空间的拷贝
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。
#tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
#keepalive_timeout 0; ###长链接
keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同
### 65 65 前面的65是给用户看的,后面的65是真实的65
#gzip on; #开启文件压缩
server {
listen 80; #设置监听地址和端口
server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server
#charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8
#access_log logs/host.access.log main;
location /fxj { www.ky31.com/fsj /apps/nginx/html
root /data;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #定义错误页面
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #以http的方式转发php请求到指定web服务器
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { #以fastcgi的方式转发php请求到php处理
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件
来改变自己的重定向等功能。
# deny all;
#}
location ~ /passwd.html {
deny all;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server { #自定义虚拟server
3.3.1 MIME
范例: 识别php文件为text/html
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm; #指定默认网页文件,此指令由
ngx_http_index_module模块提供
# }
#}
# HTTPS server
#
#server { #https服务器配置
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
1.mime
此项为支持的 文件格式,如果不支持的格式 会自动帮你下载,如果支持 就会显示在网页上
[root@localhost ~]#vim /etc/nginx/mime.types
types {
text/html html htm shtml;
.....................................................................
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
2.sever 下的 root
root指定了主页文件的位置
root路径格式 指定文件的路径 url
Syntax: root path;
Default:
root html;
Context: http, server, location,
指明 你软件的根目录
root在 http,server,location都可以写,可以写入哪里,可以参考nginx官网
写在server中
①
②
写在location中
root:指明根目录位置
location:根据用户访问地址的不同,指定访问的目录
如果定义了 location,但在它的下面没有写内容,相当于没写
location实际是对用户的请求做个性化设置,根据用户访问的地址不同,指定访问的目录
如果没有对location做定义目录,那么会找root目录
3.server块构建虚拟主机 实际只有1台, 好像有多台主机
A 建立独立的配置文件 构建不同虚拟主机 PC端和手机端
1.基于不同域名的虚拟主机 同一主机设置两个域名
vim /apps/nginx/conf/nginx.conf ###nginx主配置文件
include /apps/nginx/conf.d/*.conf; ###在主配置的http模块下加入子配置文件的位置
mkdir /apps/nginx/conf.d ###子配置文件
[root@localhost nginx]#vim conf/nginx.conf
[root@localhost nginx]#nginx -t
[root@localhost nginx]#nginx -s reload
[root@localhost nginx]#cat conf/nginx.conf|grep include
7-1 192.168.10.101
[root@localhost nginx]#cd /apps/nginx/conf.d/
[root@localhost conf.d]#ls
编写手机PC端页面
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#mkdir /data/html
[root@localhost conf.d]#echo /data/html > /data/html/index.html
[root@localhost conf.d]#echo pcpcpcpc >> /data/html/index.html
[root@localhost conf.d]#cat /data/html/index.html
编写手机端页面
[root@localhost conf.d]#cp pc.conf m.conf
[root@localhost conf.d]#vim m.conf
server{
listen 80;
server_name www.lucky.com;
root /mnt/html/;
}
cd /mnt/
mkdir html
ls
echo /mnt/html > /mnt/html/index.html
echo hahahahaha >> /mnt/html/index.html
cat /mnt/html/index.html
nginx -t
nginx -s reload
去7-2测试
2.基于不同ip地址
[root@localhost conf.d]#vim /apps/nginx/conf.d/pc.conf
server{
listen 192.168.10.101;
server_name www.lucky.com;
root /data/html/;
}
[root@localhost conf.d]#vim /apps/nginx/conf.d/m.conf
server{
listen 192.168.10.111;
server_name www.m.com;
root /mnt/html/;
}
###添加一个虚拟网卡
[root@localhost conf.d]#ifconfig ens33:0 192.168.10.111
[root@localhost conf.d]#ifconfig
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
去7-2检测
[root@localhost ~]#curl 192.168.10.101
/data/html
pcpcpcpc
[root@localhost ~]#curl 192.168.10.111
/mnt/html
hahahahaha
检测:
3.基于不同的端口
修改7-1
[root@localhost conf.d]#vim /apps/nginx/conf.d/pc.conf
server{
listen 9527;
server_name www.lucky.com;
root /data/html/;
}
[root@localhost conf.d]#vim /apps/nginx/conf.d/m.conf
server{
listen 80;
server_name www.m.com;
root /mnt/html/;
}
[root@localhost conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost conf.d]#nginx -s reload
检测7-2
[root@localhost ~]#curl 192.168.10.101:9527
/data/html
pcpcpcpc
[root@localhost ~]#curl 192.168.10.101:80
/mnt/html
hahahahaha
去7-2检测
4.alias别名
server {
listen 80;
server_name www.lucky.com;
location /news {
root /data/nginx/html/pc/;
#root 相当于追加 将文件夹news追加到/data/nginx/html/pc/news
}
location /study {
alias /mnt/nginx/sports/;
#alias 相当于替换 你访问 study 就是访问/mnt/nginx/sports
}
}
###7-1修改配置
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /shouji {
alias /opt/;
}
}
[root@localhost conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost conf.d]#nginx -s reload
检测:
5.localtion 去匹配 追踪url
在一个server中location配置段可存在多个,用于实现从url到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个url,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
下面是location官方帮助文档
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
location实际是对用户的请求做个性化设置,根据用户访问的地址不同,指定访问的目录
如果没有对location做定义目录,那么会找root目录
location是追踪URL,找到资源所在位置
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写
~ #用于标准url前,表示包含正则表达式,并且区分大小写
~* #用于标准url前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
#\ #用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
正则表达式匹配:
location ~* /A.?\.jpg {
#匹配 已A后面一个或没有字符,已.jpg结尾的图片
root /opt/nginx/html/image;
}
符号 | 含义 | 优先级 |
---|---|---|
= | 用于标准ur前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 | 1 |
^~ | 用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写 | 2 |
~ | 用于标准ud前,表示包含正则表达式吗,并且区分大小写 | 3 |
~* | 用于标准url前,表示包含正则表达式,并且不区分大写 | 3 |
不带符号 | 匹配起始于此uri的所有的uri | 4 |
\ | 用于标准url前,表示包含正则表达式并且转义字符。可以将."?等转义为符号 |
匹配越精确,优先级越高
匹配优先级从高到低: = , ^~ , ~/~*, 不带符号
重中之重
= 精确匹配
^~ 匹配开头的内容(不区分大小写)
~ 包含正则表达式(区分大小写)
~* 包含正则表达式(不区分大小写)
- 不带符号 起始于根
优先级的比较 :
###############优先级的比较#################
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
#############例题#####################
#############先找出能不能匹配,再看优先级#####################
www.baidu.com/ #####拿这个去匹配比较上面的优先级
①: The “/"request will match configuration
可以匹配A、B 可以匹配,
C 是以/documents/ 起始
D 直接不匹配
E 以.jpg等结尾,则不可以匹配
但是A的优先级高 所以选A
②: the “/index.html"request will match configuration
A:不要,他是精确匹配
B:起始于/ 所以选B
C:起始于/documents/ 所以不选
D:起始于/images 不选
E:起始于.jpg结尾 不选
③: the“/documents/document.html" request will match configuration
A:不可以,该选项是精确匹配
B:可以
C:可以,选C,C更精确
D:不行,不是基于images
E:不行,不是 .jpg结尾的
④: the“/images/l.gif" request will match configuration
A:不可以,该选项是精确匹配
B:可以
C:不可以
D:可以,所以选D,优先级高
E:可以
⑤: the“/documents/1.jpg" request will match configuration
A:不可以,该选项是精确匹配
B:可以
C:可以
D:不行,不是基于images
E:可以,选E,E的优先级高
举例
Ⅰ
局部如果没有写,按全局root来,如果局部写了,按局部来,局部优先级高
Ⅱ
###########7-1修改#########
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /shouji {
root /opt/;
}
}
[root@localhost conf.d]#mkdir /opt/shouji
[root@localhost conf.d]#echo /opt/shouji > /opt/shouji/index.html
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
##########7-2检测###############
[root@localhost ~]#curl www.lucky.com/shouji/
等于在访问www.lucky.com/opt/shouji
相当于给root做子配置
补充:
当这个里面有相同配置的文件,按照字母顺序(26字母)往下读取,第一位相同再比较第二位
1.生产案例
#直接匹配网站根会加速Nginx访问处理
location = /index.html {
......;
}
location / {
......;
}
#静态资源配置方法1
location ^~ /static/ {
......;
}
#静态资源配置方法2,应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
#多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}
^~ 匹配开头的内容(不区分大小写)
匹配以STATIC开头的不分大小写
= 精确匹配
不带符号 起始于根
起始于根,无论后面跟什么都没事
~ 包含正则表达式(区分大小写)
~* 包含正则表达式(不区分大小写)
补充一个小bug
进行修改
location 匹配优先级:=, ^~, ~/~*,/
2.不取分大小写
~* 用来对用户请求的uri做模糊匹配,uri中无论都是大写、都是小写或者大小写混合,此模式也都会匹配,通常使用此模式匹配用户request中的静态资源并继续做下一步操作,此方式使用较多注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404 ~*
~* 虽然 不区分大小写 但是系统的文件系统区分大小写
先把之前实验结果删除,这样影响实验
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location ~* /A.?\.jpg {
root /opt/image/;
}
}
3.location 优先级举例
location用途:用做动静分离
nginx善于处理静态资源
怎么知道是动态资源还是静态资源呢?
静态资源如:图片等等
[root@localhost ~]#cd /apps/nginx/conf.d/
[root@localhost conf.d]#vim /apps/nginx/conf.d/pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location = /1.jpg {
root /data/nginx/static1;
index index.html;
}
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#mkdir -p /data/nginx/static{1,2,3}
[root@localhost conf.d]#ls /data/nginx
static1 static2 static3
[root@localhost conf.d]#cd /data/nginx
[root@localhost nginx]#ls
static1 static2 static3
[root@localhost nginx]#cd static1
上传图片1.jpg
[root@localhost nginx]#cd static2
上传图片1.jpg
[root@localhost nginx]#cd static3
上传图片1.jpg
###上面名字全是1.jpg,但是是不同的图片
[root@localhost static3]#ls
C.jpg
[root@localhost static3]#nginx -s reload
去浏览器验证
查看结果,是static1 按照优先级先看到等于号匹配的图片 = 优先级最高
好戏登场了
删除static1后,查看结果,看到的是static3 匹配的图片 ~* 比 / 优先级高
[root@localhost static3]#cd /apps/nginx/conf.d
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
删除static1和3后,查看结果,看到的是static2匹配的图片
[root@localhost static3]#cd /apps/nginx/conf.d
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /1.jpg {
root /data/nginx/static2;
index index.html;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
比较 ~与~*的优先级
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location ~ \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static1;
index index.html;
}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
[root@localhost conf.d]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost conf.d]#nginx -s reload
~* 和 ~不分优先级,谁在前面就谁高
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static2;
index index.html;
}
location ~ \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
root /data/nginx/static3;
index index.html;
}
}
4.access 模块 四层控制
access作用:控制访问
如何查看模块是否默认安装
[root@localhost conf.d]#cd /opt/nginx-1.18.0/
[root@localhost nginx-1.18.0]#ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
[root@localhost nginx-1.18.0]#./configure --help|grep access
--without-http_access_module disable ngx_http_access_module
--http-log-path=PATH set http access log pathname
--without-stream_access_module disable ngx_stream_access_module
自带模块:官方提供的功能,
第三方模块:在nginx中支持echo命令
echo指令是打印一句话
--with是需要手动安装的模块;
--without是默认安装的模块
实验:拒绝真机访问
############7-1进行配置###########
[root@localhost nginx-1.18.0]#cd /apps/nginx/conf.d/
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /test {
root /data/;
deny 192.168.10.1
}
}
去真机进行验证
去虚拟机进行验证
5.验证模块 需要输入用户名和密码
模块名称:ngx_http_auth_basic_module
访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制
注意:如果能在防火墙设备控制,最好就不要在宁夏上配置,可以更好的节约资源
1.htpasswd
此命令来自于 httpd-tools 包,如果没有安装 安装一下即可
也可以安装httpd 直接yum install httpd -y 也一样
第一次生成文件
- htpasswd -c 文件路径 姓名 交互式生成密码
- htpasswd -bc 文件路径 姓名 密码 直接将密码跟在后面
- -c 代表新建用户名和密码对应的文件
- -b 将密码跟在用户名后面
htpasswd -c 文件路径 姓名 交互式生成密码
htpasswd -b 文件路径 姓名 密码 直接将密码跟在后面
[root@localhost ~]#cd /apps/nginx/conf.d/
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /admin {
auth_basic "welcome 999"; ##提示信息,不是所有的浏览器都有用
auth_basic_user_file /mnt/.nginxuser; ##密码文件存放位置
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
为社么找不到页面,那怎么办呢? 因为我们没有建这个文件夹,所以访问找不到页面404
根据配置文件建立文件夹
验证一:真机中验证
验证二:虚拟机验证
2.网页的状态页
基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /admin {
auth_basic "welcome 999"; ##提示信息,不是所有的浏览器都有用
auth_basic_user_file /mnt/.nginxuser; ##密码文件存放位置
}
location /status {
stub_status;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
去真机浏览器验证:
#状态页用于输出nginx的基本状态信息:
#输出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections:
#当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts:
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
requests:
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)
在进入配置文件
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /admin {
stub_status; ###统计目前网页状态,目前有几人在访问我
auth_basic "welcome 999"; ##提示信息,不是所有的浏览器都有用
auth_basic_user_file /mnt/.nginxuser; ##密码文件存放位置
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
验证
补充:
6.自定义错误页面
我们 可以改变 默认的错误页面,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location
格式:
error_page code ... [=[response]] uri;
页面错误代码
error_page 固定写法
code 响应码
= 可以将响应码转换
uri 访问连接
错误页面默认404报错
实验一:
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
error_page 404 /index.html;
location /status {
stub_status;
auth_basic "welcome 999";
auth_basic_user_file /mnt/.nginxuser;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#vim /data/html/index.html
Hello,this is the main page.Ha Ha
[root@localhost conf.d]#nginx -s reload
实验②自定义错误页面
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
error_page 404 /40x.html;
location = /40x.html {
root /mnt/error;
}
location /status {
stub_status;
auth_basic "welcome 999";
auth_basic_user_file /mnt/.nginxuser;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#mkdir /mnt/error
[root@localhost conf.d]#echo "You look beautiful" >/mnt/error/40x.html
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
实验三把错误码 404 指定成302
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
error_page 404 =302 /40x.html;
location = /40x.html {
root /mnt/error;
}
location /status {
stub_status;
auth_basic "welcome 999";
auth_basic_user_file /mnt/.nginxuser;
}
}
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
[root@localhost conf.d]#mkdir /mnt/error
[root@localhost conf.d]#echo "You look beautiful" >/mnt/error/40x.html
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
7.检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
语法格式:
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
实验:
[root@localhost conf.d]#vim pc.conf
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location / {
root /data;
try_files $uri $uri.html $uri/index.html /about/default.html;
}
}
[root@localhost conf.d]#cd /data
[root@localhost data]#ls
[root@localhost data]#mkdir about
[root@localhost data]#echo nihao > /data/about/default.html
[root@localhost data]#cat /data/about/default.html
nihao
[root@localhost conf.d]#nginx -t
[root@localhost conf.d]#nginx -s reload
当不存在的时候,有托底页面,显示内容
当访问的页面存在时,那就去访问这个页面,不会显示about 显示自己页面内容
8.日志位置存放
#格式
Syntax: error_log file [level];
error_log /apps/nginx/logs/kgc_error.log;
固定格式 文件路径 级别(info debug等 可以忽略不写)
为了不影响实验,先把之前拖底的删除了
实验:自定义错误日志的位置
实验:将两个网站的 日志分离
[root@localhost error]#vim /apps/nginx/conf.d/m.conf
server{
listen 80;
server_name www.m.com;
root /data/nginx/m/;
error_log /data/logs/m_error.log;
access_log /data/logs/m_access.log;
}
[root@localhost error]#vim /apps/nginx/conf.d/pc.conf
server{
listen 80;
server_name www.pc.com;
root /data/nginx/pc;
error_log /data/logs/pc_error.log;
access_log /data/logs/pc_access.log;
}
[root@localhost error]#mkdir /data/logs
[root@localhost error]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost error]#nginx -s reload
查看日志是否生效
9.长连接
http 基于 tcp 协议 先要 三次握手然后 再传输数据
相关设置:
keepalive_timeout timeout [header_timeout];
#设定保持连接超时时长,0表示禁止长连接,默认为65~75s,通常配置在http字段作为站点全局配置
keepalive_requests number;
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
可以加在全局或者 server
例子:
keepalive_requests 3;
#最大下载三个资源就会断开
keepalive_timeout 60 65; #只能有一个空格 #版本不一可能不一样时间
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文
Connection:close #浏览器收到的服务器返回的报文
#使用命令测试:telnet
对哪种浏览器禁用长连接
keepalive_disable none | browser ...;
#对哪种浏览器禁用长连接
9.作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务
配置使用
官方文档
http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
配置:
[root@localhost nginx-1.18.0]#./configure --help |grep auto
#自带
--without-http_autoindex_module disable ngx_http_autoindex_module
autoindex on | off;
#自动文件索引功能,默为off
autoindex_exact_size on | off;
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ;
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp;
#显示索引的页面文件风格,默认html
limit_rate rate;
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供 限制 变量优先级高
不管直接按 ENTER 进入,这是一个缓存文件
实验1
①文件配置
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /download {
autoindex on;
root /mnt/;
}
}
②目录添加文件
③检测
实验2 给文件内容加单位大小
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /download {
autoindex on;
autoindex_exact_size off;
root /mnt/;
}
}
去浏览器检测
其他例子:
location /download {
autoindex on;
#开启下载服务器
autoindex_exact_size on;
#开启确切大小不建议开启
autoindex_localtime on;
#使用当地时间
limit_rate 1024k;
#所有人限速1024k,默认单位是字节数
set $limit_rate 2M;
#谁先生效
alias /opt/download;
}
实验3:显示索引的页面文件风格,默认html 把它修改为 json
server{
listen 80;
server_name www.lucky.com;
root /data/html/;
location /download {
autoindex on;
autoindex_exact_size off;
autoindex_format json;
root /mnt/;
}
}
验证:
10.用户上传资料
上传需要借助开发小的程序, 并且程序 5M 和 nginx 10M 都会限制。 两者取最小
client_max_body_size 1m;
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size;
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名
上传文件大于限制 错误代码413
11.其他设置
directio size | off;
#操作完全和aio相反,aio是读取文件而directio是写文件到磁盘,启用直接I/O,默认为关闭,当文件大于等于给定大小时,例如:directio 4m;同步(直接)写磁盘,而非写缓存。
直接 写入 磁盘 还是等待一定数据量写入磁盘
open_file_cache off; #是否缓存打开过的文件信息
open_file_cache max=N [inactive=time];
#nginx可以缓存以下三种信息:
(1) 文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2) 打开的目录结构
(3) 没有找到的或者没有权限访问的文件的相关信息
max=N:#可缓存的缓存项上限数量;达到上限后会使用LRU(Least recently used,最近最少使用)算法实现管理
inactive=time:#缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于
open_file_cache_min_uses
#指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache_valid time;
#缓存项有效性的检查验证频率,默认值为60s
open_file_cache_errors on | off;
#是否缓存查找时发生错误的文件一类的信息,默认值为off
open_file_cache_min_uses number;
#open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
范例:
open_file_cache max=10000 inactive=60s;
#最大缓存10000个文件,非活动数据超时时长60s
open_file_cache_valid 60s;
#每间隔60s检查一下缓存数据有效性
open_file_cache_min_uses 5;
#60秒内至少被命中访问5次才被标记为活动数据
open_file_cache_errors on;
#缓存错误信息
limit_except method ... { ... },仅用于location
#限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.91.101;
deny all;
}
#除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用