当前位置: 首页 > news >正文

Nginx知识详解(理论+实战更易懂)

目录

一、Nginx架构和安装

1.1 Nginx 概述

1.1.1 nginx介绍

1.1.2?Nginx 功能介绍

1.1.3?基础特性

1.1.4?Web 服务相关的功能

1.2?Nginx 架构和进程

1.2.1?Nginx 进程结构

1.2.2?Nginx 进程间通信

1.2.3?Nginx 启动和 HTTP 连接建立

1.2.4?HTTP 处理过程

1.3?Nginx 模块介绍

1.4 Nginx安装

1.4.1?Nginx版本和安装方式

1.4.2?Nginx 编译安装

1.4.2.1 编译安装Nginx

1.4.2.2?验证版本及编译参数

1.5 平滑升级和回滚

二、Nginx核心配置详解

三、Nginx 高级配置

四、Nginx Rewrite 相关功能

4.1?ngx_http_rewrite_module 模块指令

4.1.1 if 指令

4.1.2 set 指令

4.1.3 break 指令

4.1.4 return 指令

4.2?rewrite 指令

4.2.1?rewrite flag 使用介绍

?4.2.2?rewrite案例: 域名永久与临时重定向

4.2.2.1?永久重定向301

4.2.2.2?临时重定向302

4.2.3?rewrite 案例: break 与 last

4.2.4?rewrite案例: 自动跳转 https

?4.3 nginx 防盗链

4.3.1?实现盗链

4.3.2 实现防盗链

五、nginx反向代理功能

六、实现FastCGI

?6.1?FastCGI配置指令

6.2?FastCGI实战案例 : Nginx与php-fpm在同一服务器

?6.3?php的动态扩展模块(php的缓存模块)

?6.4 php高速缓存

?七、nginx 二次开发版本

7.1?openresty

7.2 编译安装 openresty


一、Nginx架构和安装

1.1 Nginx 概述

1.1.1 nginx介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购。

Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。

解决C10K问题(10K Connections)。

Nginx官网:nginx news

nginx的其它的二次发行版:

  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openr esty.org/cn/
1.1.2Nginx 功能介绍
  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理
1.1.3基础特性
  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile
1.1.4Web 服务相关的功能
  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

1.2Nginx 架构和进程

1.2.1Nginx 进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

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

主进程(master process)的功能:

  • 对外接口:接收外部的操作(信号)
  • 对内转发:根据外部的操作的不同,通过信号管理 Worker
  • 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  • 读取Nginx 配置文件并验证其有效性和正确性
  • 建立、绑定和关闭socket连接
  • 按照配置生成、管理和结束工作进程 接受外界指令,比如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应用新的配置
  • 开启日志文件,获取文件描述符
  • 不中断服务,实现平滑升级,升级失败进行回滚处理
  • 编译和处理perl脚本

工作进程(worker process)的功能:

  • 所有 Worker 进程都是平等的
  • 实际处理:网络请求,由 Worker 进程处理
  • Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源
  • 增加上下文切换的损耗
  • 接受处理客户的请求
  • 将请求依次送入各个功能模块进行处理
  • I/O调用,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调用缓存数据
  • 发送请求结果,响应客户的请求
  • 接收主程序指令,比如重启、升级和退出等

1.2.2Nginx 进程间通信

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

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

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等。操作系统提供了共享内存机制。

1.2.3Nginx 启动和 HTTP 连接建立

  • Nginx 启动时,Master 进程,加载配置文件
  • Master 进程,初始化监听的 socket
  • Master 进程,fork 出多个 Worker 进程
  • Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
1.2.4HTTP 处理过程

1.3Nginx 模块介绍

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件 驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应 头设置 等等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
  • 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的 支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支 持等

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载

模块分类:

核心模块:core module

标准模块:

HTTP 模块: ngx_http_*

HTTP Core modules #默认功能

HTTP Optional modules #需编译时指定

Mail 模块: ngx_mail_*

Stream 模块 ngx_stream_*

第三方模块

1.4 Nginx安装

1.4.1Nginx版本和安装方式

Nginx版本:

  • Mainline version 主要开发版本,一般为奇数版本号,比如1.19
  • Stable version 当前最新稳定版,一般为偶数版本,如:1.20
  • Legacy versions 旧的稳定版,一般为偶数版本,如:1.18

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

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

编译器介绍:

源码安装需要提前准备标准的编译器,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模块) 等。

1.4.2.1 编译安装Nginx

官方源码包下载地址:

nginx: download

编译安装:

[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y

[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz

[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

[root@Nginx nginx]# cd nginx-1.24.0/

[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 sbin

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.4.2.2验证版本及编译参数

[root@Nginx ~]# vim ~/.bash_profile

export PATH=$PATH:/usr/local/nginx/sbin

[root@Nginx ~]# source ~/.bash_profile

[root@Nginx ~]# nginx -V

nginx version: nginx/1.24.0

1.5 平滑升级和回滚

平滑升级和回滚[这里是图片008]https://blog.csdn.net/weixin_63657273/article/details/141230657?spm=1001.2014.3001.5501

二、Nginx核心配置详解

Nginx核心配置详解[这里是图片009]https://blog.csdn.net/weixin_63657273/article/details/141271637?spm=1001.2014.3001.5501

三、Nginx 高级配置

Nginx高级配置[这里是图片010]https://blog.csdn.net/weixin_63657273/article/details/141298973?spm=1001.2014.3001.5501

四、Nginx Rewrite 相关功能

  • Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
  • 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
  • rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
  • 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的 链接,就可以设置为访问
  • 另外还可以在一定程度上提高网站的安全性

4.1ngx_http_rewrite_module 模块指令

官方文档:Module ngx_http_rewrite_module

4.1.1 if 指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) {

action

}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间 使用以下符号链接:

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
4.1.2 set 指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

4.1.3 break 指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用。

注意:如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行。

4.1.4 return 指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置。

语法格式:

return code; #返回给客户端指定的HTTP状态码

return code [text];#返回给客户端的状态码及响应报文的实体内容,

#可以调用变量,其中text如果有空格,需要用单或双引号

return code URL; #返回给客户端的URL地址

4.2rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理。

语法格式:

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI。

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制。

如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301。

正则表达式格式:

.     #匹配除换行符以外的任意字符
w     #匹配字母或数字或下划线或汉字
s     #匹配任意的空白符
d     #匹配数字#匹配单词的开始或结束
^     #匹配字付串的开始
$     #匹配字符串的结束
*     #匹配重复零次或更多次
+     #匹配重复一次或更多次
?     #匹配重复零次或一次
(n)     #匹配重复n次
{n,}     #匹配重复n次或更多次
{n,m}     #匹配重复n到m次
*?     #匹配重复任意次,但尽可能少重复
+?     #匹配重复1次或更多次,但尽可能少重复
??     #匹配重复0次或1次,但尽可能少重复
{n,m}?     #匹配重复n到m次,但尽可能少重复
{n,}?     #匹配重复n次以上,但尽可能少重复
W ?     #匹配任意不是字母,数字,下划线,汉字的字符
S     #匹配任意不是空白符的字符
D     #匹配任意非数字的字符
B     #匹配不是单词开头或结束的位置
[^x]     #匹配除了x以外的任意字符
[^lee]     #匹配除了magedu 这几个字母以外的任意字符
4.2.1rewrite flag 使用介绍

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时 重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型。

  • 跳转型指由客户端浏览器重新对新地址进行请求
  • 代理型是在WEB服务器内部实现跳转

rewrite 格式:

Syntax: rewrite regex replacement [flag]; #通过正则表达式处理用户请求并返回替换后的数据 包。

Default: —

Context: server, location, if

flag 说明:

redirect;

#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端

#由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302

permanent;

#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端

#由客户端重新发起请求,状态码:301 break;

#重写完成后,停止对当前URL在当前location中后续的其它重写操作 #而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在location中使用 #适用于一个URL一次重写

last;

#重写完成后,停止对当前URI在当前location中后续的其它重写操作,

#而后对新的URL启动新一轮重写检查,不建议在location中使用

#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户

4.2.2rewrite案例: 域名永久与临时重定向

名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳 转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。

示例: 因业务需要,将访问源域名 www.qisheng.org 的请求永久重定向到 www.qisheng.com

location / {? root /data/nginx/html/pc;? index index.html;? rewrite / http://www.qisheng.com permanent;? #rewrite / http://www.qisheng.com redirect;}#重启Nginx并访问域名 http://www.qisheng.org 进行测试
4.2.2.1永久重定向301

域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到 客户端浏览器。

永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也 会利用缓存进行重定向。

比如: 京东早期的域名 www.360buy.com 由于与360公司类似,于是后期永久重定向到了 www.jd.com。

示例:

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name ou.qisheng.org;root /webdata/nginx/qisheng.org/ou/html;location / {? #rewrite / http://ou.qisheng.com redirect;? rewrite / http://lee.qisheng.com permanent;}
}
server {listen 80;server_name ou.qisheng.com;root /webdata/nginx/qisheng.com/ou/html;
} 
4.2.2.2临时重定向302

域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器 不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久 重定向最大的本质区别。

即当nginx服务器无法访问时,浏览器不能利用缓存,而导致重定向失败。

示例:

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name ou.qisheng.org;root /webdata/nginx/qisheng.org/ou/html;location / {? rewrite / http://ou.qisheng.com redirect;? #rewrite / http://ou.qisheng.com permanent;}
}
server {listen 80;server_name ou.qisheng.com;root /webdata/nginx/qisheng.com/ou/html;
}
4.2.3rewrite 案例: break 与 last

测试: 访问break请求被rewrite至test1,而访问test1转递请求再次被rewrite发送至test2,此测试last和break 分别有什么区别。

4.2.3.1break和last区别案例

[root@Nginx ~]# mkdir /webdata/nginx/qisheng.org/ou/html/{test1,test2,break}
[root@Nginx ~]# echo test1 > /webdata/nginx/qisheng.org/ou/html/test1/index.html
[root@Nginx ~]# echo test2 > /webdata/nginx/qisheng.org/ou/html/test2/index.html
[root@Nginx ~]# echo break > /webdata/nginx/qisheng.org/ou/html/break/index.html
[root@centos8 ~]#cat /usr/local/nginx/conf.d/vhosts.conf 
server {listen 80;server_name ou.qisheng.org;root /webdata/nginx/qisheng.org/ou/html;location /break {? root /webdata/nginx/qisheng.org/ou/html;? rewrite ^/break/(.*) /test1/$1 last;? rewrite ^/test1/(.*) /test2/$1 break;}location /last {? root /webdata/nginx/qisheng.org/ou/html;? rewrite ^/last/(.*) /test1/$1 last;? rewrite ^/test1/(.*) /test2/$1 last;}location /test1 {? ? default_type text/html;? ? return 666 "new test1";}location /test2 {? root /webdata/nginx/qisheng.org/ou/html;}
}
[root@client ~]# curl -L ou.qisheng.org/break/index.html
test1
[root@client ~]# curl -L ou.qisheng.org/last/index.html
new test1[root@client ~]#
4.2.4rewrite案例: 自动跳转 https

案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全 部自动跳转至 https,另外也可以实现部分 location 跳转。

1、创建认证目录

mkdir -p /usr/local/nginx/certs

2、生成证书

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/qisheng.org.key -x509 -days 365 -out /usr/local/nginx/certs/qisheng.org.crt

3、编辑配置文件

vim /usr/local/nginx/conf.d/vhosts.conf

[root@centos8 ~]#vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 443 ssl;listen 80;ssl_certificate /usr/local/nginx/certs/qisheng.org.crt;ssl_certificate_key /usr/local/nginx/certs/qisheng.org.key;ssl_session_cache shared:sslcache:20m;ssl_session_timeout 10m;server_name ou.qisheng.org;location / { ? ?#针对全站跳转? root /data/nginx/html;? index index.html;? ?if ($scheme = http ){ ? #如果没有加条件判断,会导致死循环? rewrite / https://$host redirect;? } ?}location /login { ? ? #针对特定的URL进行跳转https if ($scheme = http ){ ? #如果没有加条件判断,会导致死循环? rewrite / https://$host/login redirect;? } }
}
#重启Nginx并访问测试
[root@centos7 ~]#curl -ikL www.timinglee.org

4、测试结果

4.2.5rewrite 案例: 判断文件是否存在

案例:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页

1、编辑配置文件

vim /usr/local/nginx/conf.d/vhosts.conf

2、重启nginx,并测试

nginx -s reload

4.3 nginx 防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗 链,referer就是之前的那个网站域名,正常的referer信息有以下几种:

(1)none: 请求报文首部没有referer首部, 比如用户直接在浏览器输入域名访问web网站,就没有referer信息。

(2)blocked: 请求报文有referer首部,但无有效值,比如为空。

(3)server_names: referer首部中包含本主机名及即nginx 监听的server_name。

(4)arbitrary_string: 自定义指定字符串,但可使用*作通配符。

(5)regular expression: 被指定的正则表达式模式匹配到的字符串,要使用~开头。

4.3.1实现盗链

在一个web 站点盗链另一个站点的资源信息,比如:图片、视频等

新建一个主机172.25.254.20,盗取另一台主机ou.qisheng.org/images/logo.png的图片

1、安装httpd

yum install httpd -y

2、准备盗链web页面

vim /var/www/html/index.html

<html><head>? <meta http-equiv=Content-Type content="text/html;charset=utf-8">? <title>盗链</title>
</head><body>? <img src="http://ou.qisheng.org/images/logo.png" >? <h1 style="color:red">欢迎大家</h1>? <p><a href=http://ou.qisheng.org>点击</a>有惊喜!!!</p></body>
</html>

3、重启apche服务并访问测试

重启apache并访问http://172.25.254.20 测试,验证两个域名的日志,是否会在被盗连的web站点的日志中出现以下盗链日志信息。

oot@Nginx ~]# cat /usr/local/nginx/logs/access.log

4.3.2 实现防盗链

基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效 实现防盗链功能。

官方文档:Module ngx_http_referer_module

1、定义防盗链

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf

server {listen 80;server_name ou.qisheng.org;root /webdata/nginx/qisheng.org/ou/html;location /images {? valid_referers none blocked server_names *.qisheng.org ~.baidu.;? if ($invalid_referer){? ? #return 403;? ? rewrite ^/ http://ou.qisheng.org/daolian.png permanent;? }}
}

2、重启nginx并访问测试

五、nginx反向代理功能

Nginx反向代理功能

实现Nginx四层负载均衡

六、实现FastCGI

CGI的由来: 最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏 览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实 现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户 的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网 关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口 标准,是cgi程序和web服务器之间传递信息的标准化接口。

为什么会有FastCGI?

CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server 每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候 再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。

什么是PHP-FPM?

PHP-FPM(FastCGI Process Manager:

  • FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
  • 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server 的请求。
  • worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理。

6.1FastCGI配置指令

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处 理,其配置指令如下:

fastcgi_pass address:port;

#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in 
location
fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义
key
fastcgi_param REMOTE_ADDR ? ? ? ?$remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT ? ? ? ?$remote_port; #客户端源端口
fastcgi_param SERVER_ADDR ? ? ? ?$server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT ? ? ? ?$server_port; #请求的服务器端口
fastcgi_param SERVER_NAME ? ? ? ?$server_name; #请求的server name
Nginx默认配置示例:? location ~ .php$ {? ? root ? ? ? ? ? /scripts;? ? fastcgi_pass ? 127.0.0.1:9000;? ? fastcgi_index index.php;? ? fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径? ? #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;? ? include ? ? ? fastcgi_params; ? ?#此文件默认系统已提供,存放的相对路径为
prefix/conf? }

6.2FastCGI实战案例 : Nginx与php-fpm在同一服务器

编译安装更方便自定义参数或选项,所以推荐大家使用源码编译

官方网站:PHP: Hypertext Preprocessor

源码编译php:

1、安装php依赖

[root@Nginx ~]# yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel

2、解压源码并安装

[root@Nginx ~]# ./configure 

–prefix=/usr/local/php #安装路径
–with-config-file-path=/usr/local/php/etc #指定配置路径
–enable-fpm #用cgi方式启动程序
–with-fpm-user=nginx #指定运行用户身份
–with-fpm-group=nginx
–with-curl #打开curl浏览器支持
–with-iconv #启用iconv函数,转换字符编码
–with-mhash #mhash加密方式扩展库
–with-zlib #支持zlib库,用于压缩http压缩传输
–with-openssl #支持ssl加密
–enable-mysqlnd #mysql数据库
–with-mysqli
–with-pdo-mysql
–disable-debug #关闭debug功能
–enable-sockets #支持套接字访问
–enable-soap #支持soap扩展协议
–enable-xml #支持xml
–enable-ftp #支持ftp
–enable-gd #支持gd库
–enable-exif #支持图片元数据
–enable-mbstring #支持多字节字符串
–enable-bcmath #打开图片大小调整,用到zabbix监控的时候用到了这个模块
–with-fpm-systemd #支持systemctl 管理cgi

php相关配置优化:

[root@Nginx ~]# cd /usr/local/php/etc

[root@Nginx etc]# cp php-fpm.conf.default php-fpm.conf

[root@Nginx etc]# vim php-fpm.conf

去掉注释

pid = run/php-fpm.pid #指定pid文件存放位置

[root@Nginx etc]# cd php-fpm.d/

[root@Nginx php-fpm.d]# cp www.conf.default www.conf

#生成主配置文件

[root@Nginx php-fpm.d]# cd /root/php-8.3.9

[root@Nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini

[root@Nginx ~]# 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 #修改时区

#生成启动文件

[root@Nginx ~]# cd /root/php-8.3.9/

[root@Nginx php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/system/

# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
#ProtectSystem=full #注释该内容

[root@Nginx php-8.3.9]# systemctl start php-fpm.service

[root@Nginx php-8.3.9]# netstat -antlupe | grep php

准备php测试页面:

[root@Nginx ~]# mkdir /data/php -p

[root@centos8 ~]# cat /data/php/index.php #php测试页面

<?php
phpinfo();
?>

Nginx配置转发:

Nginx安装完成之后默认生成了与fastcgi的相关配置文件,一般保存在nginx的安装路径的conf目录当 中,比如/apps/nginx/conf/fastcgi.conf、/apps/nginx/conf/fastcgi_params。

[root@Nginx ~]# vim /usr/local/nginx/conf.d/php.conf

server {listen 80;server_name php.timinglee.org;root /data/php;location ~ .php$ {? fastcgi_pass 127.0.0.1:9000;? fastcgi_index index.php;? include fastcgi.conf;}
}

重启nginx并访问web测试:

[root@Nginx ~]# nginx -s reload

添加php环境变量:

[root@Nginx ~]# vim .bash_profile

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/apps/nginx/sbin:/usr/local/php/bin
export PATH

[root@Nginx ~]# source .bash_profile

6.3php的动态扩展模块(php的缓存模块)

软件下载:PECL :: Package :: memcache

安装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 instal

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

[root@Nginx ~]# cd memcache-8.2/

[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/

[root@Nginx ~]# vim /data/php/memcache.php

define('ADMIN_USERNAME','admin'); ? // Admin Username
define('ADMIN_PASSWORD','123456'); ? // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost: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 no-debug-non-zts-20230831]# php -m | grep mem
memcache

部署memcached:

[root@Nginx ~]# yum install memcached -y

[root@Nginx ~]# systemctl enable --now memcached.service

[root@Nginx ~]# cat /etc/sysconfig/memcached

PORT=“11211”

USER=“memcached”

MAXCONN=“1024”

CACHESIZE=“64”

OPTIONS=“-l 127.0.0.1,::1”

测试:

访问 http://ou.qisheng.org/example.php 不断刷新

访问 http://ou.qisheng.org/memcache.php 查看命中效果

性能对比:

压测

ab -n500 -c10 http://ou.qisheng.org/example.php

ab -n500 -c10 http://ou.qisheng.org/index.php

6.4 php高速缓存

部署方法:在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所 以nginx需要重新编译。

[root@Nginx ~]# cd nginx-1.26.2/

[root@Nginx nginx-1.26.2]# ./configure --prefix=/apps/nginx --user=nginx – group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module – add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module0.33

[root@Nginx nginx-1.26.2]# make && make install

[root@Nginx ~]# vim /usr/local/nginx/conf.d/php.conf

upstream memcache {? server 127.0.0.1:11211;? keepalive 512;
}
server {listen 80;server_name ou.qisheng.org;root /data/php;location /memc {? internal;? memc_connect_timeout 100ms;? memc_send_timeout 100ms;? memc_read_timeout 100ms;? set $memc_key $query_string; #使用内置变量$query_string来作为key? set $memc_exptime 300; #缓存失效时间300秒? memc_pass memcache;}location ~ .php$ {set $key $uri$args; #设定key的值? srcache_fetch GET /memc $key; #检测mem中是否有要访问的php? srcache_store PUT /memc $key; #缓存为加载的php数据? fastcgi_pass 127.0.0.1:9000;? fastcgi_index index.php;? include fastcgi.conf;}
}

[root@Nginx ~]# systemctl start nginx.service

测试结果:

七、nginx 二次开发版本

7.1openresty

Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中, 实现了 OpenResty 这个高性能服务端解决方案。

OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。

OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言 调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高 性能 Web 应用系统。

OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的 选择。

官网:OpenResty? - 开源官方站

7.2 编译安装 openresty

[root@Nginx ~]#dnf -yq install gcc pcre-devel openssl-devel perl

[root@Nginx ~]#useradd -r -s /sbin/nologin nginx

[root@Nginx ~]#cd /usr/local/src

[root@Nginx src]#wget https://openresty.org/download/openresty-1.17.8.2.tar.gz

[root@Nginx src]#tar xf openresty-1.17.8.2.tar.gz

[root@Nginx src]#cd openresty-1.17.8.2/

[root@Nginx openresty-1.17.8.2]#./configure

–prefix=/apps/openresty

–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@Nginx openresty-1.17.8.2]#make && make install

[root@Nginx openresty-1.17.8.2]#ln -s /apps/openresty/bin/* /usr/bin/

[root@Nginx openresty-1.17.8.2]#openresty -v

nginx version: openresty/1.17.8.2

[root@Nginx openresty-1.17.8.2]#openresty

[root@Nginx openresty-1.17.8.2]#ps -ef |grep nginx

[root@Nginx ~]#curl 10.0.0.18

相关文章:

Nginx知识详解(理论+实战更易懂)

目录 一、Nginx架构和安装 1.1 Nginx 概述 1.1.1 nginx介绍 1.1.2?Nginx 功能介绍 1.1.3?基础特性 1.1.4?Web 服务相关的功能 1.2?Nginx 架构和进程 1.2.1?Nginx 进程结构 1.2.2?Nginx 进程间通信 1.2.3?Nginx 启动和 HTTP 连接建立 1.2.4?HTTP 处理过程 1…...

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;...

华夏ERP系统部署

JDK安装及环境变量配置 数据库安装 Redis安装部署 Nginx安装部署 后端程序前端程序部署...

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free

C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

【TypeScript篇】TypeScript命令行编译和自动化编译

目录 1. 命令行编译 步骤一&#xff1a;创建一个demo.ts文件 步骤二&#xff1a;全局安装TypeScript 步骤三&#xff1a;使用命令编译.ts文件 2. 自动化编译 步骤一&#xff1a;生成编译控制文件 步骤二&#xff1a;开启监视 3. 自动化编译的一些其它问题 1. 命令行编译…...

电子应用设计方案78:智能窗户系统设计

智能窗户系统设计 一、引言 智能窗户系统旨在为用户提供更便捷、舒适和节能的窗户控制体验&#xff0c;同时增强家居的安全性和智能化程度。 二、系统概述 1. 系统目标 - 实现窗户的自动开关控制&#xff0c;根据环境条件和用户设定进行操作。 - 具备风雨感应功能&#xff0c…...

数据挖掘笔记 | 插值 | 拉格朗日插值 | 龙格现象 | 埃尔米特插值 | 分段三次埃尔米特插值

Interpolation插值 ​ 对于缺失值的处理&#xff0c;比较常见的是数值分析中的插值和拟合这两种方法。插值指的是在离散数据的基础上补插连续函数&#xff0c;使得这条连续曲线通过全部给定的离散数据点&#xff1b;拟合则是找到一条“最优”的曲线&#xff0c;尽可能地贴近平…...

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…...

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…...

AVL 树

1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AVL树可以是一棵空树&#xff0c;或者具有以下性质的树&#xff1a;左右子树都是AVL树。且左右子树的高度差的绝对值不超过1。 AVL树是一颗高度平衡搜索二叉树&#xff0c;通过控制高度去控制平衡。 AVL树的发明…...

PHP关键字Self、Static和parent的区别

简介 在使用PHP代码时&#xff0c;您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候&#xff0c;有时候你会很困惑&#xff0c;不知道它们是做什么的&#xff0c;以及它们之间的区别。 在我第一次作为开发人员开始工作后的很长一段时间…...

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}...

golang标准库archive/tar实现打包压缩及解压

文章目录 前言一、单个文件操作1.单个文件打包示例2.单个文件解包示例 二、目录示例1.打包压缩2.解包 补充 前言 这个包就是将文件进行打包和解包&#xff0c;通俗理解就是Linux 下的 tar 命令。 主要是通过 tar.Reader 读取 tar 包&#xff0c;通过 tar.Writer 写入 tar包&am…...

模方匀色功能中,加载的模板文件从哪里来

使用 DasViewerV3.1.2及以上版本导出的颜色调整文件 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.2新增内置“自动UV展开”功能&#xff0c;新增局部调色功能和DOM匀色功能等。同时可与…...

maya 删除 Ctrl + Delete vs Delete

在 Autodesk Maya 中删除选定顶点的步骤&#xff1a; 1. 选择顶点&#xff1a; 进入顶点选择模式&#xff1a; 按 F9 键&#xff08;切换到顶点选择模式&#xff09;。 或者&#xff0c;在工具栏中点击顶点选择图标&#xff08;顶点模式&#xff09;。 在视图中选择您想要删…...

为何String不可变,String的运算符重载

1.为何String不可变 java9之前&#xff0c;String的源码中是用字符数组实现的&#xff0c;同时使用了final和private修饰&#xff0c;被final修饰的结果就是变量不可修改、类不可继承、方法不可重写&#xff0c;被private修饰就无法对外暴露&#xff0c;这就是为何String不可变…...

WebRTC :原理、协议和应用场景

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种用于在Web浏览器和移动应用程序之间进行实时通信的开放标准。它通过将音频、视频和数据传输集成到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。 一、WebRTC 的原理 WebRTC的实…...

Windows FTP服务器搭建指南

在Windows上搭建FTP服务器可以通过以下步骤完成。这里以Windows 10为例&#xff0c;使用系统自带的IIS&#xff08;Internet Information Services&#xff09;来搭建FTP服务器。 步骤1&#xff1a;安装IIS和FTP服务器组件 打开“控制面板”&#xff1a; 按 Win R&#xff0c…...

DP协议:Link层(二)

书接上文,内容多了难免会有一种知识点零碎感,但是坚持学下去,有一天你会发现已经不知不觉可以链接成一张知识网络了。 AUX提供的services 前面咱刚刚简单的认识了AUX CH的状态和仲裁,这次咱们接着聊聊AUX提供的services。 管理连接和设备:AUX CH就像是一个管家,负责找到…...

HAL 库 HAL_UARTEx_ReceiveToIdle_IT 函数解析

一、存在位置&#xff1a;stm32f1xx_hal_uart.c 二、具体代码 二、返回值&#xff1a;HAL_StatusTypeDef 通过查看返回值HAL_StatusTypeDef在stm32f1xx_hal_edf.h文件中定义为结构体类型。 status&#xff1a;&#xff08;进展的&#xff09;状况&#xff0c;情形 三、函数名…...

C++ 设计模式:职责链模式(Chain of Responsibility)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 组合模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这些对象通过…...

数据库约束和查询

一 约束意义 这个后面的字段是什么意思呢? 先前说数据类型是一种约束&#xff0c;约束我们只能放该类型的数据&#xff0c;还有其它的约束来保证数据的合法性&#xff0c;下面的字段就和约束有关。 编译器的编译就是一个约束&#xff0c;保证我们的代码一定是语法合格的。我们…...

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…...

AI大模型-提示工程学笔记1

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 几个基本概念 1. 给LLM提示 用户可以通过简单的提示词&#xff08;Prompts&#xff09…...

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…...

百度PaddleSpeech识别大音频文件报错

一、背景 公司前同事留下了一套语音识别项目&#xff0c;内部使用百度PaddleSpeech。在项目验收的时候发现无法识别大音频文件&#xff0c;但是可以识别小音频文件。 这套项目是通过python调用的百度PaddleSpeech&#xff0c;然后提供了restful接口&#xff0c;然后java项目可…...

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度&#xff0c;使⽤不同的数据类型&#xff0c;能够创建出⻓度不同的变量&#xff0c;变量⻓度的不同&#xff0c;存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字&#xff0c;也是操作符&#xff0c;专⻔是⽤来计算特…...

MapReduce相关概念(自用)

MapReduce&#xff1a;分布式计算模型 MapReduce 是一种分布式计算模型&#xff0c;由 Google 在 2004 年提出&#xff0c;用于大规模数据集&#xff08;TB 或 PB 级别&#xff09;的分布式处理。它通过简单的编程模型&#xff0c;将复杂的分布式计算分解为两个基本阶段&#…...

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

AI助手网站

​​​​​​​ chatgpt &#xff1a;https://chatgpt.com/ https://openai.com/index/chatgpt/ 百度ai助手 https://chat.baidu.com/ 百度AI助手https://chat.baidu.com/ 文心快码 文心快码BaiduComate 文心快码BaiduComate 文心快码BaiduComate有代码问题&#xff0c;问文…...

初始nginx

华子目录 nginx介绍nginx功能介绍基础特性web服务相关功能nginx进程结构web请求处理机制 nginx进程间通信nginx启动与http连接建立http处理过程 nginx模块介绍nginx命令演示 nginx介绍 nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服…...

可扩展性设计架构模式——事件驱动架构

事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;是一种可扩展性设计软件架构模式&#xff0c;它通过事件来触发和通信&#xff08;以事件为核心&#xff09;&#xff0c;实现不同系统组件之间的解耦&#xff08;促进应用程序或系统部件之间的松耦合通信&a…...

Prometheus 专栏 —— Prometheus安装、配置

配置文件基本结构 global: 全局配置 scrape_interval: 抓取目标指标的频率&#xff0c;默认为 1minevaluation_interval: 评估告警规则的频率&#xff0c;默认为 1minscrape_timeout: 抓取目标指标数据拉取超时&#xff0c;默认为 10s&#xff0c;如果出现 context deadline e…...

Java并发编程面试题:线程池Fork/Join(19题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【每日学点鸿蒙知识】WebView代理、2D绘制矩形圆角、TextInput清理按钮、pdf滑动、icon配置问题

1、HarmonyOS Webview 支持设置代理功能吗&#xff1f; 使用Web的onInterceptRequest先拦截再代理来实现。具体可以参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-web-V5#ZH-CN_TOPIC_0000001930757269__on…...

抽奖系统(1)(Java 实现)

1. 需求描述 1. 包含管理员的注册与登录 1) 注册包含&#xff1a;姓名、邮箱、手机号、密码 2) 登录包含两种方式 (1) 电话 密码登录 (2) 电话 短信登录&#xff1b;验证码获取 (3) 登录需要校验管理员身份 2. 人员管理&#xff1a;管理员支持创建普通用户&#xff0c;查看…...

数据库系统原理复习汇总

数据库系统原理复习汇总 一、数据库系统原理重点内容提纲 题型&#xff1a;主观题 1、简答题 第一章&#xff1a;数据库的基本概念&#xff1a;数据库、数据库管理系统、三级模式&#xff1b;两级映像、外码 第二章&#xff1a;什么是自然连接、等值连接&#xff1b; 第三…...

基于16QAM的载波同步和定时同步性能仿真,采用四倍采样,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

鸿蒙next RCP网络请求工具类进阶版来了

前言&#xff1a; 各位同学大家好&#xff0c;有一段时间没有更新文章了,最近因为鸿蒙官方的网络请求换掉了了rcp 之前是使用http 这些都是原生开发的 当然有那种三方大家熟知的 axios (这个也是基于http 后面也会过时)所以大家还是要了解一下rcp的原生的网络请求的。那么我们…...

driftingblues6_vh靶机

首先把靶机换成NAT模式 使用 arp-scan 命令扫描网段内存活的主机&#xff0c;以获取靶机ip地址 arp-scn -l 尝试访问ip 使用御剑扫描子域名&#xff0c;尝试访问robots.txt文件 通过访问文件我们发现了一个/textpattern/textpattern目录 访问一下目录发现了登录页面 他还给了…...

Go语言入门

文章目录 零、Linux下Go的安装1.下载、解压2.添加环境变量3.验证安装4.初始化Go模块(1)cd到项目目录(2)初始化模块(3)获取依赖包(4)清理和验证依赖(5)检查 go.mod 文件(6)介绍 go.mod 和 go.sum 文件 5.项目目录结构 一、感性认识1.从 Hello world 开始2.加法函数 二、Go语法1.…...

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录&#xff0c;需借助插件才行&#xff0c;常见的插件如果git history只能查看某页面的改动记录&#xff0c;无法查看某分支的整体提交记录&#xff0c;我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…...

【杂谈】-AI搜索引擎如何改变传统SEO及其在内容营销中的作用

AI搜索引擎如何改变传统SEO及其在内容营销中的作用 文章目录 AI搜索引擎如何改变传统SEO及其在内容营销中的作用1、什么是AI搜索引擎2、AI搜索引擎对SEO策略的影响3、AI搜索引擎在内容营销转型中的作用4、AI搜索引擎在营销领域的挑战、道德问题和未来5、总结 在当今的数字营销世…...

快速掌握Haproxy原理架构

文章目录 一、原理架构二、无负载均衡三、四层负载均衡的工作流程四、七层负载均衡工作流程五、基础属性mode 属性retries 属性maxconn 属性clitimeout 属性servtimeout 属性states uri 属性 一、原理架构 四层tcp代理&#xff1a;Haproxy仅在客户端和服务器之间双向转发流量&…...

Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】

第一种思路是先将它们都转换为小写或大写&#xff0c;再使用String类的startsWith()方法实现: 例如&#xff0c;如下的二个示例&#xff1a; "Session".toLowerCase().startsWith("sEsSi".toLowerCase()); //例子之一//例子之二String str "Hello Wo…...

如何提高Redis服务器的最大打开文件数限制

文章目录 如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制3. 修改Redis配置文件4. 修改systemd服务文件5. 重新加载systemd并重启Redis6. 验证更改 注意事项 如何提高Redis服务器的最大打开文件数限制 在运行高并发…...

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…...

代码随想录算法【Day5\Day6】

DAY5\Day6 1.熟悉哈希表的数据结构&#xff1a;数组、map和set&#xff0c;使用方法、使用场景 2.哈希表应用场景&#xff1a;解决给你一个元素&#xff0c;判断它在集合里是否出现过。 242.有效的字母异位词 本题用数组解决的。 class Solution { public:bool isAnagram(…...