一.Nginx和Http协议
2.跨网络的主机间通讯 远程的两台主机联系在一起

套接字Socket:
-
进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换;
-
进程间的传输要有两个标志:IP地址(来确定那台主机)和端口号(确定那个进程),合称为套接字地址 socket address
- 客户机套接字地址定义了一个唯一的客户进程
- 服务器套接字地址定义了一个唯一的服务器进程
套接字相关的系统调用:
- socket() 创建一个套接字
- bind() 绑定IP和端口
- listen() 监听
- accept() 接收请求
- connect() 请求连接建立
- write() 发送
- read() 接收
- close() 关闭连接
我们可以使用 nc工具来模拟实验
csharp
[root@localhost ~]#nc -l 9527
#监听9527
[root@localhost ~]#ss -ntlp
#正在监听端口
LISTEN 0 10 *:9527
使用第二台机器测试
[root@localhost ~]#nc 192.168.91.100 9527
hello

3. HTTP 超文本传输协议
HTTP相关概念:
互联网
:
是网络,是所有类型网络的母集。
因特网
:
世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都称为主机。
万维网
:WWW(world wide web)(数据库)
万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库,使用链接的方法能非常方便地从因特网上的一个站点访问另一个站点(超链技术),具有提供分布式服务的特点。万维网是一个分布式的超媒体系统,是超文本系统的扩充,基于B/S架构实现

URL:资源定位符
(Uniform Resource Locator)
万维网使用统一资源定位符(Uniform Resource Locator)来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符URL。
HTTP:超文本传送协议
(HyperText Transfer Protocol)
-
为解决"用什么样 的网络协议来实现整个因特网上的万维网文档"这一难题;就要使万维网客户程序与万维网服务器程序之间的交互遵守严格的协议,即超文本传送协议。
-
HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。因此,需要特别提醒的是,万维网是基于因特网的一种广泛因特网应用系统,且万维网采用的是HTTP(80/TCP)和 HTTPS(443/TCP)的传输协议
HTML:超文本标记语言
(HyperText Markup Language)
- 为了解决"怎样使不同作者创作的不同风格的万维网文档,都能在因特网上的各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接"这一问题,万维网使用超文本标记语言
4.浏览器访问网站的过程

5. HTTP 协议通信过程
1.请求建立连接 2.接受请求 3.处理请求 4.访问资源 5.构建响应报文 6.发送响应报文 7.记录日志
6.HTTP协议分层

7. HTTP 相关技术
http:应用层协议,默认端口: 80/tcp
8.MIME
MIME
: 多用途互联网邮件扩展
文件 /etc/mime.types
来自于mailcap包
MIME格式:type/subtype
范例:
bash
text/plain
text/html
text/css
image/jpeg jpg jpeg
image/png
video/mp4
application/javascript
9.URI【URN URL】
URI
: 统一资源标识,分为URL 和 URN
URN
:统一资源命名
URL
:统一资源定位符,用于描述某服务器某特定资源位置
两者区别
:URN如同一个人的名称,而URL代表一个人的住址。
ruby
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- scheme:方案,访问服务器以获取资源时要使用哪种协议
- user:用户,某些方案访问资源时需要的用户名
- password:密码,用户对应的密码,中间用:分隔
- Host:主机,资源宿主服务器的主机名或IP地址
- port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
- path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
- params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
- query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
- frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
MPM工作模式
prefork: 一个客户访问开一个子进程,一对一
-
优点:稳定
-
缺点:慢,占用资源,不适用于高并发场景

worker:一个服务端接待客户有限,开一个子进程连接处理多个请求,但接待有限,服务结束还会一直占线
-
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
-
缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

event:与worker的的工作原理差不多,但是多了一个监工。监工看见你完成任务会立即释放。让线程去执行更多的请求
-
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
-
缺点:没有线程安全控制
影响用户体验的因素
客户端
-
客户端硬件配置
-
客户端网络速率
-
客户端与服务端距离
服务器
-
服务端网络速率
-
服务端硬件配置
-
服务端架构设计
-
服务端应用程序工作模式
-
服务端并发数量
-
服务端响应文件大小及数量 buffer cache
-
服务端I/O压力
二.Nginx 概述
1.关于nginx
- 一款高性能、轻量级Web服务软件
- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高
单台物理服务器可支持30 000 ~ 50 000个并发请求
2 .Nginx工作流程

- 1.客户端发起请求 先发送到网卡
- 2.网卡收到的报文复制到内核空间
- 3.内核空间再复制到用户空间的应用程序空间
- 4.nginx 分析得到一个磁盘页面文件
- 5.再将需求反馈给内核空间,应为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
- 6.内核去磁盘上找到所需要的文件,加载到内核空间
- 7.加载后再复制到用户空间
- 8.用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
- 9.整个过程会来回切换 用户空间,内核空间 那么我们可以在此基础上做优化处理
3.Nginx 进程
web请求处理机制
- 多
进程
方式:
- 服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端。
- 子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
- 多
线程
方式:
- 与多进程方式类似,线程方式在很大程度减轻了web服务器对系统资源的要求,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx的进程
主进程(master process)功能:
守护进程,用来管理工作进程
perl
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(worker process)的功能:
工作进程,用来处理用户请求
css
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退 出等
4.IO模型
同步/异步(消息反馈机制):请求发出后,是否需要等待结果,才能继续执行其他操作。
- 同步:机制是指发送方发送请求后,需要等待接收方返回响应后,才能发送下一个请求。

- 异步:发送方发送请求后,不等待接收方响应这个请求,就继续发送下个请求。

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

总结:
-
同步异步
是针对调用者
,调用者发起一个请求,一直干等被调用者的反馈就是同步,不用等去做别的事情就是异步 -
阻塞非阻塞
是针对被调用者
来说的,被调用者收到一个请求后,做完请求任务后才给出反馈就是阻塞,收到请求直接给出反馈再去做任务就是非阻塞。
5.事件驱动模型
Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,主要有以下实现方式:
select :apache
单个进程只支持1024个请求;不支持高并发,没有回访机制,遍历去问处理好了么?占资源,很慢
epoll:nginx
单个进程连接无上限,适合高并发,且有回调机制,会自动返回执行结构。
- apache :使用select
- nginx : 使用epoll

6.Nginx和Apache的区别?
1.Nginx
轻量级
抗并发
处理静态文件好
nginx 的设计高度模块化,编写模块相对简单
配置简洁,可以用-t测试配置文件有没有问题
nginx本身就是一个反向代理服务器,也可以作为邮件代理服务器来使用
2.Apache
rewrite强
发展成熟,模块多,bug少
对PHP支持比较简单,nginx需要配合其他后端使用
处理动态请求优势高
总结:
-
apache 是同步多进程模型,一个连接对应一个进程,
-
nginx 是异步的多进程模型,多个连接 (万级别)可以对应一个进程。
-
需要稳定用apache
-
需要高性能用nginx
四. Nginx 模块
1. Nginx模块介绍
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能

标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持

Stream服务模块: 实现反向代理功能,包括TCP协议代理

🍤🍤🍤

五. 安装及使用Nginx
1.编译安装nginx
1.nginx.org/en/download... #官网下载安装包

2.将安装包拖入opt并解压

- yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel #安装依赖包

4.useradd -M -s /sbin/nologin nginx #新建nginx用户便于管理

5.检测安装环境
css
./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

6.make:生成可执行的二进制文件
make install:将二进制文件复制到系统,配置应用环境。

7.修改文件权限
bash
chown -R nginx.nginx /apps/nginx

8.这几个重要文件夹的作用

- conf:保存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二进制启动脚本,可以接受不同的参数以实现不同的功能。
1.1 启动停止nginx
##########启动############## /apps/nginx/sbin/nginx #绝对路径启动
ln -s /apps/nginx/sbin/nginx /usr/sbin/ #创建软连接后直接 nginx启动
##########停止############### killall nginx

查看是否开启和关闭成功

查看开启关闭方法2

1.2 创建Nginx 自启动文件
ini
#复制同一版本的nginx的yum安装生成的service文件
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
[Install]
WantedBy=multi-user.target


2.重新加载配置
root@localhost system\]# systemctl daemon-reload \[root@localhost system\]# systemctl start nginx  ## 2.yum安装 ```bash centos7 需要安装epel源 yum install -y epel-release #安装epel源 yum install nginx -y 去使用官方源按装较新的版本 http://nginx.org/en/linux_packages.html#RHEL ```  🥗🥗  # 六. 平滑升级及nginx信号使用 ## 1. 信号 nginx 命令支持向其发送信号,实现不同功能 nginx 当做单独命令使用有以下选项 **nginx -h**  ### 1.1 显示版本 **nginx -v**  ### 1.2 显示编译详细情况 模块等信息 **nginx -V**  ### 1.3 发送信号 ##### **kill -l 看信号大全**  > 实例: > > * nginx -s stop #立即关闭nginx > * nginx -s quit #优雅退出 不影响业务的状态下退出 > * nginx -s reload #重新加载 ### 1.4 指定配置 不以配置文件中的为准 **nginx -g** ```arduino nginx -g 'user zhangsan;' 已张三身份运行,默认是以nginx身份 nginx -g 'daemon off;' 前台运行命令 ``` ### 1.5 检查语法格式 nginx -t  ## 2.nginx日志分割 ```bash 1.cd /apps/nginx/logs 切换到日志文件所在目录,此目录为指定安装目录,默认目录为/var/log/nginx 2.mv access.log access.log.bak 备份日志文件 3.touch access.log 新建日志文件 此时日志不会写到新文件 4 .cat /apps/nginx/logs/nginx.pid 查看软件进程 ps aux |grep nginx 5.kill -s USR1 或 nginx -s reopen 重新打开nginx 进程以重新加载配置文件 ```  **客户端**访问  **服务器**查看  ## 3.平滑升级 ### 3.2 升级nginx1.18 nginx1.25  1.**查看当前版本号** `nginx -v`  2.**将版本号更高的软件放入新的空的文件夹内**  3. > cd 去nginx-1.25.2 里面 > > 检测编译环境 用nginx -V 查看当前编译环境 > > 使用nginx-1.18的编译环境在nginx-1.25里用  4. **编译成机器能懂二进制语言make ;不要执行make install**  5.**生成了一个objs文件夹**  6.**将老的nginx 18版本做备份改名**  7.**将25版本的nginx 拷贝到老版本18的下面**  8 .**将25版本拷入18版本存放地**  9. 查看进程pai : cat /apps/nginx/logs/nginx.pid 发送升级信号 :kill -USR2 pid号  10. **查看 进程**  11.**优雅关闭老进程的worker进程** ```bash kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin` ```  12.用另一台主机访问查看版本号  ### 3.回滚 当业务出现问题,新版本nginx出现问题 ,可以唤起老进程继续工作 ```bash kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin` kill -QUIT `cat /apps/nginx/logs/nginx.pid` ps aux |grep nginx ```  # 七.配置详细解释、系统优化 nginx 官方帮助文档:[nginx.org/en/docs/](https://link.juejin.cn?target=http%3A%2F%2Fnginx.org%2Fen%2Fdocs%2F "http://nginx.org/en/docs/") tengine 帮助文档:[tengine.taobao.org/nginx_docs/...](https://link.juejin.cn?target=http%3A%2F%2Ftengine.taobao.org%2Fnginx_docs%2Fcn%2Fdocs%2F "http://tengine.taobao.org/nginx_docs/cn/docs/") > Nginx的配置文件的组成部分: > > 主配置文件:nginx.conf > > 子配置文件: include conf.d/\*.conf **主配置文件中有六个主要模块:** 1、全局块:全局配置,对全局生效。 2、events块:配置影响Nginx服务器与用户的网络连接。 3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。 4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。 5、location块:用于配置匹配的url,一个server块中可以有多个location块。 6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。 > 配置文件由指令和指令块构成 每条指令以`;分号`结尾,指令与值之间以空格符号分隔 pid /apps/run/nginx.pid 指令已{}达括号将多条指令组织在一起且可以嵌套指令块 include语句允许组合多个配置文件以提升可维护性 ## 7.1全局配置 **nginx 有多种模块** * 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能 * 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等 * 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等 * 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持 * Stream服务模块: 实现反向代理功能,包括TCP协议代理 * 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等 #### 1 隐藏版本或修改版本 ##### 隐藏版本号 ```ini #修改配置文件 放在 http语句中 http { server_tokens off; [root@localhost nginx]#nginx -s reload #重新加载 ``` ```yaml 验证 [root@localhost sbin]#curl -I http://192.168.91.100/ HTTP/1.1 200 OK Server: nginx/1.18.0 Date: Thu, 21 Apr 2022 03:34:51 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT Connection: keep-alive ETag: "625e21c5-264" Accept-Ranges: bytes ```  🧈  ##### 修改版本号 在nginx 停止运行的情况下进行编译 ```csharp #去修改源码,在安装包里, 再重新编译 #号不要去掉 [root@localhost core]#vim /opt/nginx-1.18.0/src/core/nginx.h 13 #define NGINX_VERSION "9527" 14 #define NGINX_VER "http/" NGINX_VERSION [root@localhost core]#vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c 49 static u_char ngx_http_server_string[] = "Server: kgc" CRLF; 重新编译安装 ./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 [root@localhost nginx-1.18.0]#make && make install ```  > vim /opt/nginx-1.18.0/src/http/ngx_http_header_filter_module.c  > 重新编译   查看  #### 2 修改启动的进程数 ```ini worker_processes 1; #允许的启动工作进程数数量,和你真实的cpu数量有关 1 worker_processes auto; #如果设置为auto 就是你真实的cpu数量 nginx -s reload [root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx #可以看到 nginx的 worker数量 ```  编写内容🍗  #### 3 cpu与work进程绑定 将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。 worker_cpu_affinity 模块指令用于控制 worker 进程与 CPU 的亲和性 ```ini vim /apps/nginx/conf/nginx.conf #编辑配置文件 user nginx; worker_processes 2; worker_cpu_affinity 00000001 00000010; #绑定到 第一 和 第二块cpu上 error_log /apps/nginx/logs/error.log; #指定报错文件的路径 ``` ```perl nginx -t #语法检查 查看 ps axo pid,cmd,psr,ni|grep -v grep |grep nginx|sort -n ``` **编写内容**  **编写检查重启服务过程**  **查看**  #### 4 .nginx进程的优先级(work进程的优先级) ```ini 修改配置文件 user nginx; worker_processes 2; worker_cpu_affinity 00000101 00000010; error_log /var/log/nginx/error.log; pid /run/nginx.pid; worker_priority -20; #添加此项 nginx -s reload ```  🥞  #### 5. 调试work进程打开的文件的个数 所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,只要机器性能够多加几个也没问题 ```bash vim /etc/security/limits.conf #首先修改主配置文件 #添加 worker_rlimit_nofile 65536; ```  🥘 **临时修改** ```bash ulimit -n 30000 #修改单个进程能打开的最大文件数为 30000 #仅应用于当前会话即不会永久修改限制 ulimit -a #显示当前用户的所有资源限制信息 ```  **永久修改(需要修改pam认证模块)** ```markdown vim /etc/security/limits.conf #最后加入 * soft core unlimited * hard core unlimited * soft nproc 1000000 * hard nproc 1000000 * soft nofile 1000000 * hard nofile 1000000 * soft memlock 32000 * hard memlock 32000 * soft msgqueue 8192000 * hard msgqueue 8192000 `nproc`(最大进程数限制)的软限制和硬限制都设置为 1000000,当前用户在单个会话中可以创建的最大进程数为 1000000 `nofile`(打开文件描述符限制)的软限制和硬限制都设置为 1000000,这意味着当前用户在单个会话中可以使用的最大文件描述符数将被限制为 1000000。软限制是软性限制,用户可以根据需要进行调整,而硬限制是硬性限制,一旦设定,用户无法超过该限制 `memlock`(锁定内存限制)的软限制和硬限制都设置为 32000,这意味着当前用户在单个会话中可以锁定的最大内存量为 32000KB `msgqueue`(消息队列限制)的软限制和硬限制都设置为 8192000,这意味着当前用户在单个会话中可以使用的最大消息队列大小为 8192000字节 ```  ```bash reboot #重启生效 ulimit -a #显示当前用户的所有资源限制信息 ```  ## 7.2 events{}事件 在Nginx的主配置文件中,events事件用于配置Nginx服务器的事件模块相关参数,控制Nginx服务器在处理连接请求时的行为 **常见配置参数** * worker_connections:指定每个工作进程可以同时处理的最大连接数。 * multi_accept:指定是否一次接受多个连接。默认情况下,Nginx在每个循环中只接受一个连接,但设置multi_accept为"on"后可以同时接受多个连接。 * use:指定Nginx使用的事件模块。常见的事件模块有"epoll"、"kqueue"和"eventport"等。  ## 7.3 http设置 * include:引入其他配置文件,通常用于加载 MIME 类型配置文件。 * default_type:指定默认的 MIME 类型。 * server:定义一个或多个虚拟主机。 * listen:指定该虚拟主机监听的端口。 * server_name:指定域名,用于匹配请求的主机头。 * root:指定虚拟主机的根目录。 * location:用于匹配不同的 URL,并定义相关配置规则。 ```bash http { ... ... #各server的公共配置 server { #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器 ... } server { ... server_name #虚拟主机名 root #主目录 alias #路径别名 location [OPERATOR] URL { #指定URL的特性 ... if CONDITION { ... } } } } ``` ### 1.mime 在Nginx中,"mime" 是一种配置指令,用于设置 MIME 类型与文件扩展名的映射关系。 **有就展示给你看,没有就从网页上下载.** ```bash vim /etc/nginx/mime.types #查看当前Nginx服务器配置的MIME类型列表 ``` ### 2.server下的root **root指定了主页文件的位置** > root路径格式 指定文件的路径 url > > Syntax: root path; Default: root html; Context: http, server, location, if in location ### 3.server块构建虚拟机 以手机端和电脑端为例 ```bash mkdir -p /apps/nginx/conf.d/#建立虚拟主机配置文件目录 cd /apps/nginx/conf #主配置文件所在目录 #添加到http模块中 vim nginx.conf include /apps/nginx/conf.d/*.conf; #声明子配置文件的位置,需要写在最上面 nginx -t #保存后检查语法 ``` **实验步骤**  **vim 编写内容如下**  ```ini cd /apps/nginx/conf.d/ #编写电脑端的配置文件 vim computer.conf server{ listen 192.168.2.100:80; server_name www.computer.com; location / { root /data/nginx/html/pc; } } #编写手机端的配置文件 vim mobile.conf server { listen 192.168.2.100:80; server_name www.mobile.com; root /data/nginx/html/mobile/; } ```  > #构建数据文件夹 > > mkdir /data/nginx/html/pc -pv > > mkdir /data/nginx/html/mobile -pv  ```ruby #构建数据文件 echo This is computer > /data/nginx/html/pc/index.html echo This is mobile > /data/nginx/html/mobile/index.html ```  ```shell #切换到测试机 #修改本地hosts文件 添加对应映射 vim /etc/hosts 192.168.2.100 www.computer.com 192.168.2.100 www.mobile.com ```  ```bash #测试 curl www.computer.com curl www.mobile.com ```  ```ini server{ listen 192.168.223.100:80; server_name www.pc.com; location / { #模糊查找根一下的文件 root /data/nginx/html/pc; #这边是具体文件路径 } } ``` #### 基于端口 ```ini 服务端 #编辑子配置文件 mobile.conf,修改端口号 server{ listen 192.168.2.100:8080; server_name www.mobile.com; root /data/nginx/html/moblie; } #computer.conf 不变 server{ listen 192.168.2.100:80; server_name www.computer.com; root /data/nginx/html/pc; } ```  **测试访问**  #### 基于IP地址 1. 服务端 2. 添加新网卡并配置  ```ini #编辑子配置文件mobile.conf,修改IP地址 cd /apps/nginx/conf.d/ vim mobile.conf server{ listen 192.168.2.136:80; server_name www.mobile.com; root /data/nginx/html/mobile; } #computer.conf不变 server{ listen 192.168.2.100:80; server_name www.computer.com; root /data/nginx/html/pc; } ```  > 客户端 > > vim /etc/hosts  **测试**  ### 4.alias 路径别名 在 Nginx 中,alias 用于创建一个路径别名的指令。 别名可以用于将文件或目录从一个位置映射到另一个位置,提供更灵活的访问控制 ```bash 服务端 #编辑子配置文件computer.conf,使用alias server { listen 80; server_name www.computer.com; location /test{ alias /data/nginx/html/pc; #相当于替换,访问/test/就是访问/data/nginx/html/pc; } } ```  > 客户端 > > curl 192.168.2.100/test/ #访问test目录  ### 5.location **匹配文件路径优先级** 在Nginx中,`location` 是一个用于匹配请求 URL 路径的指令。它在 Nginx 配置文件中使用,在不同的 `location` 块中定义不同的行为或处理规则。 > #官方帮助文档 [nginx.org/en/docs/htt...](https://link.juejin.cn?target=http%3A%2F%2Fnginx.org%2Fen%2Fdocs%2Fhttp%2Fngx_http_core_module.html%23location "http://nginx.org/en/docs/http/ngx_http_core_module.html#location") ```ini #基本语法 location [修饰符] 匹配的路径 { ... 配置指令 ... } ``` | 修饰符 | 功能 | |------|----------------------------------| | `=` | 精确字符串匹配 | | `^~` | 前缀匹配,如果URL路径以指定的字符串开始,则停止查找其他匹配。 | | `~` | 使用正则表达式进行匹配,区分大小写 | | `~*` | 使用正则表达式进行匹配,不区分大小写 | | 不带符号 | 匹配起始于此uri的所有的uri | | \\ | 表示包含正则表达式并且转义字符 | > #匹配优先级从高到低: > > =, \^\~, ~~/~~\*, 不带符号 **举例子1** ```markdown #举个例子 1 location { ... 处理根路径的配置 ... } location /static { ... 处理 /static 路径的配置 ... } location ~ \.(png|jpg)$ { ... 处理以 .png 或 .jpg 结尾的请求的配置 ... } location = /favicon.ico { ... 处理 favicon.ico 请求的配置 ... } ``` **举例子2** ```less location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] } 访问路径是 / # A B 能匹配,A优先级高 ,A 访问路径是 /index.html #只有B 访问路径是 /documents/document.html #B C能匹配 C精确度高 所以C 访问路径是 /images/1.gif # B D E 能匹配,D的优先级高,D 访问路径是 /documents/1.jpg # B C E 能匹配, E ``` **练习题1**. ```bash 如下请求内容,会匹配哪个 Location? http://www.example.com/gallery/images/cat.png A.Location /gallery {} B.Location ~* ^/.(png|jpg)${} C.Location ^~ /gallery/images {} D.Location / {} 我选C ``` # 八. access 模块 四层控制 Nginx的`access`模块允许用户定义基于IP地址、请求方法、URI等条件的访问规则,以控制客户端对NGINX服务器上特定资源的访问。 1)IP地址访问控制:允许或拒绝特定IP地址或IP地址范围的访问。 ```ini 拒绝特定IP地址的访问 location / { deny 192.168.47.100; } ``` ```ini 允许特定IP地址段的访问 location / { allow 192.168.2.0/24; deny all; } ``` 2)请求方法访问控制:允许或拒绝特定HTTP请求方法(如GET、POST等)的访问。 ```sql 仅允许GET请求 if ($request_method != GET) { return 403; } ``` 3)URI访问控制:允许或拒绝特定URI或URI模式的访问。 ```bash 拒绝特定URI的访问 location /admin { deny all; } ``` ```javascript 允许特定URI模式的访问 location ~ ^/api/ { allow all; } ``` 4)条件组合访问控制:根据多个条件的组合来实施访问控制策略。 ```bash 仅允许特定IP地址段的GET请求访问特定URI模式 #举个例子 location ~ ^/api/ { if ($request_method != GET) { return 403; } allow 192.168.1.0/24; deny all; } ``` # 九. 验证模块 ## htpasswd命令 安装 yum install httpd-tools -y  **需要命令** ```r #第一次生成文件 htpasswd -c 文件路径 姓名 交互式生成密码 htpasswd -bc 文件路径 姓名 密码 直接将密码跟在后面 -c 代表新建用户名和密码对应的文件 -b 将密码跟在用户名后 ``` ```bash #非第一次生成文件 htpasswd 文件路径 姓名 交互式生成密码 htpasswd -b 文件路径 姓名 密码 直接将密码跟在后面 ``` ## 配置验证模块 ```ini #编辑配置文件 vim computer.conf server { listen 80; server_name www.byyd.com; location / { root /data/nginx/html/pc; } location /admin{ root /data/nginx/html/pc; auth_basic "admin site"; #提示信息,不是所有浏览器都有用 auth_basic_user_file /apps/nginx/conf.d/.httpuser; #密码文件存放位置 } } ``` **使用 Basic 认证(基本认证)对用户进行身份验证** ```bash htpasswd -bc /apps/nginx/conf.d/.httpuser byyd 123456 #创建一个.htpasswd文件,并添加一个使用Basic认证的用户名和密码 ```  ```bash cat /apps/nginx/conf.d/.httpuser ```  ```bash 打开虚拟机内置浏览器 访问 192.168.47.100/admin ```  ## 自定义 错误页面 修改错误页面的主要目的是为了提供更友好的用户体验和品牌一致性。 **也可以用指定的响应状态码进行响应。** ```vbscript #部分响应状态码 400 Bad Request:请求不正确或无效的错误页面。 401 Unauthorized:未授权访问的错误页面。 403 Forbidden:禁止访问的错误页面。 404 Not Found:页面未找到的错误页面。 500 Internal Server Error:服务器内部错误的错误页面。 502 Bad Gateway:错误的网关请求的错误页面。 503 Service Unavailable:服务不可用的错误页面 ``` **配置文件中的可用位置:http, server, location, if in location。** > 配置部分 ```lua #基本格式 error_page code ... [=[response]] uri; #构成详解 error_page 固定写法 code 响应码 = 可以将响应码转换 uri 访问连接 ``` ```bash 新建错误页面和错误页面目录 mkdir/data/nginx/html/pc/error/ cd /data/nginx/html/pc/error/ vim 40x.html #错误页面 ```  ```ini cd /apps/nginx/conf.d/ vim computer.conf #编辑子配置文件 server { listen 80; server_name www.kgc.com; root /data/nginx/html/pc; error_page 404 =302 /40x.html; #把错误码 404 指定成302 注意此处的 40x.html 需要真实存在建立的页面必须一致 location = /40x.html { root /data/nginx/html/pc/error/; } location / { root /data/nginx/html/pc; } #验证模块可以不写 location /admin{ auth_basic "admin site"; auth_basic_user_file /apps/nginx/conf.d/.httpuser; } } ```  ## 检测文件是否存在-----try_files指令 Nginx 的 try_files 指令用于指定在资源文件不存在时如何处理请求。 默认开启,可用于server和location部分。 **原理部分** ```bash 基本语法 #方式一 try_files file ... uri; file 表示要尝试的文件路径, uri 则表示当文件不存在时转发请求的路径。 #举个例子 location / { try_files $uri $uri/ /index.html /fallback.html; } #释义 尝试找到与请求的 URI 对应的文件。 如果文件不存在,则尝试在 URI 后面加上斜杠 (/) 后再查找一个文件。 如果仍然找不到文件,则尝试访问 /index.html。 如果连 /index.html 也不存在,则将请求转发给 /fallback.html。 ``` ```bash #方式二 try_files file ... =code; =code 表示文件不存在时 返回的状态码 #只会返回指定的 HTTP 响应码,而不会转发请求到指定的 uri #举个例子 location / { try_files $uri $uri/ =404; } #释义 尝试找到与请求的 URI 对应的文件。 如果文件不存在,则尝试在 URI 后面加上斜杠 (/) 后再查找一个文件。 如果仍然找不到文件,则返回 404 响应码。 ``` ### 配置实例 ```bash 服务端 #新建寻找失败跳转页面 mkdir /data/nginx/html/pc/about echo "default page" >> /data/nginx/html/pc/about/default.html #修改配置文件 vim /apps/nginx/conf.d/computer.conf server{ listen 80; server_name www.byydc.com; root /data/nginx/pc; location / { root /data/nginx/html/pc; try_files $uri $uri.html $uri/index.html /about/default.html; } } #重新加载 nginx -t nginx -s reload、 ```  ```bash #建立测试文件 cd /data/nginx/html/pc/;touch test echo "find it" >> test ```  ```bash 客户端 curl www.byydc.com/test #查找一个存在的文件来测试 ``` ```bash curl www.byydc.com/tes #查找一个不存在的文件来测试 ``` ## 长连接相关-----keepalive指令 ### 原理 HTTP Keep-Alive 功能用于实现长连接,允许客户端和服务器之间的 TCP 连接在发送完一个请求后保持打开状态,以便在同一连接上发送多个请求和响应 可以加在全局或者 server 。 `keepalive` 配置指令仅对 HTTP/1.0 和 HTTP/1.1 版本的连接有效。 对于 HTTP/2 连接,`keepalive` 功能是默认启用的,并且无需额外配置。 ### keepalive_timeout ```ini keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长 ``` `keepalive_timeout` 用于定义长连接超时时间。 当一个客户端与服务器之间的连接完成一个请求后的等待时间。 如果在这个时间内没有收到新的请求,服务器会关闭连接。 这个时间是以秒为单位的,默认值是 75 秒。 ### keepalive_requests keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量 keepalive_requests 用于设置一个连接上可以处理的最大请求数量。 当达到指定数量后,服务器会关闭该连接并且客户端需要重新建立新连接。 默认情况下,keepalive_requests 的值是 100。 如果将 keepalive_requests 设置为 0,则表示在完成每个请求后立即关闭连接,禁用了 Keep-Alive 功能。 ## 用户上传资料 ```ini 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 ``` ## 其他设置 ```css directio size | off; #操作完全和aio相反,aio是读取文件而directio是写文件到磁盘,启用直接I/O,默认为关闭,当文件大于等于给定大小时,例如:directio 4m;同步(直接)写磁盘,而非写缓存。 直接 写入 磁盘 还是等待一定数据量写入磁盘 ``` ```ini 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网段主机使用 ```