Web服务基础介绍
Web 服务器访问流程
- 按下回车时浏览器根据输入的 URL 地址发送请求报文给服务器。
- 服务器接收到请求报文,会对请求报文进行处理。
- 服务器将处理完的结果通过响应报文返回给浏览器。
- 浏览器解析服务器返回的结果,将结果显示出来。
1. 输入网址
举例:你在浏览器地址栏中输入了“http://www.example.com”这个网址,想要访问一个网站。
2. DNS解析
解释:浏览器首先会查找这个网址对应的IP地址。因为计算机之间是通过IP地址来互相识别的,而不是域名。这个过程叫做DNS(域名系统)解析。
举例:浏览器会先问问你的电脑(本地hosts文件)有没有记住这个网址对应的IP地址,如果没有,就会去询问网络上的DNS服务器。DNS服务器就像是一个电话簿,它知道很多网址和它们对应的IP地址。经过一番查找,DNS服务器告诉浏览器,“http://www.example.com”对应的IP地址是“192.0.2.1”。
3. 建立TCP连接
解释:得到IP地址后,浏览器会尝试与这个IP地址对应的服务器建立TCP(传输控制协议)连接。TCP是一种可靠的传输协议,它确保数据能够完整无误地传输。
举例:浏览器就像是一个快递员,它要送信给服务器(IP地址是192.0.2.1)。为了确保信件能够安全送达,它先跟服务器打了个招呼(TCP三次握手),双方确认好通信方式后,才开始正式传输信件。
4. 发送HTTP请求
解释:TCP连接建立后,浏览器会向服务器发送一个HTTP(超文本传输协议)请求。这个请求包含了你想从服务器上获取什么内容的信息。
举例:快递员(浏览器)告诉服务器(IP地址是192.0.2.1):“你好,我想要访问你们网站的首页。”
5. 服务器处理请求
解释:服务器收到请求后,会根据请求的内容进行相应的处理。比如,如果请求的是网页,服务器就会找到这个网页的文件,并准备发送给浏览器。
举例:服务器就像是一个图书馆的管理员,它听到快递员(浏览器)的请求后,就去书架上找到了对应的书(网页文件),并准备交给快递员带回。
6. 返回HTTP响应
解释:服务器处理完请求后,会向浏览器发送一个HTTP响应。这个响应包含了请求的内容(比如网页的HTML代码)以及一些其他信息(比如状态码、内容类型等)。
举例:图书馆管理员(服务器)把书(网页文件)交给了快递员(浏览器),并告诉它:“这是你要的书,请查收。”
7. 浏览器渲染页面
解释:浏览器收到响应后,会解析HTML代码,并根据需要下载相关的资源(如图片、CSS文件、JavaScript文件等),然后渲染出网页。
举例:快递员(浏览器)把书(网页文件)带回了你的手中,你打开书开始阅读。同时,如果书中有插图或者附录(图片、CSS文件、JavaScript文件等),你也会把它们找出来一起阅读。最终,你看到了完整的网页内容。
8. 断开TCP连接
解释:在数据传输完毕后,浏览器和服务器会断开TCP连接。这个过程叫做TCP四次挥手,它确保了双方都能够安全地关闭连接。
举例:你读完了书(网页内容),并告诉快递员(浏览器):“我已经看完了,你可以走了。”快递员也向图书馆管理员(服务器)打了个招呼:“我已经把书带回来了,再见。”然后双方就各自离开了。
web服务介绍
Apache 和 Nginx
Apache 经典的 Web 服务端
1.apache prefork模型
①多进程对应单线程 固定单线程对应一个请求 资源占用大
②预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
③每个子进程有一个独立的线程响应用户请求
举例:
想象一下你是一家餐厅的老板,餐厅里有多个服务员(子进程)。每个服务员负责接待一个客人(客户端请求),从客人点单到上菜、结账,全程都是这个服务员在负责。这样,每个服务员都很专注,不会出现混乱,但如果客人太多,就需要很多服务员来接待,餐厅就会变得拥挤,而且成本也会增加。
2.apache worker模型
①多进程对应多线程
②每个子进程里面包含固定的线程
③使用线程程来处理请求
④当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
⑤由于其使用了线程处理请求,因此可以承受更高的并发
!优点:相比prefork 占用的内存较少,可以同时处理更多的请求
!缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超 时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在 prefork模式下,同样会发生)
举例:
还是那家餐厅,但现在你引入了团队合作的概念。每个服务员(子进程)不再单独工作,而是带领一个小团队(线程)。当有客人来餐厅时,服务员会安排团队中的一个成员(线程)去接待客人。这样,即使客人很多,每个服务员也只需要管理好自己的小团队,就能高效地处理所有客人的需求。而且,由于团队成员可以复用,所以餐厅的运营成本也降低了。
3.apache event模型
①存在一个监听线程 进行分配请求给其他线程 使得资源能够更好的分配 比如出现了空请求会不分配 不占用资源
②当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场 景下的请求处理能力
!优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
!缺点:没有线程安全控制
举例:回到餐厅的例子,这次你引入了更高效的排班和调度系统(事件驱动)。系统会根据客人的实际需求来动态调整服务员(线程)的工作状态。比如,如果某个服务员(线程)暂时空闲,系统就会立即安排他去接待新的客人;如果某个服务员(线程)因为某种原因(如处理长连接请求)暂时无法接待新客人,系统就会迅速安排其他服务员(线程)来顶替。这样一来,餐厅的运营效率就大大提高了,客人也能更快地得到服务。
4.三种模型总结及对比
总结来说,Prefork模型适合访问量不是很大的场景,因为它稳定但资源占用高;Worker模型适合需要处理较多并发请求的场景,因为它通过线程复用提高了效率;而Event模型则是最新的技术,它通过事件驱动的方式进一步优化了资源利用和并发处理能力。
Nginx-高性能的 Web 服务端
1.基于nginx的工作场景
2.影响用户体验的因素
1)客户端
客户端硬件配置
客户端网络速率
客户端与服务端距离
2)服务器
服务端网络速率
服务端硬件配置
服务端架构设计
服务端应用程序工作模式
服务端并发数量服务端响应文件大小及数量 buffer cache
服务端I/O压力1.2.4 服务端 I/O 流程
3.服务端 I/O 流程
I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数), 是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的 I/O请求数量为单位,I/O请求通常为读或写数据操作请求。 一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用 户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而 是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从 内核空间中的内存数据复制到用户空间中进程的内存当中。
服务器的I/O
磁盘I/O
网络I/O : 一切皆文件,本质为对socket文件的读写
磁盘 I/O
磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相 应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存, 如果是比较大的数据也需要等待时间
网络I/O
网络通信就是网络协议栈到用户空间进程的IO就是网络IO
不论磁盘和网络I/O
每次I/O,都要经由两个阶段:
第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
4.I/O 模型
同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状 态的通知。
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事 情是否处理完成
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂 起,干不了别的事情。
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完 成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
1) 阻塞I/O(Blocking I/O)
具体流程:
- 当应用程序发起一个I/O操作时,它会等待这个操作完成后再继续执行。
- 如果I/O操作没有立即完成(比如等待数据从网络中到达),应用程序的进程或线程会被挂起,处于等待状态。
- 一旦I/O操作完成,数据被复制到应用程序的缓冲区中,然后应用程序继续执行。
优缺点:
- 优点:编程模型简单直观,容易理解和调试。
- 缺点:I/O操作会阻塞线程,导致CPU资源浪费,影响系统的并发性能。
举例:
想象一下你在等外卖,如果你选择了阻塞I/O的方式,那么你会一直等在门口,直到外卖送到你手上,这期间你不能去做其他任何事情。
同步阻塞:
程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进 程将一直等待并不再接受新的请求,并由进程轮询查看I/O是否完成,完成后进程将I/O结果返回给 Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种 方式简单,但是比较慢,用的比较少。
2)非阻塞I/O(Non-blocking I/O)
具体流程:
- 应用程序发起一个I/O操作,但不会立即等待这个操作完成。
- 如果I/O操作没有完成,应用程序会立即得到一个错误码(如EWOULDBLOCK),然后可以继续执行其他任务。
- 应用程序需要定期检查I/O操作是否完成,这通常通过轮询(polling)实现。
优缺点:
- 优点:I/O操作不会阻塞线程,可以在等待I/O的同时处理其他任务,提高CPU利用率。
- 缺点:需要不断轮询I/O操作状态,容易造成CPU资源浪费,编程复杂性增加。
举例:
你再次等外卖,但这次你每隔几分钟就给外卖小哥打个电话询问是否送到,这样虽然你可以去做其他事情,但频繁打电话也会消耗你的时间和精力。
非阻塞:
程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结 果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完 成。
3) I/O多路复用(I/O Multiplexing)
具体流程:
- 应用程序通过调用select、poll或epoll等系统调用,可以同时监控多个I/O操作。
- 当有I/O操作完成时,系统调用会返回并告知哪些I/O操作已完成。
- 应用程序根据返回的结果,对已完成的I/O操作进行处理。
优缺点:
- 优点:可以使用单个线程处理多个I/O操作,提高资源利用率和系统并发性。
- 缺点:需要在多个I/O描述符之间进行切换,增加了系统开销,编程复杂性较高。
举例:
你同时点了多家外卖,并使用了外卖平台的“同时追踪”功能。这样,你只需要在平台上查看哪些外卖已经送到,而不需要分别给每家外卖小哥打电话询问。
基本原理:
就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数 据到达了,就通知用户进程。
适用范围:
当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用
当一个客户端同时处理多个套接字时,此情况可能的但很少出现
当一个服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用
当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用
当一个服务器要处理多个服务或多个协议,一般要使用I/O复用
4)信号驱动式I/O(Signal Driven I/O)
具体流程:
- 应用程序先向内核注册一个信号处理函数,并指定要监控的I/O操作。
- 当I/O操作完成时,内核会发送一个信号给应用程序。
- 应用程序的信号处理函数会被调用,对I/O操作进行处理。
优缺点:
- 优点:可以在I/O操作准备就绪时接收到信号通知,不需要轮询,提高了效率。
- 缺点:编程复杂性高,信号处理的可靠性和实时性依赖于操作系统的实现,信号处理开销较大。
举例:
你告诉外卖小哥,一旦外卖送到就给你发条短信。这样,你就不需要一直等在家门口或频繁打电话询问了,只需要等待短信通知即可。
异步阻塞:
程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核收到进程 请求后 进行的IO如果不能立即返回,就由内核等待结果,直到IO完成后内核再通知进程。
5)异步I/O(Asynchronous I/O)
具体流程:
- 应用程序发起一个异步I/O操作,并指定一个回调函数。
- 应用程序立即继续执行,不会被I/O操作阻塞。
- 当I/O操作完成时,内核会调用指定的回调函数,对I/O操作的结果进行处理。
优缺点:
- 优点:I/O操作不会阻塞线程,I/O完成后会通过回调或事件通知,充分利用系统资源,提高并发性能。
- 缺点:编程模型复杂,代码可读性和可维护性差,调试难度大,依赖于操作系统和库的支持。
异步非阻塞:
程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核调用的 IO如果不能立即返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的 结果返回给进程,期间进程可以接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现 较大的同时并实现较高的IO复用,因此异步非阻塞使用最多的一种通信方式
5.I/O 的具体实现方式
常用I/O模型比较
6.零拷贝
零拷贝介绍
①传统 Linux中 I/O 的问题
传统的 Linux 系统的标准 I/O 接口(read、write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_user,这样做的好处是,通过中间缓存的机制,减少磁盘 I/O 的操作,但是坏处也很明 显,大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,严重影响数据传输的性 能,统计表明,在Linux协议栈中,数据包在内核态和用户态之间的拷贝所用的时间甚至占到了数据包整 个处理流程时间的57.1%
②什么是零拷贝
零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做 到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化
零拷页相关技术
①MMAP ( Memory Mapping )
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间 后,进程可以向访问普通内存一样对文件进行访问。 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘 地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。 实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到 对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对 这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。 内存映射减少数据在用户空间和内核空间之间的拷贝操作,适合大量数据传输
②SENDFILE
③DMA 辅助的 SENDFILE
Nginx架构与安装
nginx概述
Nginx是一款高性能的开源HTTP服务器和反向代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发。它以其高并发处理能力、低内存占用、稳定性强和可扩展性好等特性而广受欢迎,被广泛应用于大型网站架构中。
- 高性能:Nginx能够处理大量的并发连接,有报告表明它能支持高达50,000个并发连接数,这使得它在高并发场景下表现出色。
- 开源:Nginx是免费开源的,用户可以直接获取其源代码并根据自己的需求进行修改和扩展。
- 反向代理:Nginx可以作为反向代理服务器,将客户端的请求转发到后端的服务器或服务器集群上,并根据负载均衡算法分配请求,提高系统的可用性和性能。
- 负载均衡:Nginx内置了强大的负载均衡功能,可以根据多种策略(如轮询、最少连接等)将请求分发到不同的后端服务器上,确保系统的负载均衡。
- 缓存:Nginx支持缓存经常访问的内容,如静态文件等,以减少后端服务器的负载并提高页面加载速度。
- SSL/TLS终结:Nginx可以处理加密的HTTPS连接,为网站提供安全性和隐私保护。
- 跨平台:Nginx是一个跨平台服务器,可以运行在Linux、Windows、Mac OS等多种操作系统上。
举例:
假设你经营着一家大型在线书店,每天有成千上万的用户访问你的网站购买书籍。这时,你可以考虑使用Nginx来优化你的网站架构。
- 处理高并发:想象一下,当新书上架时,大量用户同时涌入网站抢购。Nginx就像一个高效的交通指挥员,能够迅速处理这些并发请求,确保每个用户都能顺畅地访问网站,不会因为访问量过大而导致网站崩溃。
- 反向代理和负载均衡:你的书店网站背后可能有多台服务器在同时运行,以处理用户的请求。Nginx可以作为反向代理服务器,将用户的请求转发到这些服务器中的一台。同时,Nginx还会根据负载均衡算法(比如哪台服务器当前负载较轻)来分配请求,确保每台服务器都能得到合理的利用,从而提高整个系统的性能和可用性。
- 缓存静态文件:书店网站上有很多图片、CSS和JavaScript文件等静态资源。这些资源在用户访问时通常不会频繁变动。Nginx可以缓存这些静态文件,当用户再次访问时直接从缓存中读取,而不需要再次从后端服务器获取。这样可以大大减少后端服务器的负载,并加快页面的加载速度。
- SSL/TLS加密:为了保障用户数据的安全,你的书店网站可能启用了HTTPS协议。Nginx可以处理这些加密的HTTPS连接,确保用户数据在传输过程中不被窃取或篡改。
Nginx 功能介绍
静态的web资源服务器html,图片,js,css,txt等静态资源
http/https协议的反向代理
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
tcp/udp协议的请求转发(反向代理)
imap4/pop3协议的反向代理
Nginx 进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程和工作进程介绍
主进程(master process)的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置 开
启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(worker process)的功能:
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
Nginx 启动和 HTTP 连接建立
Nginx 启动时,Master 进程,加载配置文件
Master 进程,初始化监听的
socket Master 进程,fork 出多个 Worker 进程
Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
Nginx 安装
Nginx版本和安装方式
Nginx版本
①Mainline version 主要开发版本,一般为奇数版本号,比如1.19
②Stable version 当前最新稳定版,一般为偶数版本,如:1.20
③Legacy versions 旧的稳定版,一般为偶数版本,如:1.18
Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装
①yum的版本比较旧
②编译安装可以更方便自定义相关路径
③使用源码编译可以自定义相关功能,更方便业务的上的使用
Nginx 编译安装详细过程(附图)
正常安装1.24版本
1.下载nginx
方法一:没有安装压缩包就去官网下载链接 进行下载
方法二:有安装压缩包直接将压缩包拖进来即可
2.解压安装包
tar zxf nginx-1.24.0.tar.gz(具体根据下载的压缩包的名称 可以直接table键补全)
加压出来就是蓝色字体的包
useradd -s /sbin/nologin -M nginx
useradd -s /sbin/nologin -M nginx命令创建了一个名为nginx的新用户,该用户没有家目录,并且无法直接登录系统(因为登录shell被设置为/sbin/nologin)。这种配置通常用于服务账户,以确保服务以最小权限运行,从而提高系统的整体安全性。
继续进行安装
方法一:进行安装的时候会出现哪些东西没有安装包 所以需要去查找安装包的devel没有存在 需要查看了下载
查看dnf search pcre(对应没有的安装包)
查看找到devel的安装包 并进行下载 dnf install pcre-devel.x84_64 -y
方法二:提前安装好所有需要的安装包
make && make install --进行编译文件并检查
make 和 make install 是在软件开发和编译过程中常用的两个命令,它们与 Makefile 文件紧密相关。Makefile 是一个包含了编译、链接等规则的文本文件,make 命令则根据这些规则来自动构建项目。
[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二进制启动脚本,可以接受不同的参数以实现不同的功能
3.验证版本及编译参数
ps:修改查看的信息中的内容(达到可以隐藏版本号的作用)
平滑升级到1.26版本
1.根据链接下载或者安装包下载 (这里需要带上echo文件 与24版本不同的一点就是这里 是需要用echo里面的安装路径信息)
2.直接make(由于已经下载了24版本的 经过了make install 所以升级的话只需要make即可)
3.对老版本备份并将以前的nginx进行强制覆盖成新版本内容
4.检测一下有没有问题
5.停掉旧版本的master,让新版本的Nginx开启一个新的master进程,就会产生新的master和worker
6.回收旧版本 kill -WINCH 旧版本进程号
7.观察用户页面是否发生改变
版本回滚:随意切换版本
1.kill -HUP 12600
2.kill -WINCH 16025
3.重新进行覆盖命令 将nginx还原成24版本 \cp -f nginx.24.old nginx
cp nginx nginx.26.new
这个时候会产生 nginx nginx.26.new nginx.24.old
此时内容将会变成 nginx(实则为24版本) nginx.26.new(实则为26版本) nginx.24.old
4.kill -9 换掉不用的那个进程号
5.curl查看版本号是否改变
Nginx 核心配置详解
配置文件说明
1.nginx 配置文件格式说明
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
2.Nginx 主配置文件的配置指令方式:
directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
nginx启动文件
主配置文件
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
全局配置文件
Main 全局配置段常见的配置指令分类
①正常运行必备的配置
②优化性能相关的配置
③用于调试及定位问题相关的配置
④事件驱动相关的配
vim /usr/local/nginx/conf/nginx.conf
实现nginx的高并发配置
vim /usr/local/nginx/conf/nginx.conf
vim /etc/security/limits.conf
nginx -s reload
核心配置示例
新建一个 PC web 站点
-
mkdir /usr/local/nginx/conf.d/ #定义子配置文件路径
-
vim /usr/local/nginx/conf/nginx.conf #写入配置文件路径
3.在子配置文件中编写内容
4.刷新服务并查看 nginx -s reload(首先这个网址要在windows中有解析 找到host并编写)
利用root 与 alias方法编写
root:
alias--别名:
区别:
location中使用root指令和alias指令的意义不同
location 的详细使用
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配;
而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri;
uri是用户请求的字符串,即域名后面的web文件路径;
然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
优先级
针对目录匹配优先级
针对文件匹配优先级
Nginx 账户认证功能(附图)
1.设置用户和密码
#-b 表示非交互建立用户认证
2.创建对应的目录文件及内容
3.进行配置文件的编写
4.进行检测
自定义错误页面(附图)
1.编写错误页面的主配置文件
2.创建对应的目录以及echo
3.测试
检测文件是否存在
1.修改配置文件
2.如果不存在页面, 就转到default.html页面
3.测试
由于www.csy.org/aaa不存在 所以会跳转
长连接配置
1.下载长链接测试工具 yum install telnet -y
2.修改长链接延迟时间和请求次数
3.使用测试命令:telnet www.csy.org 80(设置的是链接时间为65s不断开 次数是可以请求2次之后才断开)
自动断开:conneciton closed by foreign host
Nginx 高级配置
Nginx 状态页
基于nginx 模块 ngx_http_stub_status_module 实现,
在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
否则配置完成之后监测会是提示法错误
[root@nginx ~]# vim /usr/local/nginx/conf.d/status.conf
[root@nginx ~]# cat /usr/local/nginx/conf.d/status.conf
server {
listen 80;
server_name status.exam.com;
root /data/web/html;
index index.html; #指定默认的索引文件为 index.html
location /status {
stub_status;
allow 172.25.250.1; #允许访问的主机
deny all; #其他所有主机不能访问
}
}
[root@nginx ~]# nginx -s reload
[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl 172.25.250.100/status
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>superhowe/2.0</center>
</body>
</html>
Nginx 压缩功能
Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。
Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块
举例:
[root@nginx web]# vim /usr/local/nginx/conf/nginx.conf
[root@nginx web]# cat /usr/local/nginx/conf/nginx.conf
...
#gzip on
gzip 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/x-http-php image/gif image/png;
...
[root@nginx web]# nginx -s reload
[root@nginx web]# echo hello superhowe > /data/web/html/small.html
[root@nginx web]# du -sh /usr/local/nginx/logs/access.log
52K /usr/local/nginx/logs/access.log
[root@nginx web]# cat /usr/local/nginx/logs/access.log > /data/web/html/big.html
#查看
[root@nginx web]# curl --head --compressed 172.25.250.100/small.html
HTTP/1.1 200 OK
Server: superhowe/2.0
Date: Fri, 16 Aug 2024 08:21:40 GMT
Content-Type: text/html
Content-Length: 16
Last-Modified: Fri, 16 Aug 2024 08:20:15 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66bf0bbf-10"
Accept-Ranges: bytes
[root@nginx web]# curl --head --compressed 172.25.250.100/big.html
HTTP/1.1 200 OK
Server: superhowe/2.0
Date: Fri, 16 Aug 2024 08:21:48 GMT
Content-Type: text/html
Last-Modified: Fri, 16 Aug 2024 08:21:18 GMT
Connection: keep-alive
Keep-Alive: timeout=60
Vary: Accept-Encoding
ETag: W/"66bf0bfe-c813"
Content-Encoding: gzip
#不是对文件进行压缩 而是对文件传输过程进行压缩
Nginx的版本隐藏
用户在访问nginx的时候,我们可以从报文中获得nginx的版本,相对于裸漏版本号的nginx,我们把其隐 藏起来更安全
[root@Nginx nginx-1.26.1]# vim src/core/nginx.h
#define nginx_version 1026001
#define NGINX_VERSION "2.0"
#define NGINX_VER "superme/" NGINX_VERSION
Nginx 变量使用
内置变量
$remote_addr 存放了客户端的地址,注意是客户端的公网IP
$args; 变量中存放了URL中的所有参数
$is_args 如果有参数为? 否则为空
$document_root 保存了针对当前资源的请求的系统根目录
$document_uri 保存了当前请求中不包含参数的URI,注意是不包含请求的指令
$host 存放了请求的host名称
$limit_rate 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port 客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
$remote_user 已经经过Auth Basic Module验证的用户名
$request_body_file 做反向代理时发给后端服务器的本地资源的名称
$request_method 请求资源的方式,GET/PUT/DELETE等
$request_filename 当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
$request_uri 包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
$scheme 请求的协议,例如:http,https,ftp等
$server_protocol 保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr; 保存了服务器的IP地址
$server_name 虚拟主机的主机名
$server_port 虚拟主机的端口号
$http_user_agent 客户端浏览器的详细信息
$http_cookie 客户端的所有cookie信息
$cookie_<name> name为任意请求报文首部字部cookie的key名
$http_<name> name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有 横线需要替换为下划线
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.csy.org;
root /webdata/nginx/csy.org/csy;
location /var {
default_type text/html;
echo $remote_addr;
echo $args;
echo $document_root;
echo $document_uri;
echo $host;
echo $http_user_agent;
echo $request_filename;
echo $scheme;
echo $scheme://$host$document_uri?$args;
echo $http_cookie;
echo $cookie_key2;
echo $http_Accept;
}
}
[root@nginx-node2 ~]# curl -b "title=csy;key1=csy,key2=chengshuyu"
"www.csy.org/var?search=csy&&id=666666"
172.25.254.20
search=csy&&id=666666
/webdata/nginx/csy.org/csy
/var
www.csy.org
curl/7.29.0
/webdata/nginx/csy.org/csy/var
http
http://www.csy.org/var?search=lee&&id=666666
title=csy;key1=csy,key2=chengshuyu
chengshuyu
*/*
自定义变量
假如需要自定义变量名称和值,使用指令set $variable value;
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.csy.prg;
root /data/web/html;
location /var {
default_type text/html;
set $name superhowe;
echo $name;
set $web_port $server_port;
echo $web_port;
}
}
#测试输出
[root@nginx ~]# curl www.csy.org/var
superhowe
80
Nginx Rewrite 相关功能
ngx_http_rewrite_module 模块指令
if 指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location /test2 {
if (!-e $request_filename ) {
echo "$request_filename is not exist";
}
}
}
set 指令
指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key 另外set定义格式为set $key value,value可以是text, variables和两者的组合。
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location /test2 {
set $name howe;
echo $name;
}
}
#测试
[root@nginx conf.d]# curl www.csy.org/test2
howe
break 指令
①用于中断当前相同作用域(location)中的其他Nginx配置
②与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
③位于后面的 ngx_http_rewrite_module 模块中指令就不再执行
④Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置
⑤该指令可以在server块和locationif块中使用
[root@nginx conf.d]# cat var.conf
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location /test2 {
if ( !-e $request_filename ){
echo "$request_filename is not exist";
}
}
location /break {
default_type text/html;
set $name howe;
echo $name;
if ( $http_user_agent = "curl/7.76.1"){
break;
}
set $id 123123;
echo $id;
}
}
[root@nginx conf.d]# curl -A "filehowe" www.csy.org/break
howe
123123
return 指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location /return {
default_type text/html;
if ( !-e $request_filename ) {
echo "$request_filename is not exist";
return 301 http://www.baidu.com;
}
echo "$request_filename is not exist";
}
}
#测试 没有文件夹会出现301 并且定向到baidu
[root@nginx conf.d]# curl www.csy.org/return
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
[root@nginx conf.d]# mkdir -p /data/web/html/return
[root@nginx conf.d]# curl www.csy.org/return
/data/web/html/return is not exist
[root@nginx conf.d]# curl -I www.csy.org/return
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Tue, 20 Aug 2024 10:05:10 GMT
Content-Type: text/html
Connection: keep-alive
Keep-Alive: timeout=60
Location: http://www.baidu.com
rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理
rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制
如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301
rewrite flag 介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时 重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
域名永久与临时重定向
永久重定向301
域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到客户端浏览器
永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也会利用缓存进行重定向
[root@nginx conf.d]# vim var.conf
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location / {
root /data/web/var;
index index.html;
rewrite / http:// www.csy.org permanent;
}
}
[root@nginx conf.d]# mkdir -p /data/web/var
[root@nginx conf.d]# echo var page > /data/web/var/index.html
[root@nginx conf.d]# nginx -s reload
临时重定向302
域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久重定向最大的本质区别。
即当nginx服务器无法访问时,浏览器不能利用缓存,而导致重定向失败
[root@nginx conf.d]# cat var.conf
server {
listen 80;
server_name www.csy.org;
root /data/web/html;
index index.html;
location / {
root /data/web/var;
index index.html;
#rewrite / http://www.csy.org permanent;
rewrite / http://www.csy.org redirect;
}
}
rewrite案例:自动跳转https和判断文件是否存在
要求设置全站加密,并且在不影响用户请求的情况下将http自动跳转到https,另外实现部分location的跳转
1.设置全站加密(设置加密证书和密钥)
172.25.254.100
cd /usr/local/nginx/
mkdir certs
创建放证书和密钥的目录
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
设置证书和密钥
vim /usr/local/nginx/conf.d/vhosts.conf
设置子配置文件 进行功能实现
server {
listen 80;
listen 443 ssl;
server_name www.csy.com;
root /data/web/html;
index index.html;
ssl_certificate /usr/local/nginx/certs/csy.org.crt; #证书
ssl_certificate_key /usr/local/nginx/certs/csy.org.key; #密钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
location / {
if ( $scheme = http ){
rewrite /(.*) https://$host/$1 redirect; #当访问网站不是http的 会自动跳转到https下 处于临时重定向状态 这里的/(.*) /$1是指的uri是一个字符或者没有字符的时候 自动跳转 只限定一个字符 如果要一个以上 还需要继续$2
}
if ( !-e $request_filename ){
rewrite /(.*) https://$host/index.html redirect; #当/后面请求的uri文件不存在的时候 就定向到首页 如果存在/data/web/html中的某个文件就不会定向
}
}
}
nginx防盗链
盗链
意思就是我在另外一台主机的网页显示中 专门指定了要去不是本机的机子上面去盗取图片或者链接来给自己使用的行为 直接跳转到对方机子的链接或者直接使用对方机子存在的照片等 直接拿过来用的行为就是盗链
172.25.254.10
防盗链
基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效 实现防盗链功能
Nginx 反向代理功能
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主 要在不同的场景使用以下模块实现不同的功能
ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass #等指令引用的后端服务器分组
ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理
nginx反向代理以及动静分离
反向代理
动静分离
缓存功能
缓存功能默认关闭状态,需要先动配置才能启用
压力测试:
[root@nginx ~]# ab -n1000 -c100 http://www.csy.org/static/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 www.csy.org (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: nginx/1.26.1
Server Hostname: www.csy.org
Server Port: 80
Document Path: /static/index.html
Document Length: 21 bytes
Concurrency Level: 100
Time taken for tests: 0.239 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 272000 bytes
HTML transferred: 21000 bytes
Requests per second: 4192.68 [#/sec] (mean)
Time per request: 23.851 [ms] (mean)
Time per request: 0.239 [ms] (mean, across all concurrent requests)
Transfer rate: 1113.68 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 2.3 2 11
Processing: 6 20 6.4 20 35
Waiting: 1 19 6.5 19 35
Total: 9 22 5.3 22 38
Percentage of the requests served within a certain time (ms)
50% 22
66% 25
75% 26
80% 27
90% 29
95% 32
98% 35
99% 37
100% 38 (longest request)
缓存:
[root@nginx conf.d]# cat proxy.conf
server {
listen 80;
server_name www.csy.org;
location ~ \.php$ {
proxy_pass http://172.25.250.10:80;
}
location /static {
proxy_pass http://172.25.250.20:8080;
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 1m;
}
}
反向代理负载均衡
在上一个节中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能
七层反向代理负载均衡
#配置nginx反向代理
[root@nginx conf.d]# cat http.conf
upstream webcluster {
server 172.25.250.10:80 fail_timeout=15s max_fails=3;
server 172.25.250.20:8080 fail_timeout=15s max_fails=3;
server 172.25.250.100:80 backup;
}
server {
listen 80;
server_name www.csy.org;
location / {
proxy_pass http://webcluster;
}
}
#轮询
[root@nginx conf.d]# nginx -s reload
nginx四层负载均衡
实现 FastCGI
web和应用程序之间的交流需要通过CGI实现
fastCGI 就是将application始终保持挂起的状态 不关机 实时待命 这样webserver有工作来给CGI时 应用程序可以随时工作 这样就不会让application一会关机一会开机 会造成损害
为什么会有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代码的处理。
FastCGI配置指令
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
}
FastCGI实战案例 : Nginx与php-fpm在同一服务器
1.利用yum解决php依赖
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel --php部分依赖
不存在oniguruma-devel 需要去找资源进行下载 我找的是阿里云的资源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
./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 --下载所有依赖
ps:
#解压源码并安装
[root@Nginx~#/configure
--prefix=/usr/1ocal/php \#安装路径
--with-config-file-path=/usr/1oca1/php/etc \ #指定配置路径
--enable-fpm \ #用cgi方式启动程序
--with-fpm-user=nginx \ #指定运行用户身份
--with-fpm-group=nginx
--with-curl \ #打开cur1浏览器支持
--with-iconv \ #启用iconv函数,转换字符编码#mhash加密方式扩展库
--with-mhash \
--with-zlib \ #支持z1ib库,用于压缩http压缩传输
--with-mysqli \
--with-openssl \ #支持ss1加密
--enable-mysqlnd \ #mysq1数据库
--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
make && make install --进行编译
cd /usr/local/nginx
ll ---进行查询 是否存在
2.存在需要的php安装包并解压
3.php相关配置优化
指定pid文件存放位置
生成主配置文件并修改修改时区
生成启动文件并注释protectsystem
4.测试php页面
5.nginx配置转发 配置子配置文件
6.添加php环境变量
php的动态扩展模块(php的缓存模块)
1.安装memcache模块
压缩命令:tar zxf memcache-8.2.tgz
[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-non-zts-20230831/
2.复制测试文件到nginx发布目录下
vim /data/web/php/memcache.php 我是将这两个文件cp到了这个路径下
3.配置php加载memcache模块
4.部署memcached
5.测试
php高速缓存
部署方法:在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所 以nginx需要重新编译 所以需要把我们之前做的nginx 的所有操作删除重新下载并编译
1.删除原先nginx操作并对新nginx进行压缩包解压
rm -fr /usr/local/nginx/ --删除之前所有对nginx之前的缓存操作
进行解压
2.生成nginx源码时将该两个模块进行添加并编译
[root@Nginx nginx-1.26.1]#./configure --prefix=/usr/local/nginx\ #指定nginx运行用户
--user=nginx\ #指定nginxi运行组
.-group=nginx\
--with-http ssl module\
--with-http v2 modulel
--with-http realip module\
--wi th-http stub status module\
--with-http gzip static module\
--with-pcre\
--with-stream\
--with-stream ss1 module\
--with-stream realip module\
-add-module=/root/echo-nginx-module-0.63\.
-add-module=/root/memc-nginx-module-0.20\.
-add-module=/root/srcache-nginx-module-0.33
[root@Nginx nginx-1.26.1]make && make install
3.配置子配置文件php.conf
[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 www.csy.org;
root /html;
index index.html;
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$ {
root /php;
set $key $uri$args;
srcache_fetch GET /memc $key; #设定key的值
srcache_store PUT /memc $key; #检测mem中是否有要访问的php
fastcgi_pass 127.0.0.1:9000; #缓存为加载的php数据
fastcgi_index index.php;
include fastcgi.conf;
}
}
4.重启并测试
systemctl start nginx.service