目录
一.Web 服务基础介绍
编辑1.1 互联网发展历程回顾
1.2 Web 服务介绍
1.2.1 Apache的图标
1.2.2 NGINX的图标:
1.2.3 Apache 经典的 Web 服务端
1.2.3.1 Apache prefork 模型
1.2.3.2 Apache worker 模型
1.2.3.3 Apache event模型
1.2.4 Nginx-高性能的 Web 服务端
1.2.5 用户访问体验和性能
1.2.5.1 用户访问体验统计
1.2.5.2 影响用户体验的因素
1.2.6 服务端 I/O 流程
1.2.6.1 磁盘 I/O
1.2.6.2 网络 I/O
1.3 I/O 模型
二.Nginx 架构和安装
2.1 Nginx 概述
2.1.1 Nginx 介绍
2.1.2 Nginx 功能介绍
2.2.3 基础特性
2.2.4 Web 服务相关的功能
2.2 Nginx 架构和进程
2.2.1 Nginx 进程结构
2.2.2 Nginx 进程间通信
2.2.3 Nginx 启动和 HTTP 连接建立
2.2.4 HTTP 处理过程
2.3 Nginx 模块介绍
2.4 Nginx 安装
2.4.1 Nginx版本和安装方式
2.4.2.Nginx 编译安装
2.4.2.1 编译安装 Nginx
2.4.2.2 验证版本及编译参数
2.4.2.3使用安装完成的二进制文件nginx
2.4.2.4 Nginx 启动文件
2.6 平滑升级和回滚
2.6.2 平滑升级和回滚案例
三 Nginx 核心配置详解
3.1 配置文件说明
3.2 全局配置
3.3 http 配置块
3.4 核心配置示例
3.4.1 新建一个 PC web 站点
3.4.2 root 与 alias
3.4.3 location 的详细使用
3.4.3.1 匹配案例-精确匹配
3.4.3.2 匹配案例-区分大小写
3.4.3.3 匹配案例-不区分大小写
3.4.3.4 匹配案例-URI开始
3.4.3.5 匹配案例-文件名后缀
3.4.3.6 匹配案例-优先级
3.4.3.7 生产使用案例
3.4.4 Nginx 账户认证功能
编辑3.4.5 自定义错误页面
3.4.6 自定义错误日志
3.4.7 检测文件是否存在
3.4.8 长连接配置
3.4.9 作为下载服务器配置
四 Nginx 高级配置
一.Web 服务基础介绍
正常情况下的单次web服务访问流程:
1.1 互联网发展历程回顾
- 1993年3月2日,中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通,成为我国连入Internet的第一根专线。
- 1995年马云开始创业并推出了一个web网站 中国黄页
- 1999年创建阿里巴巴www.alibabagroup.com
- 2003年5月10日创立淘宝网
- 2004年12月,马云创立第三方网上支付平台支付宝(蚂蚁金服旗下,共有蚂蚁金服支付宝、余额宝、招财宝、蚂蚁聚宝、网商银行、蚂蚁花呗、芝麻信用等子业务板块)
- 2009年开始举办双十一购物狂欢节,以下是历年交易成交额:
2009 年双十一: 5000 万元2010 年双十一: 9.36 亿元2011 年双十一: 33.6 亿元2012 年双十一: 191 亿元2013 年双十一: 350 亿元2014 年双十一: 571 亿元2015 年双十一: 912.17 亿元2016 年双十一: 1207 亿元2017 年双十一: 1682.69 亿元2018 年双十一: 2135 亿元2019 年双十一: 2684 亿元2020 年双十一: 4982 亿元2021 年双十一: 5403 亿元2022 年双十一: 5571 亿元
- 2012年1月11日淘宝商城正式更名为“天猫”
- 2014年9月19日里巴巴集团于纽约证券交易所正式挂牌上市
1.2 Web 服务介绍
1.2.1 Apache的图标
1.2.2 NGINX的图标:
1.2.3 Apache 经典的 Web 服务端
- Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发
- 目前经历了两大版本分别是1.X和2.X
- 其可以通过编译安装实现特定的功能
1.2.3.1 Apache prefork 模型
- 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
- 每个子进程有一个独立的线程响应用户请求
- 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
- 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定缺点:每个用户请求需要对应开启一个进程 , 占用资源较多,并发性差 , 不适用于高并发场景
1.2.3.2 Apache worker 模型
- 一种多进程和多线程混合的模型
- 有一个控制进程,启动多个子进程
- 每个子进程里面包含固定的线程
- 使用线程程来处理请求
- 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
- 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比 prefork 占用的内存较少,可以同时处理更多的请求缺点:使用 keepalive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用 (该问题在prefork模式下,同样会发生)
1.2.3.3 Apache event模型
Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll)每个进程响应多个请求,在现在版本里的已经是稳定可用的模式它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题(某些线程因为被 keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时) event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理 keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放缺点:没有线程安全控制
1.2.4 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.2万人民币官网地址 www.nginx.orgNginx 历经十几年的迭代更新( https://nginx.org/en/CHANGES ), 目前功能已经非常完善且运行稳定,另外Nginx 的版本分为开发版、稳定版和过期版, nginx 以功能丰富著称,它即可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器能够快速的响应静态网页的请求支持 FastCGI/SSL/Virtual Host/URL Rwrite /Gzip / HTTP Basic Auth/http 或者 TCP 的负载均衡 (1.9 版本以上且开启stream 模块 ) 等功能,并且支持第三方的功能扩展。天猫 淘宝 京东 小米 163 新浪等一线互联网公司都在用Nginx或者进行二次开发基于Nginx的工作场景:
1.2.5 用户访问体验和性能
1.2.5.1 用户访问体验统计
互联网存在用户速度体验的 1-3-10 原则,即 1 秒最优, 1-3 秒较优, 3~10 秒比较慢, 10 秒以上用户无法接受。用户放弃一个产品的代价很低,只是换一个URL 而已。
- 全球最大搜索引擎 Google:慢500ms = 20% 将放弃访问。
- 全球最大的电商零售网站亚马逊:慢100ms = 1% 将放弃交易
- 有很多研究都表明,性能对用户的行为有很大的影响:
- 79%的用户表示不太可能再次打开一个缓慢的网站
- 47%的用户期望网页能在2秒钟以内加载
- 40%的用户表示如果加载时间超过三秒钟,就会放弃这个网站
- 页面加载时间延迟一秒可能导致转换损失7%,页面浏览量减少11%
- 8秒定律:用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过30%的用户放弃等待
1.2.5.2 影响用户体验的因素
据说马云在刚开始创业在给客户演示时,打开一个网站花了不到四个小时。影响用户体验的因素1. 客户端
- 客户端硬件配置
- 客户端网络速率
- 客户端与服务端距离
2. 服务器
- 服务端网络速率
- 服务端硬件配置
- 服务端架构设计
- 服务端应用程序工作模式
- 服务端并发数量服务端响应文件大小及数量 buffer cache
- 服务端I/O压力1.2.4 服务端 I/O 流程
1.2.6 服务端 I/O 流程
I/O 在计算机中指 Input/Output , IOPS (Input/Output Per Second) 即每秒的输入输出量 ( 或读写次数 ), 是衡量磁盘性能的主要指标之一。IOPS 是指单位时间内系统能处理的 I/O 请求数量,一般以每秒处理的I/O请求数量为单位, I/O 请求通常为读或写数据操作请求。一次完整的 I/O 是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy 到用户空间的进程内存当中,所以简单说 I/O 就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。服务器的 I/O
- 磁盘I/O
- 网络I/O : 一切皆文件,本质为对socket文件的读写
1.2.6.1 磁盘 I/O
机械磁盘的寻道时间、旋转延迟和数据传输时间:寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则 I/O 处理就越快,目前磁盘的寻道时间一般在3-15 毫秒左右。旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘旋转一周所需要时间的1/2 之一表示,比如 7200 转的磁盘平均训传延迟大约为60*1000/7200/2=4.17 毫秒,公式的意思为 (每分钟 60 秒 *1000 毫秒每秒 /7200 转每分 /2 ),如果是15000 转的则为 60*1000/15000/2=2 毫秒。数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB ,因此可以忽略不计。常见的机械磁盘平均寻道时间值:7200 转 / 分的磁盘平均物理寻道时间: 9 毫秒10000 转 / 分的磁盘平均物理寻道时间: 6 毫秒15000 转 / 分的磁盘平均物理寻道时间: 4 毫秒常见磁盘的平均延迟时间:7200 转的机械盘平均延迟: 60*1000/7200/2 = 4.17ms10000 转的机械盘平均延迟: 60*1000/10000/2 = 3ms15000 转的机械盘平均延迟: 60*1000/15000/2 = 2ms每秒最大 IOPS 的计算方法:7200 转的磁盘 IOPS 计算方式: 1000 毫秒 /(9 毫秒的寻道时间 +4.17 毫秒的平均旋转延迟时间 )=1000/13.13=75.9 IOPS10000 转的磁盘的 IOPS 计算方式: 1000 毫秒 /(6 毫秒的寻道时间 +3 毫秒的平均旋转延迟时间 )=1000/9=111IOPS15000 转的磁盘的 IOPS 计算方式: 15000 毫秒 /(4 毫秒的寻道时间 +2 毫秒的平均旋转延迟时间 )=1000/6=166.6 IOPS
1.2.6.2 网络 I/O
网络 I/O 处理过程
- 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
- 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
- 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)
不论磁盘和网络 I/O每次 I/O ,都要经由两个阶段:
- 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
- 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
1.3 I/O 模型
在这里就不过多介绍,如果想要了解可以查看http://t.csdnimg.cn/NR5LT
二.Nginx 架构和安装
2.1 Nginx 概述
2.1.1 Nginx 介绍
Nginx : engine X , 2002 年开发,分为社区版和商业版 (nginx plus )2019 年 3 月 11 日 F5 Networks 6.7 亿美元的价格收购Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及 TCP/UDP 代理服务器解决 C10K 问题( 10K Connections )Nginx 官网: http://nginx.orgnginx 的其它的二次发行版:
- Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目官网: http://tengine.taobao.org/
- OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openresty.org/cn/
2.1.2 Nginx 功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
2.2.3 基础特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
2.2.4 Web 服务相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高其性能)url rewirte
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
2.2 Nginx 架构和进程
2.2.1 Nginx 进程结构
web 请求处理机制
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx 是多进程组织模型,而且是一个由 Master 主进程和 Worker 工作进程组成。
主进程 (master process) 的功能:
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
工作进程( worker process )的功能:
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争
- CPU资源,
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
2.2.2 Nginx 进程间通信
worker 进程之间的通信原理基本上和主进程与 worker 进程之间的通信是一样的,只要 worker 进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker 进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息, 就只能通过主进程来实现。为了实现 worker 进程之间的交互, master 进程在生成 worker 进程之后,在 worker 进程表中进行遍历,将该新进程的PID 以及针对该进程建立的管道句柄传递给 worker 进程中的其他进程,为 worker 进程之间的通信做准备,当worker 进程 1 向 worker 进程 2 发送指令的时候,首先在 master 进程给它的其他 worker 进程工作信息中找到2 的进程 PID ,然后将正确的指令写入指向进程 2 的管道, worker 进程 2 捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了worker 进程之间的通信。另 worker 进程可以通过共享内存来通讯的,比如 upstream 中的 zone ,或者 limit_req 、 limit_conn 中的zone等。操作系统提供了共享内存机制
2.2.3 Nginx 启动和 HTTP 连接建立
- Nginx 启动时,Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master 进程,fork 出多个 Worker 进程
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
2.2.4 HTTP 处理过程
2.3 Nginx 模块介绍
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
- 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
模块分类:
核心模块: core module标准模块:HTTP 模块: ngx_http_*HTTP Core modules #默认功能HTTP Optional modules #需编译时指定Mail 模块 : ngx_mail_*Stream 模块 ngx_stream_*第三方模块
2.4 Nginx 安装
2.4.1 Nginx版本和安装方式
Nginx 版本
- Mainline version 主要开发版本,一般为奇数版本号,比如1.19
- Stable version 当前最新稳定版,一般为偶数版本,如:1.20
- Legacy versions 旧的稳定版,一般为偶数版本,如:1.18
Nginx 安装可以使用 yum 或源码安装,但是推荐使用源码编译安装
- yum的版本比较旧
- 编译安装可以更方便自定义相关路径
- 使用源码编译可以自定义相关功能,更方便业务的上的使用
2.4.2.Nginx 编译安装
源码安装需要提前准备标准的编译器, GCC 的全称是( GNU Compiler collection ),其有 GNU 开发,并以GPL即 LGPL 许可,是自由的类 UNIX 即苹果电脑 Mac OS X 操作系统的标准编译器,因为 GCC 原本只能处理 C 语言,所以原名为GNU C 语言编译器,后来得到快速发展,可以处理 C++,Fortran , pascal , objective C, java以及 Ada 等其他语言,此外还需要 Automake 工具,以完成自动创建 Makefile 的工作, Nginx 的一些模块需要依赖第三方库,比如: pcre (支持 rewrite ), zlib (支持 gzip 模块)和 openssl (支持 ssl 模块)等。
2.4.2.1 编译安装 Nginx
https://nginx.org/en/download.html
编译安装示例:
[root@nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y #下载
[root@nginx ~]# useradd -s /sbin/nologin -M nginx #添加一个不能登录的nginx用户[root@nginx ~]# tar zxf nginx-1.24.0.tar.gz
nginx-1.24.0 #解压目录
nginx-1.24.0.tar.gz #gzip压缩包
[root@nginx ~]# cd nginx-1.24.0/
[root@nginx nginx-1.24.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
[root@nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \--user=nginx \ # 指定nginx运行用户--group=nginx \ # 指定nginx运行组--with-http_ssl_module \ # 支持https://--with-http_v2_module \ # 支持http版本 2--with-http_realip_module \ # 支持ip 透传--with-http_stub_status_module \ # 支持状态页面--with-http_gzip_static_module \ # 支持压缩--with-pcre \ # 支持正则--with-stream \ # 支持tcp反向代理--with-stream_ssl_module \ # 支持tcp的 ssl 加密--with-stream_realip_module # 支持tcp 的透传 ip[root@nginx nginx-1.24.0]# make && make install
nginx完成安装以后,有四个主要的目录
[root@nginx nginx-1.24.0]# ls /usr/local/nginx/
conf html logs sbinconf :保存 nginx 所有的配置文件,其中 nginx.conf 是 nginx 服务器的最核心最主要的配置文件,其他的.conf 则是用来配置 nginx 相关的功能的,例如 fastcgi 功能使用的是 fastcgi.conf 和 fastcgi_params两个文件,配置文件一般都有一个样板配置文件,是以.default 为后缀,使用时可将其复制并将 default 后缀去掉即可。html 目录中保存了 nginx 服务器的 web 文件,但是可以更改为其他目录保存 web 文件 , 另外还有一个 50x 的 web文件是默认的错误页面提示页面。logs :用来保存 nginx 服务器的访问日志错误日志等日志, logs 目录可以放在其他路径,比如 /var/logs/nginx 里面。sbin :保存 nginx 二进制启动脚本,可以接受不同的参数以实现不同的功能。
2.4.2.2 验证版本及编译参数
[root@nginx vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@nginx ~]# source ~/.bash_profile
[root@nginx ~]#
[root@nginx ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
built with OpenSSL 3.0.1 14 Dec 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/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-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
2.4.2.3使用安装完成的二进制文件nginx
[root@nginx ~]# nginx -?
nginx version: nginx/1.24.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-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
# 发送信号,reload 信号 会生成新的 worker, 但 master 不会重新生成-p prefix : set prefix path (default: /usr/local/nginx/) #指定Nginx 目录
-e filename : set error log file (default: logs/error.log) #错误日志文件
-c filename : set configuration file (default: conf/nginx.conf) # 配置文件路径-g directives : set global directives out of configuration file
# 设置全局指令 , 注意和配置文件不要同时配置, 否则冲突
nginx命令应用示例:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1; 注释这行之后在执行nginx -g "worker_processes 6;"命令
#没注释前
[root@nginx ~]# nginx -g "worker_processes 6;"
nginx: [emerg] "worker_processes" directive is duplicate in /usr/local/nginx/conf/nginx.conf:3#注释后
[root@nginx ~]# nginx -g "worker_processes 6;"
[root@nginx ~]#
[root@nginx ~]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37493 0.0 0.0 9836 932 ? Ss 16:41 0:00 nginx: master process nginx -g worker_processes 6;
nginx 37494 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
nginx 37495 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
nginx 37496 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
nginx 37497 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
nginx 37498 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
nginx 37499 0.0 0.1 13724 4856 ? S 16:41 0:00 nginx: worker process
root 37505 0.0 0.0 221796 2328 pts/0 S+ 16:43 0:00 grep --color=auto nginx[root@nginx ~]# netstat -atulnp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 37493/nginx: master[root@nginx ~]# nginx -s quit
[root@nginx ~]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37529 0.0 0.0 221796 2252 pts/0 S+ 16:49 0:00 grep --color=auto nginx
#前台运行[root@nginx ~]# nginx -g "daemon off;"
2.4.2.4 Nginx 启动文件
[root@nginx ~]# vim /lib/systemd/system/nginx.service
[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
[root@nginx ~]# systemctl daemon-reload[root@nginx ~]# systemctl restart nginx.service
[root@nginx ~]#
2.6 平滑升级和回滚
有时候我们需要对 Nginx 版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
2.6.1 平滑升级流程
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
2.6.2 平滑升级和回滚案例
[root@nginx ~]# tar zxf nginx-1.26.1.tar.gz
[root@nginx ~]# lsnginx-1.26.1
nginx-1.26.1.tar.gz[root@nginx ~]# cd nginx-1.26.1/
# 开始编译新版本[root@nginx nginx-1.26.1]# ./configure --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
[root@nginx nginx-1.26.1]# make
# 查看两个版本[root@nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 5753736 Aug 20 17:13 objs/nginx
-rwxr-xr-x 1 root root 5679504 Aug 20 16:23 /usr/local/nginx/sbin/nginx
# 把之前的旧版的 nginx 命令备份[root@nginx sbin]# cd /usr/local/nginx/sbin/
[root@nginx sbin]# cp nginx nginx2.4# 把新版本的 nginx 命令复制过去[root@nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/# 检测一下有没有问题[root@nginx sbin]# nginx -t #刚开始可能没有,但直接点y就行
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx sbin]# kill -USR2 37820 #nginx worker ID#USR2 平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的nginx# 此时两个 master 的进程都在运行 , 只是旧的 master 不在监听 , 由新的 master 监听 80# 此时 Nginx 开启一个新的 master 进程,这个 master 进程会生成新的 worker 进程,这就是升级后的 Nginx 进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。[root@nginx sbin]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37820 0.0 0.0 9836 2672 ? Ss 16:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 37821 0.0 0.1 13724 4832 ? S 16:58 0:00 nginx: worker process
root 41021 0.0 0.1 9840 5956 ? S 17:22 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 41022 0.0 0.1 13728 4616 ? S 17:22 0:00 nginx: worker process
root 41024 0.0 0.0 221796 2244 pts/1 S+ 17:23 0:00 grep --color=auto nginx[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.24.0 ## 依旧是旧版本生生效
Date: Tue, 20 Aug 2024 09:25:25 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes# 回收旧版本[root@nginx sbin]# kill -WINCH 37820
[root@nginx sbin]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37820 0.0 0.0 9836 2672 ? Ss 16:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 41021 0.0 0.1 9840 5956 ? S 17:22 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 41022 0.0 0.1 13728 4616 ? S 17:22 0:00 nginx: worker process
root 41028 0.0 0.0 221796 2264 pts/1 S+ 17:26 0:00 grep --color=auto nginx# 检测版本信息[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.26.1 #新版本生效
Date: Tue, 20 Aug 2024 09:28:40 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes# 回滚# 如果升级的版本发现问题需要回滚 , 可以重新拉起旧版本的 worker[root@nginx sbin]# cp nginx nginx.26
[root@nginx sbin]# ls
nginx nginx2.4 nginx.26
[root@nginx sbin]# mv nginx2.4 nginx
mv: overwrite 'nginx'? y
[root@nginx sbin]#[root@nginx sbin]# kill -HUP 37820
[root@nginx sbin]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37820 0.0 0.0 9836 2672 ? Ss 16:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 41021 0.0 0.1 9840 5956 ? S 17:22 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 41022 0.0 0.1 13728 4616 ? S 17:22 0:00 nginx: worker process
nginx 41045 0.0 0.1 13724 4836 ? S 17:32 0:00 nginx: worker process
root 41047 0.0 0.0 221796 2312 pts/1 S+ 17:32 0:00 grep --color=auto nginx
[root@nginx sbin]# kill -WINCH 41021
[root@nginx sbin]# ps -aux | grep nginx
avahi 869 0.0 0.1 15516 6240 ? Ss 14:41 0:00 avahi-daemon: running [nginx.local]
root 37820 0.0 0.0 9836 2672 ? Ss 16:58 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 41021 0.0 0.1 9840 5956 ? S 17:22 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 41045 0.0 0.1 13724 4836 ? S 17:32 0:00 nginx: worker process
root 41050 0.0 0.0 221796 2308 pts/1 S+ 17:33 0:00 grep --color=auto nginx[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.24.0 #版本回滚完成
Date: Tue, 20 Aug 2024 09:34:53 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes
三 Nginx 核心配置详解
3.1 配置文件说明
- 主配置文件:nginx.conf
- 子配置文件: include conf.d/*.conf
- fastcgi, uwsgi,scgi 等协议相关的配置文件
- mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮
- 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某
- 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动
- 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
nginx 配置文件格式说明
配置文件由指令与指令块构成每条指令以 ; 分号结尾,指令与值之间以空格符号分隔可以将多条指令放在同一行 , 用分号分隔即可 , 但可读性差 , 不推荐指令块以 { } 大括号将多条指令组织在一起 , 且可以嵌套指令块include 语句允许组合多个配置文件以提升可维护性使用 # 符号添加注释,提高可读性使用 $ 符号使用变量部分指令的参数支持正则表达式
Nginx 主配置文件的配置指令方式:
directive value [value2 ...];注意(1) 指令必须以分号结尾(2) 支持使用配置变量内建变量:由 Nginx 模块引入,可直接引用自定义变量:由用户使用 set 命令定义 , 格式 : set variable_name value;引用变量: $variable_name
主配置文件结构:四部分
main block :主配置段,即全局配置段,对 http,mail 都有效# 事件驱动相关的配置event {...}#http/https 协议相关配置段http {...}# 默认配置文件不包括下面两个块#mail 协议相关配置段mail {...}#stream 服务器相关配置段stream {...}
默认的nginx.conf 配置文件格式说明
# 全局配置端,对全局生效,主要设置 nginx 的启动用户 / 组,启动的工作进程数量,工作模式, Nginx 的 PID 路径,日志路径等。user nginx nginx;worker_processes 1; #启动工作进程数数量events { #events #设置快,主要影响 nginx 服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型# 处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。worker_connections 1024; #设置单个 nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为 #worker_connections *worker_processes ,作为反向代理的时候为#(worker_connections * worker_processes)/2}http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都 #可以在这设置,http 块可以包含多个 server 块,而一个 server 块中又可以包含多个 location 块,#server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和 #单个链接的请求上限等。include mime.types;default_type application/octet-stream;sendfile on; #作为 web 服务器的时候打开 sendfile 加快静态文件传输,指定是否使用#sendfile系统调用来传输文件#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作)#从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,# 硬盘 >> kernel buffer ( 快速拷贝到 kernelsocketbuffer) >> 协议栈。keepalive_timeout 65; #长连接超时时间,单位是秒server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个 location 模块#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口比如都使用 #80端口提供web服务listen 80; #配置server监听的端口server_name localhost; #本server 的名称,当访问此名称的时候 nginx 会调用当前 serevr内部的配置进程匹配。location / { #location其实是server的一个指令,为 nginx 服务器提供比较多而且灵活的指令#都是在location中体现的,主要是基于nginx接受到的请求字符串#对用户请求的UIL进行匹配,并对特定的指令进行处理#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现#另外很多第三方模块的配置也是在location模块中配置。root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。index index.html index.htm; #默认的页面文件名称}error_page 500 502 503 504 /50x.html; #错误页面的文件名称location = /50x.html { #location处理对应的不同错误码的页面定义到 /50x.html#这个跟对应其server中定义的目录下。root html; #定义默认页面所在的目录}}# 和邮件相关的配置#mail {# ...# } mail 协议相关配置段#tcp 代理配置, 1.9 版本以上支持#stream {# ...# } stream 服务器相关配置段# 导入其他路径的配置文件#include /apps/nginx/conf.d/*.conf}
3.2 全局配置
Main 全局配置段常见的配置指令分类
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
全局配置说明:
user nginx nginx; #启动Nginx 工作进程的用户和组worker_processes [number | auto]; # 启动 Nginx 工作进程的数量 , 一般设为和 CPU 核心数相同worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;# 将 Nginx 工作进程绑定到指定的 CPU 核心,默认 Nginx 是不进行进程绑定的,绑定并不是意味着当前 nginx 进程独占以一核心CPU ,但是可以保证此进程不运行在其他核心上,这就极大减少了 nginx 的工作进程在不同的cpu核心上的来回跳转,减少了 CPU 对进程的资源分配与回收以及内存管理等,因此可以有效的提升 nginx 服务器的性能。CPU MASK: 00000001 : 0 号 CPU00000010 : 1 号 CPU10000000 : 7 号 CPU# 示例worker_cpu_affinity 0001 0010 0100 1000; 第 0 号 --- 第 3 号 CPUworker_cpu_affinity 0101 1010;# 示例[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confworker_processes 4;worker_cpu_affinity 00000010 00001000 00100000 10000000;[root@nginx ~]# systemctl restart nginx.service
[root@nginx ~]#
[root@nginx ~]# ps axo pid,cmd,psr | grep nginx
41119 nginx: master process /usr/ 0
41121 nginx: worker process 0
41122 nginx: worker process 0
41123 nginx: worker process 0
41124 nginx: worker process 0
41130 grep --color=auto nginx 0# 错误日志记录配置,语法: error_log file [debug | info | notice | warn | error | crit| alert | emerg]#error_log logs/error.log;#error_log logs/error.log notice;error_log /usr/local/nginx/logs/error.log error;#pid 文件保存路径pid /usr/local/nginx/logs/nginx.pid;worker_priority 0; #工作进程优先级, -20~20(19)worker_rlimit_nofile 65536; #所有 worker 进程能打开的文件数量上限 ,#包括:Nginx的所有连接(例如与代理服务器的连接等)#而不仅仅是与客户端的连接#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制#最好与ulimit -n 或者limits.conf的值保持一致,# 修改 pam 限制[root@nginx ~]# sudo -u nginx ulimit -n
1024[root@nginx ~]# vim /etc/security/limits.conf<domain> <type> <item> <value>* - nofile 100000
[root@nginx ~]# sudo -u nginx ulimit -n
100000daemon off; # 前台运行 Nginx 服务用于测试、 docker 等环境。master_process off|on; # 是否开启 Nginx 的 master-worker 工作模式,仅用于开发调试场景 , 默认为onevents {worker_connections 65535; #设置单个工作进程的最大并发连接数use epoll; #使用epoll事件驱动,#Nginx支持众多的事件驱动,#比如:select、poll、epoll,只能设置在events 模块中设置accept_mutex on; #on为同一时刻一个请求轮流由work进程处理 ,#而防止被同时唤醒所有worker#避免多个睡眠进程被唤醒的设置,默认为off#新请求会唤醒所有worker进程,此过程也称为"惊群"#因此nginx刚安装完以后要进行适当的优化。建议设置为onmulti_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接#此指令默认为off,#即默认为一个工作进程只能一次接受一个新的网络连接#打开后几个同接受多个。建议设置为on}
示例: 实现 nginx 的高并发配置
[root@nginx ~]# ulimit -n 102400
[root@nginx ~]# ab -c 5000 -n 10000 http://192.168.10.140/apr_socket_recv: Connection refused (111)
# 默认配置不支持高并发 , 会出现以下错误日志[root@nginx ~]# tail /usr/local/nginx/logs/error.log
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: still could not bind()
2024/08/20 16:58:32 [alert] 37593#0: unlink() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
2024/08/20 17:22:28 [notice] 41021#0: using inherited sockets from "6;"
2024/08/20 17:49:19 [alert] 41123#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41122#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41124#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41121#0: sched_setaffinity() failed (22: Invalid argument)# 修改配置[root@nginx ~]# vim /etc/security/limits.conf* - nproc 100000[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confworker_rlimit_nofile 100000;[root@nginx ~]# systemctl restart nginx.service
[root@nginx ~]##测试[root@nginx ~]# ab -c 5000 -n 10000 http://192.168.10.140/This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.10.140 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.24.0
Server Hostname: 192.168.10.140
Server Port: 80Document Path: /
Document Length: 615 bytesConcurrency Level: 5000
Time taken for tests: 0.636 seconds
Complete requests: 10000
Failed requests: 2688
(Connect: 0, Receive: 0, Length: 1344, Exceptions: 1344)
Total transferred: 7340288 bytes
HTML transferred: 5323440 bytes
Requests per second: 15731.04 [#/sec] (mean)
Time per request: 317.843 [ms] (mean)
Time per request: 0.064 [ms] (mean, across all concurrent requests)
Transfer rate: 11276.40 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 87 17.3 84 130
Processing: 26 132 50.3 128 232
Waiting: 0 93 57.1 90 195
Total: 93 219 63.1 231 335Percentage of the requests served within a certain time (ms)
50% 231
66% 260
75% 270
80% 277
90% 301
95% 325
98% 329
99% 331
100% 335 (longest request)
3.3 http 配置块
# 在响应报文中将指定的文件扩展名映射至 MIME 对应的类型include /etc/nginx/mime.types;default_type application/octet-stream; # 除 mime.types 中的类型外# 指定其它文件的默认 MIME 类型,浏览器一般会提示下载types {text/html html;image/gif gif;image/jpeg jpg;}
[root@nginx ~]# vim /usr/local/nginx/html/lee.php
<?php
phpinfo();
?>
[root@nginx ~]# curl -I 192.168.10.140/lee.php
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 11:37:16 GMT
Content-Type: application/octet-stream
Content-Length: 21
Last-Modified: Tue, 20 Aug 2024 11:36:57 GMT
Connection: keep-alive
ETag: "66c47fd9-15"
Accept-Ranges: bytes
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confdefault_type text/html;#如果是编译安装没有配置nginx启动文件ps -aux | grep nginxecho 41892 > /run/nginx.pid[root@nginx ~]# nginx -s reload
[root@nginx ~]##配置nginx启动文件[root@nginx ~]# systemctl restart nginx.service
[root@nginx ~]#
[root@nginx ~]# curl -I 192.168.10.140/lee.php
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 11:41:29 GMT
Content-Type: text/html
Content-Length: 21
Last-Modified: Tue, 20 Aug 2024 11:36:57 GMT
Connection: keep-alive
ETag: "66c47fd9-15"
Accept-Ranges: bytes
3.4 核心配置示例
基于不同的 IP 、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module 实现。
3.4.1 新建一个 PC web 站点
# 定义子配置文件路径[root@nginx ~]# mkdir /usr/local/nginx/conf.d/[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confhttp {......include "/usr/local/nginx/conf.d/*.conf"; #在配置文件的最后面添加此行#注意不要放在最前面,会导致前面的命令无法生效}# 创建虚拟主机网站配置[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
}[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/html[root@nginx ~]# echo server-192.168.10.140 > /webdata/nginx/timinglee.org/lee/html/index.html[root@nginx ~]# nginx -s reload
[root@nginx ~]##访问测试[root@nginx ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.140 nginx.com lee.timinglee.org
[root@nginx ~]# curl lee.timinglee.org # 注意在访问主机中设解析
server-192.168.10.140#如果需要在浏览器访问的话,需要在本地主机C:\Windows\System32\drivers\etc\hosts中添加你的虚拟机的IP和配置文件中写的主机名
3.4.2 root 与 alias
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo { # 必须建立 /mnt/oppo 才能访问
root /mnt;
}
}[root@nginx ~]# mkdir /mnt/oppo
[root@nginx ~]# echo xixi123 > /mnt/oppo/index.html
[root@nginx ~]# nginx -s reload
[root@nginx ~]## 重启 Nginx 并访问测试[root@nginx sbin]# curl lee.timinglee.org/oppo/
xixi123#浏览器访问
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {#注意about后不要加/#使用alias的时候uri后面如果加了斜杠, 则下面的路径配置必须加斜杠,否则 403alias /mnt/oppo;#当访问alias的时候,会显示alias定义的/mnt/dirtest里面的内容
}
}[root@nginx ~]# nginx -s reload
[root@nginx ~]## 重启 Nginx 并访问测试[root@nginx sbin]# curl lee.timinglee.org/haha/
xixi123#在浏览器上访问
location中使用root指令和alias指令的意义不同
root #给定的路径对应于 location 中的 /uri 左侧的 /alias #给定的路径对应于 location 中的 /uri 的完整路径
3.4.3 location 的详细使用
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
- ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
- 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
- uri是用户请求的字符串,即域名后面的web文件路径
- 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理
- 此请求。
# 语法规则:location [ = | ~ | ~* | ^~ ] uri { ... }= #只能精确指定文件,用于标准uri 前,需要请求字串与 uri 精确匹配,大小敏感 , 如果匹配成功就停止向下匹配并立即处理请求^~ #用于标准 uri 前,表示包含正则表达式 , 并且匹配以指定的正则表达式开头#对uri 的最左边部分做匹配检查,不区分字符大小写~ #用于标准 uri 前,表示包含正则表达式 , 并且区分大小写~* #用于标准uri前,表示包含正则表达式 , 并且不区分大写不带符号 # 匹配起始于此 uri 的所有的 uri\ #用于标准uri 前,表示包含正则表达式并且转义字符。可以将 . * ? 等转义为普通符号# 匹配优先级从高到低:#对目录匹配:(~* = ~) >不带符号 > ^~ > = #=不能指定目录所以排在最后#对文件匹配:= > (~* = ~) > 不带符号 > ^~
3.4.3.1 匹配案例-精确匹配
1.精确匹配 logo
[root@nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/images -p
[root@nginx ~]# cd /webdata/nginx/timinglee.org/lee/images
[root@nginx images]# ls
logo.png
[root@nginx ~]# ll /webdata/nginx/timinglee.org/lee/images -Zd
drwxr-xr-x 2 root root ? 6 Aug 20 20:41 /webdata/nginx/timinglee.org/lee/images[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {
alias /mnt/oppo;
}
location = /logo.png {
root /webdata/nginx/timinglee.org/lee/images;
}
}# 上传 logo.jpg 图片到 /webdata/nginx/timinglee.org/lee/images ,重启 Nginx 并访问测试# 访问测试: http://lee.timinglee.org/logo.png
3.4.3.2 匹配案例-区分大小写
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {
alias /mnt/oppo;
}
#location = /logo.png {
# root /webdata/nginx/timinglee.org/lee/images;
#}
location ~ /logo.PNG {
root /webdata/nginx/timinglee.org/lee/images;
}
}# 重启 Nginx 并访问测试#http://lee.timinglee.org/logo.PNG # 访问失败,系统中没有 logo.PNG 文件[root@nginx ~]# nginx -s reload
[root@nginx ~]#
3.4.3.3 匹配案例-不区分大小写
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {
alias /mnt/oppo;
}
#location = /logo.png {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ~ /logo.PNG {
# root /webdata/nginx/timinglee.org/lee/images;
#}
location ~* /logo.PNG {
root /webdata/nginx/timinglee.org/lee/images;
}
}# 重启 Nginx 并访问测试#http://lee.timinglee.org/logo.png[root@nginx ~]# nginx -s reload
[root@nginx ~]#
3.4.3.4 匹配案例-URI开始
[root@nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/images/images{1,2}
[root@nginx ~]# echo image1 > /webdata/nginx/timinglee.org/lee/images/images1/index.html
[root@nginx ~]# echo image1 > /webdata/nginx/timinglee.org/lee/images/images2/index.html[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {
alias /mnt/oppo;
}
#location = /logo.png {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ~ /logo.PNG {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ~* /logo.PNG {
# root /webdata/nginx/timinglee.org/lee/images;
#}
location ^~ /images {
root /webdata/nginx/timinglee.org/lee/images;
index index.html;
}
location /images1 {
root /webdata/nginx/timinglee.org/lee/images;
}}
#重启Nginx并访问测试,实现效果是访问/images1和/images2返回内容一样[root@nginx ~]# nginx -s reload
[root@nginx ~]#
[root@nginx ~]# curl lee.timinglee.org/images1/
image1
[root@nginx ~]# curl lee.timinglee.org/images2/
image1
3.4.3.5 匹配案例-文件名后缀
[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/images
#上传一个图片到/webdata/nginx/timinglee.org/lee/imagesserver {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /oppo {
root /mnt;
}
location /haha {
alias /mnt/oppo;
}
#location = /logo.png {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ~ /logo.PNG {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ~* /logo.PNG {
# root /webdata/nginx/timinglee.org/lee/images;
#}
#location ^~ /images {
# root /webdata/nginx/timinglee.org/lee/images;
# index index.html;
#}
#location /images1 {
# root /webdata/nginx/timinglee.org/lee/images;
#}
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /webdata/nginx/timinglee.org/lee/images;
index index.html;
}}
# 重启 Nginx 并访问测试[root@nginx ~]# nginx -s reload
[root@nginx ~]#
3.4.3.6 匹配案例-优先级
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}location = /logo.png {
root /webdata/nginx/timinglee.org/lee/images;
}location ^~ /images {
root /webdata/nginx/timinglee.org/lee/images;
index index.html;
}location /images1 {
root /webdata/nginx/timinglee.org/lee/images;location ~ /logo.PNG {
root /webdata/nginx/timinglee.org/lee/images;
}location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
root /webdata/nginx/timinglee.org/lee/images;
index index.html;
}
}
# 匹配优先级从高到低:#对目录匹配:(~* = ~) >不带符号 > ^~ > = #=不能指定目录所以排在最后#对文件匹配:= > (~* = ~) > 不带符号 > ^~
3.4.3.7 生产使用案例
# 直接匹配网站根会加速 Nginx 访问处理location = /index.html {......;}location / {......;}# 静态资源配置方法 1location ^~ /static/ {......;}# 静态资源配置方法 2, 应用较多location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {......;}# 多应用配置location ~* /app1 {......;}location ~* /app2 {......;}
3.4.4 Nginx 账户认证功能
[root@nginx ~]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin lee #-b 表示非交互建立用户认证
Adding password for user admin
[root@nginx ~]# htpasswd -mb /usr/local/nginx/conf/.htpasswd lee lee
Adding password for user lee
[root@nginx ~]# cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$KUThZ23.$eiK/WqTnyIKgICXC2ku8l0
lee:$apr1$RwbP9nz.$S0FMCUvrAYFJNF8p20z2S.
[root@nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/login
[root@nginx ~]# echo login > /webdata/nginx/timinglee.org/lee/login/index.html
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timinglee.org;location /login {
root /webdata/nginx/timinglee.org/lee;
index index.html;
auth_basic "login password";
auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
}
}
#重启Nginx并访问测试[root@nginx ~]# nginx -s reload
[root@nginx ~]#[root@nginx images]# curl www.timinglee.org/login/ -u lee:lee
login
[root@nginx images]# curl www.timinglee.org/login/ -u admin:leelogin
#在浏览器上访问
3.4.5 自定义错误页面
error_page code ... [=[response]] uri;
示例:
listen 80;server_name www.timinglee.org;error_page 500 502 503 504 /error.html;location = /error.html {root /data/nginx/html;}# 重启 nginx 并访问不存在的页面进行测试
示例:自定义错误页面
[root@nginx ~]# mkdir /webdata/nginx/timinglee/lee/errors -p
[root@nginx ~]# echo error page > /webdata/nginx/timinglee/lee/errors/40x.html
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.timinglee.org;
error_page 404 /40x.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}测试:
[root@nginx ~]# nginx -s reload
[root@nginx ~]#[root@nginx ~]# curl www.timinglee.org/40x.html/
error page
3.4.6 自定义错误日志
Syntax: error_log file [level];Default:error_log logs/error.log error;Context: main, http, mail, stream, server, locationlevel: debug, info, notice, warn, error, crit, alert, emerg
示例:
[root@nginx ~]# mkdir "/var/log/nginx" -p
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {
listen 80;
server_name www.timinglee.org;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl www.timinglee.org/40x.html/
error page
[root@nginx ~]# cd /var/log/nginx/
[root@nginx nginx]# ls
access.log error.log
3.4.7 检测文件是否存在
Syntax: try_files file ... uri;try_files file ... =code;Default: —Context: server, location
[root@nginx nginx]# mkdir -p /webdata/nginx/timinglee.org/lee/error/
[root@nginx nginx]# echo "index.html is not exist" > /webdata/nginx/timinglee.org/lee/error/default.html
[root@nginx nginx]# vim /usr/local/nginx/conf.d/vhosts.confserver {
listen 80;
server_name www.timinglee.org;#location /login {
# root /webdata/nginx/timinglee.org/lee;
# index index.html;
# auth_basic "login password";
# auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
#}
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
}
#测试:[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl www.timinglee.org/40x.html/
index.html is not exist
3.4.8 长连接配置
keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长, 0 表示禁止长连接,默认为75s#通常配置在http字段作为站点全局配置keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量#默认为100次,建议适当调大,比如:500
keepalive_requests 3;keepalive_timeout 65 60;# 开启长连接后,返回客户端的会话保持时间为 60s ,单次长连接累计请求达到指定次数请求或 65 秒就会被断开,第二个数字 60 为发送给客户端应答报文头部中显示的超时时间设置为 60s :如不设置客户端将不显示超时时间。Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文#如果设置为0表示关闭会话保持功能,将如下显示:#Connection:close 浏览器收到的服务器返回的报文# 使用命令测试:[root@nginx ~]# vim /usr/local/nginx/conf/nginx.confkeepalive_timeout 65 60;keepalive_requests 500;[root@nginx ~]# telnet www.timinglee.org 80
Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1 ##输入动作
HOST: www.timinglee.org ##输入访问HOST##输入回车
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytesindex.html is not exist
Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1 #第一次操作
HOST: www.timinglee.org #第二次操作#第三次操作
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytesindex.html is not exist
Connection closed by foreign host. # 自动断开链接
3.4.9 作为下载服务器配置
autoindex on | off; # 自动文件索引功能,默为 offautoindex_exact_size on | off; # 计算文件确切大小(单位 bytes ), off 显示大概大小(单位 K、 M),默认 onautoindex_localtime on | off ; # 显示本机时间而非 GMT( 格林威治 ) 时间,默认 offautoindex_format html | xml | json | jsonp; # 显示索引的页面文件风格,默认 htmllimit_rate rate; # 限制响应客户端传输速率 ( 除 GET 和 HEAD 以外的所有方法 ) ,单位B/s,bytes/second , # 默认值 0, 表示无限制 , 此指令由ngx_http_core_module提供set $limit_rate 4k; # 也可以通变量限速 , 单位 B/s, 同时设置 , 此项优级高 .
# 注意 :download 不需要 index.html 文件[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# cp /root/anaconda-ks.cfg /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {
listen 80;
server_name www.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
error_page 404 /40x.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location = /40x.html {
root /webdata/nginx/timinglee/lee/errors;
}
location /download {
autoindex on; #自动索引功能
autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位 kb 、 mb 、 gb)
autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间limit_rate 1024k; #限速,默认不限速
}
}# 重启 Nginx 并访问测试下载页面
四 Nginx 高级配置
由于后续内容太多,所以如果想要了解可以查看 http://t.csdnimg.cn/RueKQ