高性能web服务器

目录

一、简介

(一)nginx-高性能的web服务端

(二)用户访问体验

二、I/O模型

(一)概念

(二)网络I/O模型

(三)阻塞型 I/O 模型

(四)非阻塞型 I/O 模型 (nonblocking IO)

(五)多用服用I/O型

(六) 信号驱动式 I/O 模型 (signal-driven IO)

(七)异步 I/O 模型 (asynchronous IO)

三、nginx

(一)功能介绍

(二)基础特性

(三)服务相关内容

(四)进程结构

(五)进程间通信

(六)模块介绍

(七)版本信息

四、实验

一、nginx的源码编译安装

二、平滑升级和回滚

三、nginx常用参数

四、nginx服务的启动脚本

五、nginx全局参数优化

六、lnginx配置中的root和alias

七、location的用法以及优先级

1、定义

2、语法规则:

3、优先级测试

八、nginx的用户认证

九、自定义

(一)自定义错误页面

(二)自定义日志

十、检测文件是否存在

十一、nginx中长连接的管理

十二、nginx下载服务器的设定优化

十三、nginx状态页

十四、nginx数据压缩功能

十五、nginx内键变量

十六、nginx的rewrite模块功能

十七、nginx-rewrite的企业示例及防盗链

十八、nginx的反向代理及动静分离

 二、fastcgi(nginx和php共存)

一、源码编译php

二、php的配置

三、nginx和php的整合

四、nginx-php缓存

五、php高速缓存


一、简介

(一)nginx-高性能的web服务端

Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发 工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0

2019年3月11日F5 与 NGINX达成协议,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。 6.7亿美金约合44.97亿人民币,nginx核心模块代码长度198430(包括空格、注释),所以一行代码约为 2.2万人民币

官网地址 www.nginx.org

Nginx历经十几年的迭代更新(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-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.服务器

服务端网络速率

服务端硬件配置

服务端架构设计

服务端应用程序工作模式

服务端并发数量服务端响应文件大小及数量 buffer cache

服务端I/O压力1.2.4 服务端 I/O 流程

二、I/O模型

(一)概念

同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状 态的通知。

同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事 情是否处理完成

异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂 起,干不了别的事情。

非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完 成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

(二)网络I/O模型

阻塞型、非阻塞型、复用型、信号驱动型、异步

(三)阻塞型 I/O 模型

阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞

用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然 后将接收的数据拷贝到用户空间,完成read操作

用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线 程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够

优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源

缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销 较apache 的preforck使用的是这种模式。

同步阻塞:程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进 程将一直等待并不再接受新的请求,并由进程轮询查看I/O是否完成,完成后进程将I/O结果返回给 Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种 方式简单,但是比较慢,用的比较少

(四)非阻塞型 I/O 模型 (nonblocking IO)

用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据 到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等, 那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户 态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长, 程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一 般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。 非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结 果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完 成。 查看上图可知,在设置连接为非阻塞时,当应用进程系统调用 recvfrom 没有数据返回时,内核会立即返 回一个 EWOULDBLOCK 错误,而不会一直阻塞到数据准备好。如上图在第四次调用时有一个数据报准 备好了,所以这时数据会被复制到 应用进程缓冲区 ,于是 recvfrom 成功返回数据 当一个应用进程这样循环调用 recvfrom 时,称之为轮询 polling 。这么做往往会耗费大量CPU时间,实 际使用很少

(五)多用服用I/O型

上面的模型中,每一个文件描述符对应的IO是由一个线程监控和处理

多路复用IO指一个线程可以同时(实际是交替实现,即并发完成)监控和处理多个文件描述符对应各自 的IO,即复用同一个线程

一个线程之所以能实现同时处理多个IO,是因为这个线程调用了内核中的SELECT,POLL或EPOLL等系统调 用,从而实现多路复用IO

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,worker是poll模式。

IO多路复用(IO Multiplexing) :是一种机制,程序注册一组socket文件描述符给操作系统,表示“我要 监视这些fd是否有IO事件发生,有了就告诉程序处理”IO多路复用一般和NIO一起使用的。NIO和IO多路 复用是相对独立的。NIO仅仅是指IO API总是能立刻返回,不会被Blocking;而IO多路复用仅仅是操作系统 提供的一种便利的通知机制。操作系统并不会强制这俩必须得一起用,可以只用IO多路复用 + BIO,这时 还是当前线程被卡住。IO多路复用和NIO是要配合一起使用才有

实际意义 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,就通知该进程多个连接共用一 个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真 正的IO操作上用户首先将需要进行IO操作添加到select中,同时等待select系统调用返回。当数据到达 时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行从流程上来看,使用 select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视IO,以及调用select函数的 额外操作,效率更差。并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个IO上是否已 有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的。而不像阻塞IO那种,一次只 能监控一个IO虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select 函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只是注册自己需要的IO请求,然 后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率IO多路复用是最常使用的IO 模型,但是其异步程度还不够“彻底”,因它使用了会阻塞线程的select系统调用。因此IO多路复用只能称 为异步阻塞IO模型,而非真正的异步IO

优缺点

优点:可以基于一个阻塞对象,同时在多个描述符上等待就绪,而不是使用多个线程(每个文件描述 符一个线程),这样可以大大节省系统资源

缺点:当连接数较少时效率相比多线程+阻塞 I/O 模型效率较低,可能延迟更大,因为单个连接处理 需要 2 次系统调用,占用时间会有增加

IO多路复用适用如下场合

当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用

当一个客户端同时处理多个套接字时,此情况可能的但很少出现

当一个服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用

当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用

当一个服务器要处理多个服务或多个协议,一般要使用I/O复用

(六) 信号驱动式 I/O 模型 (signal-driven IO)

信号驱动I/O的意思就是进程现在不用傻等着,也不用去轮询。而是让内核在数据就绪时,发送信号通知 进程。

调用的步骤是,通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主 程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个 SIGIO信 号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进 程所需要的数据从内核空间拷贝到用户空间

此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处 理函数的通知。

在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续 运行并不阻塞

在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续 运行并不阻塞

当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

优 点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此 可以提高资源的利用率

缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

异步阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核收到进程 请求后 进行的IO如果不能立即返回,就由内核等待结果,直到IO完成后内核再通知进程。

(七)异步 I/O 模型 (asynchronous IO)

异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知用户进程何时开始一个I/O操作,而异步I/O 是由内核通知用户进程I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把 等待上菜的时间也给省了

相对于同步I/O,异步I/O不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备 好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直 接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。

信号驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空间缓冲区拷贝数据到 用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续 操作了

优点:异步 I/O 能够充分利用 DMA 特性,让 I/O 操作与计算重叠

缺点:要实现真正的异步 I/O,操作系统需要做大量的工作。目前 Windows 下通过 IOCP 实现了真正的 异步 I/O,在 Linux 系统下,Linux 2.6才引入,目前 AIO 并不完善,因此在Linux 下实现高并发网络编 程时以 IO 复用模型模式+多线程任务的架构基本可以满足需求。

Linux提供了AIO库函数实现异步,但是用的很少。目前有很多开源的异步IO库,例libevent、libev、 libuv。

异步非阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核调用的 IO如果不能立即返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的 结果返回给进程,期间进程可以接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现 较大的同时并实现较高的IO复用,因此异步非阻塞使用最多的一种通信方式。

三、nginx

(一)功能介绍

静态的web资源服务器html,图片,js,css,txt等静态资源

http/https协议的反向代理

结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

tcp/udp协议的请求转发(反向代理)

imap4/pop3协议的反向代理

(二)基础特性

模块化设计,较好的扩展性 高可靠性

支持热部署:不停机更新配置文件,升级版本,更换日志文件

低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存

event-driven,aio,mmap,sendfile

(三)服务相关内容

虚拟主机(server)

支持 keep-alive 和管道连接(利用一个连接做多次请求)

访问日志(支持基于日志缓冲提高其性能)

url rewirte

路径别名

基于IP及用户的访问控制

支持速率限制及并发数限制

重新配置和在线升级而无须中断客户的工作进程

(四)进程结构

多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求

多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

主进程(master process)的功能

对外接口:接收外部的操作(信号)

对内转发:根据外部的操作的不同,通过信号管理 Worker

监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程

读取Nginx 配置文件并验证其有效性和正确性

建立、绑定和关闭socket连接

按照配置生成、管理和结束工作进程

接受外界指令,比如重启、升级及退出服务器等指令

不中断服务,实现平滑升级,重启服务并应用新的配置

开启日志文件,获取文件描述符

不中断服务,实现平滑升级,升级失败进行回滚处理

编译和处理perl脚本

工作进程(worker process)的功能: 所有 Worker 进程都是平等的

实际处理:网络请求,由 Worker 进程处理

Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源,

增加上下文切换的损耗

接受处理客户的请求

将请求依次送入各个功能模块进行处理

I/O调用,获取响应数据

与后端服务器通信,接收后端服务器的处理结果

缓存数据,访问缓存索引,查询和调用缓存数据

发送请求结果,响应客户的请求

接收主程序指令,比如重启、升级和退出等

(五)进程间通信

工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决 定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。

主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互

(六)模块介绍

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 版本支持动态装载和卸载

(七)版本信息

Nginx版本

Mainline version 主要开发版本,一般为奇数版本号,比如1.19

Stable version 当前最新稳定版,一般为偶数版本,如:1.20

Legacy versions 旧的稳定版,一般为偶数版本,如:1.18

Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装

yum的版本比较旧 编译安装可以更方便自定义相关路径 使用源码编译可以自定义相关功能,更方便业务的上的使用

四、实验

一、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模块) 等。

首先下载压缩包并放入虚拟机中而后进行解压

解压
[root@node1 ~]# tar zxf nginx-1.24.0.tar.gz
[root@node1 ~]# cd nginx-1.24.0/下载gcc编译器和其他依赖的开发包
[root@node1 ~]#  dnf install gcc pcre-devel zlib-devel openssl-devel -y[root@node1 nginx-1.24.0]#./configure ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module  --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module  --with-pcre --with-stream --with-stream_ssl_module检测
[root@node1 nginx-1.24.0]# make      (make  clean:如果想重新检测课执行,还原文件)以下位下载之后所生的文件
[root@node1 nginx-1.24.0]# cd objs/
[root@node1 objs]# ls
autoconf.err  nginx    ngx_auto_config.h   ngx_modules.c  src
Makefile      nginx.8  ngx_auto_headers.h  ngx_modules.o
[root@node1 objs]# cd src/
[root@node1 src]# ls
core  event  http  mail  misc  os  stream
[root@node1 src]# cd stream/
[root@node1 stream]# ls
ngx_stream_access_module.o      ngx_stream_proxy_module.o                ngx_stream_upstream.o
ngx_stream_core_module.o        ngx_stream_return_module.o               ngx_stream_upstream_random_module.o
ngx_stream_geo_module.o         ngx_stream_script.o                      ngx_stream_upstream_round_robin.o
ngx_stream_handler.o            ngx_stream_set_module.o                  ngx_stream_upstream_zone_module.o
ngx_stream_limit_conn_module.o  ngx_stream_split_clients_module.o        ngx_stream_variables.o
ngx_stream_log_module.o         ngx_stream_ssl_module.o                  ngx_stream_write_filter_module.o
ngx_stream_map_module.o         ngx_stream_upstream_hash_module.o
ngx_stream.o                    ngx_stream_upstream_least_conn_module.o将objs里的内容拷贝到形同指定的文件下
[root@node1 nginx-1.24.0]# make install
创建nginx用户
[root@node1 sbin]# useradd -s /sbin/nologin/nginx -M nginx[root@node1 sbin]# id nginx
用户id=1001(nginx) 组id=1001(nginx) 组=1001(nginx)启动nginx
[root@node1 sbin]# ./nginx
查看进程
[root@node1 sbin]# ps aux | grep nginx
root        1705  0.0  0.0   9864  2052 ?        Ss   20:52   0:00 nginx: master process ./nginx  管理进程
nginx       1706  0.0  0.1  14196  5252 ?        S    20:52   0:00 nginx: worker process
工作进程
root        1820  0.0  0.0 221680  2304 pts/1    S+   21:09   0:00 grep --color=auto nginx端口
[root@node1 sbin]# netstat -antlupe | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          25493      1705/nginx: master访问
[root@node1 ~]# curl 172.25.254.200
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>查看nginx的大小
[root@node1 sbin]# du -sh nginx
5.4M    nginx关闭nginx
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s stop
查看是否关闭
[root@node1 ~]# netstat -antlupe | grep nginx因为nginx太大,所以建议关闭debug
[root@node1 nginx-1.24.0]# vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g"
关闭之后重新检测
[root@node1 nginx-1.24.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module  --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module  --with-pcre --with-stream --with-stream_ssl_module
[root@node1 nginx-1.24.0]# make && make install
把nginx软件的命令执行路径添加到环境变量中
[root@node1 nginx-1.24.0]# vim ~/.bash_profile
[root@node1 nginx-1.24.0]# cat ~/.bash_profile
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# User specific environment and startup programsexport PATH=$PATH:/usr/local/nginx/sbin[root@node1 nginx-1.24.0]# source ~/.bash_profile
再次查看nginx的大小,明显比之前小了很多
[root@node1 nginx-1.24.0]# du -sh /usr/local/nginx/sbin/nginx
1.2M    /usr/local/nginx/sbin/nginx
配置文件
[root@node1 conf]# vim /usr/local/nginx/conf/nginx.conf[root@node1 sbin]# curl -I 172.25.254.200
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 15 Aug 2024 15:41:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 15 Aug 2024 14:15:54 GMT
Connection: keep-alive
ETag: "66be0d9a-267"
Accept-Ranges: bytes[root@node1 sbin]#

二、平滑升级和回滚

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

流程:

将旧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

添加新版本和模块

隐藏版本信息:修改以下的配置文件:
[root@node1 core]# pwd
/root/nginx-1.24.0/src/core      配置文件路径
[root@node1 core]# vim nginx.h   修改的文件#define nginx_version      1024000
#define NGINX_VERSION      "1.24.0"    可将1.24.0修改你想要的地址
#define NGINX_VER          "nginx/" NGINX_VERSION解压生成文件
[root@node1 ~]# tar zxf echo-nginx-module-0.63.tar.gz
[root@node1 ~]# tar zxf nginx-1.26.2.tar.gz
[root@node1 ~]# ls
公共  文档  anaconda-ks.cfg                nginx-1.24.0.tar.gz
模板  下载  echo-nginx-module-0.63         nginx-1.26.1.tar.gz
视频  音乐  echo-nginx-module-0.63.tar.gz  nginx-1.26.2
图片  桌面  nginx-1.24.0                   nginx-1.26.2.tar.gz编译:
[root@node1 nginx-1.26.2]# make
编译完成之后生成的文件
[root@node1 nginx-1.26.2]# cd objs/
[root@node1 objs]# ls
addon         Makefile  nginx.8            ngx_auto_headers.h  ngx_modules.o
autoconf.err  nginx     ngx_auto_config.h  ngx_modules.c       src备份:
[root@node1 sbin]# cp nginx nginx.bak
[root@node1 sbin]# ls
nginx  nginx.bak  nginx.old
将新生成的文件进行覆盖
[root@node1 sbin]# \cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/nginx
[root@node1 sbin]# kill -USR2 5708
[root@node1 sbin]# ps aux | grep nginx
root        5708  0.0  0.0  10060  2108 ?        Ss   13:46   0:00 nginx: master process nginx
nginx       5709  0.0  0.1  14384  5180 ?        S    13:46   0:00 nginx: worker process
nginx       5710  0.0  0.1  14384  5692 ?        S    13:46   0:00 nginx: worker process
root        5750  0.0  0.1   9764  6528 ?        S    13:53   0:00 nginx: master process nginx
nginx       5751  0.0  0.1  14228  4888 ?        S    13:53   0:00 nginx: worker process
root        5753  0.0  0.0 221680  2304 pts/0    S+   13:53   0:00 grep --color=auto nginx[root@node1 sbin]# kill -WINCH 5708
[root@node1 sbin]# ps aux | grep nginx
root        5708  0.0  0.0  10060  2108 ?        Ss   13:46   0:00 nginx: master process nginx
root        5750  0.0  0.1   9764  6528 ?        S    13:53   0:00 nginx: master process nginx
nginx       5751  0.0  0.1  14228  4888 ?        S    13:53   0:00 nginx: worker process
root        5757  0.0  0.0 221680  2304 pts/0    S+   13:56   0:00 grep --color=auto nginx
[root@node1 sbin]# curl -I 172.25.254.200
HTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 05:57:22 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 17 Aug 2024 05:45:49 GMT
Connection: keep-alive
ETag: "66c0390d-267"
Accept-Ranges: bytes

恢复老版本:

[root@node1 sbin]# kill -HUP 5708
[root@node1 sbin]# ps aux | grep nginx
root        5708  0.0  0.0  10060  2108 ?        Ss   13:46   0:00 nginx: master process nginx
root        5750  0.0  0.1   9764  6528 ?        S    13:53   0:00 nginx: master process nginx
nginx       5751  0.0  0.1  14228  5272 ?        S    13:53   0:00 nginx: worker process
nginx       5800  0.0  0.1  14384  5180 ?        S    15:17   0:00 nginx: worker process
nginx       5801  0.0  0.1  14384  5180 ?        S    15:17   0:00 nginx: worker process
root        5803  0.0  0.0 221680  2304 pts/0    S+   15:17   0:00 grep --color=auto nginx
[root@node1 sbin]# kill -WINCH 5750
[root@node1 sbin]# ps aux | grep nginx
root        5708  0.0  0.0  10060  2108 ?        Ss   13:46   0:00 nginx: master process nginx
root        5750  0.0  0.1   9764  6528 ?        S    13:53   0:00 nginx: master process nginx
nginx       5800  0.0  0.1  14384  5180 ?        S    15:17   0:00 nginx: worker process
nginx       5801  0.0  0.1  14384  5180 ?        S    15:17   0:00 nginx: worker process
root        5805  0.0  0.0 221680  2304 pts/0    S+   15:18   0:00 grep --color=auto nginx
[root@node1 sbin]# curl -I 172.25.254.200
HTTP/1.1 403 Forbidden
Server: nginx/1.20.1
Date: Sat, 17 Aug 2024 07:18:46 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive恢复原来的文件,然后杀掉新的进程。则恢复到原来的版本
[root@node1 sbin]# cp nginx nginx.new
[root@node1 sbin]# \cp -f nginx.old nginx
[root@node1 sbin]# kill -9 5750

三、nginx常用参数

-v : show version and exit :显示版本信息

-V : show version and configure options then exit #显示版本和编译参数

[root@Nginx ~]# nginx -v

[root@node1 sbin]# nginx -v
nginx version: nginx/1.20.1
[root@node1 sbin]#[root@node1 sbin]# nginx -V
nginx version: nginx/1.20.1
built by gcc 11.3.1 20221121 (Red Hat 11.3.1-4) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --with-ld-opt='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,-E'

-h : this help    帮助

[root@node1 sbin]# nginx -help
nginx version: nginx/1.20.1
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-p prefix     : set prefix path (default: /usr/share/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

-t : test configuration and exit        #测试配置文件是否异

[root@node1 sbin]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

-T : test configuration, dump it and exit    #测试并且会将你文件里边的内容全部打印出来

[root@node1 sbin]# nginx -T
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;略。。。。。。。。。。。

-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: /etc/nginx/) #指定Nginx 目录

-c filename : set configuration file (default: /etc/nginx/nginx.conf) # 配置文件路径

-g directives : set global directives out of configuration file #设置全局指令,注意和 配置文件不要同时配置,否则冲突

四、nginx服务的启动脚本

[root@node1 sbin]# 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  #在启动nginx的时候以上服务会被自动激活
Wants=network-online.target      #依赖性,我希望这个服务在启动的时候是被自动激活的                 [Service]
Type=forking      #类型是forkin函数
PIDFile=/usr/local/nginx/logs/nginx.pid     #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@node1 sbin]# systemctl daemon-reload
[root@node1 sbin]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@node1 sbin]#

五、nginx全局参数优化

[root@node1 ~]# vim /usr/local/nginx/conf/nginx.confuser  nginx;
worker_processes  auto;
worker_cpu_affinity 0001 0010;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  100000;
}[root@node1 ~]# vim /etc/security/limits.conf
在最后一行写以下参数nginx            -      nofile          100000[root@node1 ~]# sudo -u nginx ulimit -a
[root@node1 ~]# sudo -u nginx ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) 0
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 14258
max locked memory           (kbytes, -l) 8192
max memory size             (kbytes, -m) unlimited
open files                          (-n) 100000      (在文件中添加之后这会发生改变)
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 14258
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited
[root@node1 ~]# nginx -s reload压力测试
[root@node1 ~]# ab -n 10000 -c 5000 http://172.25.254.200/index.html
This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 172.25.254.200 (be patient)
socket: Too many open files (24)(以上显示访问太多扛不住)还在可控范围内
[root@node1 ~]# ab -n 10000 -c 500 http://172.25.254.200/index.html
This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 172.25.254.200 (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 requestsServer Software:        nginx/1.20.1
Server Hostname:        172.25.254.200
Server Port:            80Document Path:          /index.html
Document Length:        153 bytesConcurrency Level:      500
Time taken for tests:   0.279 seconds
Complete requests:      10000
Failed requests:        0
Non-2xx responses:      10000
Total transferred:      3030000 bytes
HTML transferred:       1530000 bytes
Requests per second:    35811.49 [#/sec] (mean)
Time per request:       13.962 [ms] (mean)
Time per request:       0.028 [ms] (mean, across all concurrent requests)
Transfer rate:          10596.56 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    6   2.0      5      13
Processing:     2    8   3.5      7      26
Waiting:        0    6   3.3      5      23
Total:          6   14   3.7     13      29Percentage of the requests served within a certain time (ms)50%     1366%     1575%     1680%     1690%     1795%     1898%     2499%     28100%     29 (longest request)可在日志中进行查看
[root@node1 ~]# cat /var/log/nginx/access.log
"-" "ApacheBench/2.3" "-"
172.25.254.200 - - [17/Aug/2024:17:20:11 +0800] "GET /index.html HTTP/1.0" 404 153 "-" "ApacheBench/2.3" "-"
172.25.254.200 - - [17/Aug/2024:17:20:11 +0800] "GET /index.html HTTP/1.0" 404 153 "-" "ApacheBench/2.3" "-"
172.25.254.200 - - [17/Aug/2024:17:20:11 +0800] "GET /index.html HTTP/1.0" 404 153 "-" "ApacheBench/2.3" "-"
172.25.254.200 - - [17/Aug/2024:17:20:11 +0800] "GET /index.html HTTP/1.0" 404 153 "-" "ApacheBench/2.3" "-"

六、lnginx配置中的root和alias

[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
events {worker_connections  100000;use epoll;
}略。。。。。。。。。#gzip  on;include "/usr/local/nginx/conf.d/*.conf";server {listen       80;server_name  localhost;[root@node1 ~]# mkdir -p /usr/local/nginx/conf.d[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;
}
~
[root@node1 ~]# mkdir -p /data/web/html[root@node1 ~]# echo www.laokang.org > /data/web/html/index.html
[root@node1 ~]# nginx -s reload
[root@node1 ~]# curl www.laokang.org
www.laokang.org[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.confserver {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location /test1/ {root  /data/web;
}}
~[root@node1 ~]# mkdir /data/web/test1
[root@node1 ~]# echo /data/web/test1 > /data/web/test1/index.html
[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org/test1/
/data/web/test1[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location /test1/ {root  /data/web;
}location /test2 {         #相当于给test1做了一个软连接alias /data/web/test1;
}
}[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org/test2/
/data/web/test1

七、location的用法以及优先级

1、定义

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;

ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配, 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最 高的一个uri

uri是用户请求的字符串,即域名后面的web文件路径

然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理 此请求。

2、语法规则:

#语法规则: location [ = | ~ | ~* | ^~ ] uri { ... }

=         #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立 即处理请求

^~         #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头 #对uri的最左边部分做匹配检查,不区分字符大小写

~         #用于标准uri前,表示包含正则表达式,并且区分大小写

~*         #用于标准uri前,表示包含正则表达式,并且不区分大写

不带符号         #匹配起始于此uri的所有的uri

\         #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:

=, ^~, ~/~*, 不带符号

3、优先级测试

[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.confserver {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location = /test {root  /data/web2;
}location /test {root  /data/web1;
}location ^~ /t {root  /data/web3;
}location ~* .HTML$ {root  /data/web5;
}location ~ .html$ {root  /data/web4;
}
}
~
[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org/test/index.html
test web5[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location = /test {root  /data/web2;
}location /test {root  /data/web1;
}location ^~ /t {root  /data/web3;
}
#       location ~* .HTML$ {
#               root  /data/web5;
#}location ~ .html$ {root  /data/web4;
}
}
[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org/test/index.html
test web4
[root@node1 ~]#[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location = /test {root  /data/web2;
}location /test {root  /data/web1;
}location ^~ /t {root  /data/web3;
}
#       location ~* .HTML$ {
#               root  /data/web5;
#}
#       location ~ .html$ {
#               root  /data/web4;
#}
}
[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org/test/index.html
test web1[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.confserver {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location = /test {root  /data/web2;
}
#       location /test {
#               root  /data/web1;
#}location ^~ /t {root  /data/web3;
}
#       location ~* .HTML$ {
#               root  /data/web5;
#}
#       location ~ .html$ {
#               root  /data/web4;
#}
}
[root@node1 ~]# systemctl restart nginx.service[2]+  已停止               vim /usr/local/nginx/conf.d/vhost.conf
[root@node1 ~]# curl www.laokang.org/test/index.html
test web3

八、nginx的用户认证

[root@node1 ~]#  dnf install httpd-tools
[root@node1 ~]# htpasswd -cm /usr/local/nginx/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin
[root@node1 ~]# cat /usr/local/nginx/.htpasswd
admin:$apr1$IDZBut6K$uri3VMd37GFwsSZSJfKEJ/
[root@node1 ~]# htpasswd -m /usr/local/nginx/.htpasswd laokang
New password:
Re-type new password:
Adding password for user laokang
[root@node1 ~]# mkdir /data/web/kang
[root@node1 ~]# echo kang > /data/web/kang/index.html
[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;location  /kang {root /data/web;auth_basic "login password !!";auth_basic_user_file "/usr/local/nginx/.htpasswd";
}[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]#

九、自定义

(一)自定义错误页面

[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;error_page 404 /40x.html;location  /kang {root /data/web;auth_basic "login password !!";auth_basic_user_file "/usr/local/nginx/.htpasswd";
}location = /40x.html {root /data/web/errorpage;
}[root@node1 ~]# mkdir -p /data/web/errorpage
[root@node1 ~]# echo error page > /data/web/errorpage/40x.html
[root@node1 ~]# systemctl restart nginx.service

(二)自定义日志

 日志会默认存放在 /var/local/nginx/logs下

有access.log和error.log两个文件

[root@node1 ~]# ll /usr/local/nginx/logs/
总用量 2172
-rw-r--r-- 1 root root 2211453  8月 17 21:24 access.log
-rw-r--r-- 1 root root    4919  8月 17 21:24 error.log
-rw-r--r-- 1 root root       5  8月 17 21:24 nginx.pid
 

[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;error_page 404 /40x.html;error_log /var/log/laokang.org/error.log;access_log /var/log/laokang.org/access.org;[root@node1 ~]# mkdir -p /var/log/laokang.org
[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org
www.laokang.org
[root@node1 ~]# cat /var/log/laokang.org/access.org
172.25.254.200 - - [17/Aug/2024:21:35:11 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.76.1"
[root@node1 ~]# curl www.laokang.org/aaa
error page
[root@node1 ~]# cat /var/log/laokang.org/error.log
2024/08/17 21:35:55 [error] 4192#0: *2 open() "/data/web/html/aaa" failed (2: No such file or directory), client: 172.25.254.200, server: www.laokang.org, request: "GET /aaa HTTP/1.1", host: "www.laokang.org"
[root@node1 ~]#

十、检测文件是否存在

[root@node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {listen 80;server_name www.laokang.org;root    /data/web/html;index   index.html;error_page 404 /40x.html;error_log /var/log/laokang.org/error.log;access_log /var/log/laokang.org/access.org;try_files $uri $uri.html $uri/index.html /error/default.html;[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# curl www.laokang.org
www.laokang.org
[root@node1 ~]#  rm -fr /data/web/html/index.html经过检测之后如果没有$uri $uri.html $uri/index.html /error/default.html;这些文件就会报500的错误
[root@node1 ~]# curl www.laokang.org
<html>
<head><title>500 Internal Server Error</title></head>
<body>
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx/1.26.2</center>
</body>
</html>
</html>[root@node1 ~]# mkdir /data/web/html/error
[root@node1 ~]# echo error default > /data/web/html/error/default.html
[root@node1 ~]# curl www.laokang.org
error default

十一、nginx中长连接的管理

测试工具
[root@node1 ~]# dnf install telnet -y
第一次测试,
[root@node1 ~]# telnet www.laokang.org 80
Trying 172.25.254.200...
Connected to www.laokang.org.
Escape character is '^]'.
GET / HTTP/1.1
HOST:www.laokang.orgHTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:01:38 GMT
Content-Type: text/html
Content-Length: 16
Last-Modified: Sat, 17 Aug 2024 14:01:21 GMT
Connection: keep-alive
ETag: "66c0ad31-10"
Accept-Ranges: byteswww.laokang.org
GET / HTTP/1.1
HOST:www.laokang.orgHTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:02:04 GMT
Content-Type: text/html
Content-Length: 16
Last-Modified: Sat, 17 Aug 2024 14:01:21 GMT
Connection: keep-alive
ETag: "66c0ad31-10"
Accept-Ranges: byteswww.laokang.org
^ZConnection closed by foreign host.
第一次测试,我们没有设置发起长连接的请求次数,所以这里是手动停止的[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;   设置等待请求的时间为65skeepalive_requests 2;    设置发起长连接的次数位2次
[root@node1 ~]# systemctl restart nginx.service第二次测试
[root@node1 ~]# telnet www.laokang.org 80
Trying 172.25.254.200...
Connected to www.laokang.org.
Escape character is '^]'.
GET / HTTP/1.1
HOST:www.laokang.orgHTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:02:45 GMT
Content-Type: text/html
Content-Length: 16
Last-Modified: Sat, 17 Aug 2024 14:01:21 GMT
Connection: keep-alive
ETag: "66c0ad31-10"
Accept-Ranges: byteswww.laokang.org
GET / HTTP/1.1
HOST:www.laokang.orgHTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:03:00 GMT
Content-Type: text/html
Content-Length: 16
Last-Modified: Sat, 17 Aug 2024 14:01:21 GMT
Connection: close
ETag: "66c0ad31-10"
Accept-Ranges: byteswww.laokang.org
Connection closed by foreign host.
测试完两次之后他是自动结束的

十二、nginx下载服务器的设定优化

[root@node1 ~]# mkdir /data/web/download做一个大小位100兆的文件,把他放在/data/web/download/leefile,他的数据从/dev/zero里拷出来
[root@node1 ~]# dd if=/dev/zero of=/data/web/download/leefile bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.0468224 s,2.2 GB/s
[root@node1 ~]#  vim /usr/local/nginx/conf.d/vhost.conflocation /download {root /data/web;autoindex on;autoindex_localtime on;autoindex_exact_size off;limit_rate 1024k;}[root@node1 ~]# systemctl restart nginx.service
[root@node1 ~]# wget www.laokang.org/leefile
--2024-08-17 22:29:35--  http://www.laokang.org/leefile
正在解析主机 www.laokang.org (www.laokang.org)... 172.25.254.200
正在连接 www.laokang.org (www.laokang.org)|172.25.254.200|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:14 [text/html]
正在保存至: “leefile”leefile                    100%[=======================================>]      14  --.-KB/s  用时 0s2024-08-17 22:29:35 (2.31 MB/s) - 已保存 “leefile” [14/14])

十三、nginx状态页

[root@node1 ~]# cd /usr/local/nginx/conf.d/
[root@node1 conf.d]# vim status.conf
server {listen 80;server_name status.laokang.org;root    /data/web/html;index   index.html;location /status {stub_status;#auth_basic "login";#auth_basic_user_file "/usr/local/nginx/.htpasswd";}
}[root@node1 conf.d]# systemctl restart nginx.service
[root@node1 conf.d]# vim /etc/hosts
172.25.254.200    node1.laokang.org www.laokang.org status.laokang.org[root@node1 conf.d]# systemctl restart nginx.service

十四、nginx数据压缩功能

[root@node1 conf.d]# vim /usr/local/nginx/conf/nginx.confgzip  on;gzip_comp_level 5;gzip_min_length 1k;gzip_http_version 1.1;gzip_vary on;gzip_types text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/gif image/png;[root@node1 conf.d]# systemctl restart nginx.service
[root@node1 conf.d]# echo hello goudan > /data/web/html/small.html
[root@node1 conf.d]# du -sh /usr/local/nginx/logs/access.log
2.2M    /usr/local/nginx/logs/access.log
[root@node1 conf.d]# cat /usr/local/nginx/logs/access.log > /data/web/html/big.html测试查看效果
[root@node1 conf.d]# curl --head --compressed 172.25.254.200/small.html
HTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:56:34 GMT
Content-Type: text/html
Content-Length: 13
Last-Modified: Sat, 17 Aug 2024 14:55:00 GMT
Connection: keep-alive
ETag: "66c0b9c4-d"
Accept-Ranges: bytes[root@node1 conf.d]# curl --head --compressed 172.25.254.200/big.html
HTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Sat, 17 Aug 2024 14:56:48 GMT
Content-Type: text/html
Last-Modified: Sat, 17 Aug 2024 14:55:50 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"66c0b9f6-21d3e4"
Content-Encoding: gzip

十五、nginx内键变

[root@nginx conf.d]# vim /usr/local/nginx/conf.d/var.confserver {listen 80;server_name var.laokang.org;root /data/web/html;index index.html;location /var {default_type text/html;set $laokang lee;echo $laokang;
#               echo $remote_addr;
#               echo $args;
#               echo $is_args;
#               echo $document_root;
#               echo $document_uri;
#               echo $host;
#               echo $remote_port;
#               echo $remote_user;
#               echo $request_method;
#               echo $request_filename;
#               echo $request_uri;
#               echo $scheme;
#               echo $server_protocol;
#               echo $server_addr;
#               echo $server_name;
#               echo $server_port;
#               echo $http_user_agent;
#               echo $http_cookie;
#               echo $cookie_key2;

十六、nginx的rewrite模块功能

[root@nginx test2]# vim /usr/local/nginx/conf.d/var.conf
server {listen 80;server_name var.laokang.org;root /data/web/html;index index.html;location /var {default_type text/html;set $timinglee lee;echo $timinglee;default_type text/html;echo $remote_addr;echo $args;echo $is_args;echo $document_root;echo $document_uri;echo $host;echo $remote_port;echo $remote_user;echo $request_method;echo $request_filename;echo $request_uri;echo $scheme;echo $server_protocol;echo $server_addr;echo $server_name;echo $server_port;echo $http_user_agent;echo $http_cookie;echo $cookie_key2;}
}
测试
[root@nginx test2]# curl -b "key1=lee,key2=lee1" -u lee:lee var.laokang.org/var?name=lee&&id=6666
lee
172.25.254.100
name=lee
?
/data/web/html
/var
var.laokang.org
52958
lee
GET
/data/web/html/var
/var?name=lee
http
HTTP/1.1
172.25.254.100
var.laokang.org
80
curl/7.76.1
key1=lee,key2=lee1
lee1#if判定location /test2 {if ( !-e $request_filename ){echo "$request_filename is not exist";}}[root@nginx test2]# curl var.laokang.org/test2/index.html
test2#breaklocation /break {default_type text/html;set $name lee;echo $name;if ( $http_user_agent = "curl/7.76.1" ){break;}set $id 666;echo $id;}[root@nginx test2]# curl var.laokang.org/break
lee[root@nginx test2]# curl -A ""firefox var.laokang.org/break
lee
666#returnlocation /return {default_type text/html;if ( !-e $request_filename){return 301 http://www.baidu.com;}echo "$request_filename is exist";}#检测
[root@nginx test2]# curl -I var.laokang.org/return
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Sun, 18 Aug 2024 11:54:07 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encodingrewirte  临时和永久location / {root /data/web/var;index index.html;rewrite / http://www.timinglee.com permanent;#rewrite / http://www.timinglee.com redirect;}#测试
[root@nginx test2]# curl -I var.laokang.org
HTTP/1.1 301 Moved Permanently
Server: nginx/1.26.1
Date: Sun, 18 Aug 2024 11:55:29 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://www.timinglee.com
#break 和last[root@nginx-node1 conf.d]# mkdir  /data/web/html/{test1,test2,break,last} -p
[root@nginx-node1 conf.d]# echo test1 > /data/web/html/test1/index.html
[root@nginx-node1 conf.d]# echo test2 > /data/web/html/test2/index.html
[root@nginx-node1 conf.d]# echo last > /data/web/html/last/index.html
[root@nginx-node1 conf.d]# echo break > /data/web/html/break/index.html
[root@nginx test2]# cat /usr/local/nginx/conf.d/vars.conf
server {listen 80;server_name var.laokang.org;root    /data/web/html;index   index.html;location /break {root    /data/web/html;rewrite ^/break/(.*) /test1/$1 break;rewrite ^/test1/(.*) /test2/$1 ;}location /last {root    /data/web/html;rewrite ^/last/(.*) /test1/$1 last;rewrite ^/test1/(.*) /test2/$1 ;}location /test1 {default_type test/html;return 666 "timinglee  hahahahahahahahahahahahahah";}location /test2 {root /data/web/httml;}
}

十七、nginx-rewrite的企业示例及防盗链

访问强制加密:

[root@nginx conf.d]# cd /usr/local/nginx/
[root@nginx nginx]# mkdir certs
[root@nginx nginx]# openssl req  -newkey  rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/timinglee.org.key -x509  -days 365 -out /usr/local/nginx/certs/timinglee.org.crt[root@nginx conf.d]# cat ssl.conf
server {listen 80;listen 443 ssl;server_name www.laokang.org;root /data/web/html;index index.html;ssl_certificate /usr/local/nginx/certs/timinglee.org.crt;ssl_certificate_key /usr/local/nginx/certs/timinglee.org.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;location / {if ( $scheme = http ){rewrite / https://$host redirect;}}

防盗链

 先将照片放入默认发布目录

[root@nginx html]# vim /usr/local/nginx/conf.d/ssl.confserver {listen 80;listen 443 ssl;server_name www.laokang.org;root /data/web/html;index index.html;ssl_certificate /usr/local/nginx/certs/timinglee.org.crt;ssl_certificate_key /usr/local/nginx/certs/timinglee.org.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;#     location / {#             if ( $scheme = http ){#             rewrite /(.*) https://$host redirect;#                      }#     }#        if ( !-e $request_filename ){#          rewrite /(.*) https://$host/index.html redirect;#      }location /  {valid_referers none blocked server_names *.laokang.org ~/.baidu/.;if ( $invalid_referer ){rewrite ^/   http://www.laokang.org/tao.jpg;}}}另一台主机[root@node1 ~]# dnf install httpd
[root@node1 ~]# cd /var/www/html/
[root@node1 html]# vim index.html<html><head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><title>盗链</title>
</head><body><img src="http://www.laokang.org/images/taoshi1.jpg" ><h1 style="color:red">欢迎大家</h1><p><a href=http://www.laokang.org>狂点陶师傅</a>向你敬礼</p></body></html>[root@node1 html]# systemctl restart httpd.service

十八、nginx的反向代理及动静分离

反向代理

node1

[root@node1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@node1 ~]# echo 172.25.254.10 > /var/www/html/index.html
服务器:

代理只能写一个
[root@nginx html]# vim /usr/local/nginx/conf.d/http.conf
[root@nginx html]# cat /usr/local/nginx/conf.d/http.conf
server {listen 80;server_name www.laokang.org;location / {proxy_pass http://172.25.254.10:80;
}
[root@nginx html]# curl www.laokang.org
172.25.254.10

动静分明:

[root@nginx html]# vim /usr/local/nginx/conf.d/http.conf
[root@nginx html]# cat /usr/local/nginx/conf.d/http.conf
server {listen 80;server_name www.laokang.org;location ~ \.php$ {proxy_pass http://172.25.254.10:80;
}location /static {proxy_pass http://172.25.254.20:8080;
}}[root@nginx html]# systemctl restart nginx.servicenode1:
[root@node1 ~]# yum install php -y
[root@node1 ~]# systemctl restart httpd.service
[root@node1 ~]# vim /var/www/html/index.php
[root@node1 ~]# cat /var/www/html/index.php
<?phpphpinfo();
?>

动静分里测试:

 二、fastcgi(nginx和php共存)

一、源码编译php

首先我们,将所需要的模块添加进去

解压模块
tar zxf memc-nginx-module-0.20.tar.gz
tar zxf srcache-nginx-module-0.33.tar.gz重新编译nginx
./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module  ./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module make && make install

下载php并进行编译

解压下载

 tar zxf php-8.3.9.tar.gzcd php-8.3.9/
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx  --with-curl --with-iconv --with-mhash --with-zlib  --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd
编译的话因为缺少一些软件,所以编译错误,提示你需要下载一些软件,完成之后才能编译成功
以下是我编译时需要的软件:
yum install libpng-devel.x86_64yum install libcurl-devel.x86_64yum install oniguruma-devel
还有一个是软件仓库没有所以需要在官网去下载,下载之后进行下载rpm -ivh oniguruma-devel-6.9.6-1.el9.5.x86_64
make && make install

二、php的配置

 cd /usr/local/php/etc/cp  php-fpm.conf.default php-fpm.convim php-fpm.conf
。。。。。。。。略
[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
pid = run/php-fpm.pid
。。。。。。。。略cd php-fpm.d/cp www.conf.default www.confcd /root/php-8.3.9/cp php.ini-production /usr/local/php/etc/php.ini
更改时区:vim /usr/local/php/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Shanghai 生成启动文件
cp sapi/fpm/php-fpm.service /lib/systemd/system/
ls /lib/systemd/system
vim /lib/systemd/system/php-fpm.service
注释以下内容:
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by
this unit.
#ProtectSystem=full 
systemctl start php-fpm.service
netstat -antlupe | grep php
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      0          39197      1940/php-fpm: maste

三、nginx和php的整合

 [root@nginx ~]#cd /usr/local/php/bin/[root@nginx ~]#vim ~/.bash_profile
[root@nginx ~]# cat ~/.bash_profile
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# User specific environment and startup programs
export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin[root@nginx ~]#source ~/.bash_profile[root@nginx ~]#mkdir /data/php -p[root@nginx ~]#cat /data/php/index.php[root@nginx ~]# vim /data/php/index.php
[root@nginx php]# cat /data/web/php/index.php
<?phpphpinfo();
?>
[root@nginx php]# vim /usr/local/nginx/conf/nginx.conf#gzip  on;include "/usr/local/nginx/conf.d/*.conf";server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;
[root@nginx php]# vim /usr/local/nginx/conf.d/vhosts.conf[3]+  已停止               vim /usr/local/nginx/conf.d/vhosts.conf
[root@nginx php]# cat /usr/local/nginx/conf.d/vhosts.confserver {listen 80;server_name php.laokang.org;root /date/web/html;index index.html;location ~ \.php$ {root /data/web/php;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}
}
[root@nginx php]# nginx -s reload

四、nginx-php缓存

安装memcache模块

[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-nonzts-20230831/
[root@Nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts20230831/
memcache.so opcache.so

复制测试文件到nginx发布目录中

[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# ls
autom4te.cache config.log configure.ac example.php Makefile.fragments
README
build config.m4 config.w32 include Makefile.objects runtests.php
config9.m4 config.nice CREDITS libtool memcache.la src
config.h config.status docker LICENSE memcache.php
tests
config.h.in configure Dockerfile Makefile modules
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/web/php
[root@Nginx ~]# vim /data/web/php/memcache.phpdefine('ADMIN_USERNAME','admin'); // Admin Username  修改用户
define('ADMIN_PASSWORD','lee'); // Admin Password    设置密码
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
注释下面这一行
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

配置php加载memcache模块

[root@Nginx ~]# vim /usr/local/php/etc/php.ini
;extension=zip
extension=memcache
;zend_extension=opcache
[root@Nginx ~]# systemctl reload php-fpm
[root@nginx php]# php -m | grep mem
memcache

部署memcached

[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service
[root@Nginx ~]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN
976 1037243 186762/memcached
[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"

测试

访问 http://php.timinglee.org/example.php 不断刷新 访问 http://php.timinglee.org/memcache.php 查看命中效果

五、php高速缓存

在原来的配置基础上进行操作

[root@nginx php]# vim /usr/local/nginx/conf.d/vhosts.conf
\
[5]+  已停止               vim /usr/local/nginx/conf.d/vhosts.conf
[root@nginx php]# cat /usr/local/nginx/conf.d/vhosts.conf
upstream memcache {server 127.0.0.1:11211;keepalive 512;
}server {listen 80;server_name php.laokang.org;root /date/web/html;index index.html;location /memc {internal;memc_connect_timeout 100ms;memc_send_timeout 100ms;memc_read_timeout 100ms;set $memc_key $query_string;set $memc_exptime 300;memc_pass memcache;
}location ~ \.php$ {root /data/web/php;set $key $uri$args;srcache_fetch GET /memc $key;srcache_store PUT /memc $key;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;}
}
[root@nginx php]#  ab -n500 -c10 http://php.laokang.org/index.phpConcurrency Level:      10
Time taken for tests:   0.047 seconds
Complete requests:      500
Failed requests:        0
Non-2xx responses:      500
Total transferred:      154500 bytes
HTML transferred:       78500 bytes
Requests per second:    10597.49 [#/sec] (mean)
Time per request:       0.944 [ms] (mean)
Time per request:       0.094 [ms] (mean, across all concurrent requests)
Transfer rate:          3197.87 [Kbytes/sec] received

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405632.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库MySQL之事务、索引

目录 1.概述 2.事务 3.索引 3.1索引结构 3.2操作语法 1.概述 场景&#xff1a;假如我们需要解散教学部&#xff0c;那么该部门下的所有员工都需要删除。如果教学部成功删除了&#xff0c;但员工出于某些原因(比如SQL语句写错了等)并没有删除&#xff0c;此时就会出现数据…

Unity Dots学习 (一)

先学习怎么使用&#xff0c;再研究底层代码。Dots大家都有所耳闻。一直没时间研究&#xff0c;最近研究一下 看上图可知&#xff0c;哪怕是CPU的第三级缓存也比内存要快2-5倍。 资料&#xff1a; 《DOTS之路》第零节——前导课(1)——DOTS的5W1H问题_哔哩哔哩_bilibili 《DOT…

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)

经历上一篇《零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功》的发布已经过去三天啦&#xff0c; 零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功-CSDN博客 在友友的催更下&#xff0c;我将用我…

人脸识别设计

总体思路 人脸识别使用的算法思路为&#xff1a;首先&#xff0c;定位一张图像中所有的人脸位置&#xff1b;其次&#xff0c;对于同一张脸&#xff0c;当光线改变或者朝向方位改变时&#xff0c;算法还能判断是同一张脸&#xff1b;然后找到每一张脸不同于其他脸的独特之处&a…

【秋招笔试】8.18大疆秋招(第一套)-后端岗

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

Linux安装redis和使用redisDesktop连接

目录 Linux安装redis及启动 第一步&#xff1a;下载redis压缩包 第二步&#xff1a;下载gcc-c 第三步&#xff1a;解压redis文件 第四步&#xff1a;进入redis-4.0.0.0目录执行make命令 第五步&#xff1a;安装redis到redis目录 第五步&#xff1a;复制redis.conf配置文件…

std::wcout,std::cout控制台输出中文乱码,std::cerr字符串的字符无效

系列文章目录 文章目录 系列文章目录前言一、中文乱码原因二、解决方法1.如果是windos11下&#xff0c;使用英文语言&#xff0c;需要加以下代码2.如果是中文语言只需要一行关键代码3.如果在异常处理中显示宽字符中文4.完整代码如下&#xff1a;实现文件测试代码输出打印 前言 …

Java异常捕获与处理:深入理解与实践

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

SAM 2——视频和图像实时实例分割的全新开源模型

引言 源码地址&#xff1a;https://github.com/facebookresearch/segment-anything-2 过去几年&#xff0c;人工智能领域在文本处理的基础人工智能方面取得了显著进步&#xff0c;这些进步改变了从客户服务到法律分析等各个行业。然而&#xff0c;在图像处理方面&#xff0c;我…

高考志愿智能推荐系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

数据采集监控平台内置SPC系统 提供统计控制功能

数据采集监控平台为了能多方位的为工作人员提供可视化界面&#xff0c;而不仅仅是采集显示这种单一功能&#xff0c;内置多种配置&#xff0c;而SPC系统就是提供统计控制功能的一个重要系统。 数据采集监控平台内置的统计过程控制&#xff08;Statistical Process Control, SPC…

Python3 运算符,数据类型,基本方法,学习

注意&#xff1a;部分代码直接复制菜鸟教程&#xff0c;在本地编辑器里运行 运算符 算术运算符 #!/usr/bin/python3a 21 b 10 c 0c a b print ("1 - c 的值为&#xff1a;", c)c a - b print ("2 - c 的值为&#xff1a;", c)c a * b print (&quo…

【电子数据取证】AES解密侵犯隐私案件数据

关键词&#xff1a;电子数据取证、手机取证、计算机取证 一、前言 在大数据时代&#xff0c;数据安全和隐私保护的重要性愈发显著。近期&#xff0c;我们遇到一起侵犯公民隐私的案件&#xff0c;其复杂性与敏感性要求我们采取更为精细和专业的技术手段。在还原涉案数据库至本地…

【JAVA入门】Day24 - 排序算法

【JAVA入门】Day24 - 排序算法 文章目录 【JAVA入门】Day24 - 排序算法一、冒泡排序二、选择排序三、插入排序四、快速排序4.1 递归4.2 快速排序 排序&#xff0c;是把混乱的数据排成从小到大或从大到小。 排序一共有十种左右&#xff0c;它们是&#xff1a;冒泡排序、…

Ciallo~(∠・ω・ )⌒☆第二十二篇 入门request请求库使用

请求库是用于发送HTTP请求的工具。常见的请求库有requests&#xff0c;它是一个功能强大且易于使用的HTTP库。 使用requests库发送GET请求&#xff1a; import requests url "https://httpbin.org/get"# 携带get请求参数 params {"pn": 10,"size&q…

Android大脑--systemserver进程

用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 本文摘要 系统native进程的文章就先告一段落了&#xff0c;从这篇文章开始写Java层的文章&#xff0c;本文同样延续自述的方式来介绍systemserver进程&#xff0c;通过本文您将…

8个我平时每天都会看的网站,涵盖办公、娱乐、学习等

分享8个我平时每天都会看的网站&#xff0c;涵盖办公、娱乐、学习等多种类别&#xff0c;试过就知道有多好用&#xff01; 1、MyFreeMP3 tools.liumingye.cn/music/#/ 一个可以免费听歌的平台&#xff0c;不用充会员&#xff0c;里面收录了大多数的国内外知名流行歌手、乐队的…

电脑开机LOGO修改教程_BIOS启动图片替换方法

准备工具&#xff1a;刷BIOS神器和change logo&#xff0c;打包下载地址&#xff1a;https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器&#xff0c;点击备份BIOS&#xff0c;保存到桌面 二.打开change logo&#xff0c;1.点击load image&#xff0c;选…

Linux云计算 |【第二阶段】SECURITY-DAY1

主要内容&#xff1a; 监控基础&#xff08;系统监控命令、监控软件&#xff09;、Zabbix监控服务端部署、Zabbix监控客户端部署、创建监控主机、调用监控模板、自定义key、创建模板、应用集、监控项、绑定模板&#xff1b; 一、监控概述 1&#xff09;监控的目的 ① 实时报…

LED电子看板优化生产线的管理

在当今竞争激烈的制造业领域&#xff0c;企业不断寻求提高生产效率、降低成本和提升产品质量的方法。而 LED 电子看板作为一种先进的管理工具&#xff0c;正逐渐成为优化生产线管理的关键利器。 一、LED电子看板能够清晰地展示生产进度信息 在繁忙的生产线上&#xff0c;工人和…