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

目录 一、Nginx架构和安装[1.1 Nginx 概述](#1.1 Nginx 概述)[1.1.1 nginx介绍](#1.1.1 nginx介绍)[1.1.2?Nginx 功能介绍](#1.1.2?Nginx 功能介绍)1.1.3?基础特性[1.1.4?Web 服务相关的功能](#1.1.4?Web 服务相关的功能)[1.2?Nginx 架构和进程](#1.2?Nginx 架构和进程)[1.2.1?Nginx 进程结构](#1.2.1?Nginx 进程结构)[1.2.2?Nginx 进程间通信](#1.2.2?Nginx 进程间通信)[1.2.3?Nginx 启动和 HTTP 连接建立](#1.2.3?Nginx 启动和 HTTP 连接建立)[1.2.4?HTTP 处理过程](#1.2.4?HTTP 处理过程)[1.3?Nginx 模块介绍](#1.3?Nginx 模块介绍)[1.4 Nginx安装](#1.4 Nginx安装)1.4.1?Nginx版本和安装方式[1.4.2?Nginx 编译安装](#1.4.2?Nginx 编译安装)[1.4.2.1 编译安装Nginx](#1.4.2.1 编译安装Nginx)1.4.2.2?验证版本及编译参数[1.5 平滑升级和回滚](#1.5 平滑升级和回滚)二、Nginx核心配置详解[三、Nginx 高级配置](#三、Nginx 高级配置)[四、Nginx Rewrite 相关功能](#四、Nginx Rewrite 相关功能)[4.1?ngx_http_rewrite_module 模块指令](#4.1?ngx_http_rewrite_module 模块指令)[4.1.1 if 指令](#4.1.1 if 指令)[4.1.2 set 指令](#4.1.2 set 指令)[4.1.3 break 指令](#4.1.3 break 指令)[4.1.4 return 指令](#4.1.4 return 指令)[4.2?rewrite 指令](#4.2?rewrite 指令)[4.2.1?rewrite flag 使用介绍](#4.2.1?rewrite flag 使用介绍)[?4.2.2?rewrite案例: 域名永久与临时重定向](#?4.2.2?rewrite案例: 域名永久与临时重定向)4.2.2.1?永久重定向3014.2.2.2?临时重定向302[4.2.3?rewrite 案例: break 与 last](#4.2.3?rewrite 案例: break 与 last)[4.2.4?rewrite案例: 自动跳转 https](#4.2.4?rewrite案例: 自动跳转 https)[?4.3 nginx 防盗链](#?4.3 nginx 防盗链)4.3.1?实现盗链[4.3.2 实现防盗链](#4.3.2 实现防盗链)五、nginx反向代理功能六、实现FastCGI?6.1?FastCGI配置指令[6.2?FastCGI实战案例 : Nginx与php-fpm在同一服务器](#6.2?FastCGI实战案例 : Nginx与php-fpm在同一服务器)?6.3?php的动态扩展模块(php的缓存模块)[?6.4 php高速缓存](#?6.4 php高速缓存)[?七、nginx 二次开发版本](#?七、nginx 二次开发版本)7.1?openresty[7.2 编译安装 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 newsnginx的其它的二次发行版: 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.18Nginx安装可以使用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 installnginx完成安装以后,有四个主要的目录> 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=KaTeX parse error: Undefined control sequence: \ at position 31: .../nginx/sbin\> \> \\̲\[̲root@Nginx \~\\#...变量的值为空字符串或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, ifflag 说明:\> 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/KaTeX parse error: Expected 'EOF', got '}' at position 13: 1 last; }̲ location /...scheme = http ){ ? #如果没有加条件判断,会导致死循环 ? rewrite / https://KaTeX parse error: Expected 'EOF', got '}' at position 22: ...edirect; ? }̲ ? } lo...scheme = http ){ ? #如果没有加条件判断,会导致死循环 ? rewrite / https://KaTeX parse error: Expected 'EOF', got '}' at position 28: ...edirect; ? }̲ } } ...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 ? ? ? ?KaTeX parse error: Expected 'EOF', got '#' at position 14: remote_addr; #̲客户端源IP fastc...remote_port; #客户端源端口 fastcgi_param SERVER_ADDR ? ? ? ?KaTeX parse error: Expected 'EOF', got '#' at position 14: server_addr; #̲请求的服务器IP地址 f...server_port; #请求的服务器端口 fastcgi_param SERVER_NAME ? ? ? ?KaTeX parse error: Expected 'EOF', got '#' at position 14: server_name; #̲请求的server name ... { ? ? 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 d o c u m e n t r o o t document_root documentrootfastcgi_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-devel2、解压源码并安装 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 管理cgiphp相关配置优化:> 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 -proot@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= P A T H : PATH: PATH:HOME/bin:/apps/nginx/sbin:/usr/local/php/bin export PATH\> \[root@Nginx \~\]# source .bash_profile### 6.3php的动态扩展模块(php的缓存模块)软件下载:[PECL :: Package :: memcache](http://pecl.php.net/package/memcache "PECL :: Package :: memcache")![](https://i-blog.csdnimg.cn/direct/5e6f18a4418148fc9dc14191aeb2daf5.png)安装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); KaTeX parse error: Expected 'EOF', got '#' at position 68: ...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 查看命中效果![](https://i-blog.csdnimg.cn/direct/436cfda3495e442980b7ae50f77fc39e.png)![](https://i-blog.csdnimg.cn/direct/54057a3d58004275b63e7f2d365b9e37.png)性能对比:压测\> ab -n500 -c10 [http://ou.qisheng.org/example.php](http://ou.qisheng.org/example.php "http://ou.qisheng.org/example.php")![](https://i-blog.csdnimg.cn/direct/c77aaffa560f48ca924df1895c80d8a9.png)\> ab -n500 -c10 [http://ou.qisheng.org/index.php](http://ou.qisheng.org/index.php "http://ou.qisheng.org/index.php")![](https://i-blog.csdnimg.cn/direct/ee0bd2ec7a1c4fd2aa3e4a654e1edd16.png)### 6.4 php高速缓存![](https://i-blog.csdnimg.cn/direct/fc06d5dd764647d3b561fd06b29b5399.png)部署方法:在我们安装的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 KaTeX parse error: Expected 'EOF', got '#' at position 15: query_string; #̲使用内置变量query_string来作为key ? set KaTeX parse error: Expected 'EOF', got '#' at position 19: ...c_exptime 300; #̲缓存失效时间300秒 ... { set key u r i uri uriargs; #设定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.1openrestyNginx 是俄罗斯人发明的, 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

相关推荐
Elastic 中国社区官方博客21 分钟前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化
段帅星1 小时前
Mac + iTerm2 运维终端配置参考
运维
智恒百亿1 小时前
从开箱到跑通大模型:一台 RTX 5090 八卡服务器的部署实录(附踩坑清单)
运维·服务器
沫璃染墨1 小时前
《从零入门Linux系统篇(三十二):文件篇·五——深入理解磁盘:从物理结构到LBA寻址》
linux·运维·服务器·系统架构·硬件架构
Songxwn1 小时前
Rack-auto 裸金属服务器自动化
运维·服务器·自动化
zlwool1 小时前
非标设备厂图纸管理选型实战
运维·服务器·erp·设备erp·非标机械
云计算磊哥@1 小时前
运维开发宝典064-CICD_Nexus3 搭建 maven 私服
运维·maven·运维开发
新时代牛马2 小时前
CFS调度源码:从 schedule() 到pick_next_entity 的vruntime 公平
linux·运维·网络
0+1112 小时前
Linux --库制作与原理
linux·运维·服务器