2023NGINX完全指南第二版.docx

上传人:李司机 文档编号:7263152 上传时间:2024-08-04 格式:DOCX 页数:180 大小:555.69KB
返回 下载 相关 举报
2023NGINX完全指南第二版.docx_第1页
第1页 / 共180页
2023NGINX完全指南第二版.docx_第2页
第2页 / 共180页
2023NGINX完全指南第二版.docx_第3页
第3页 / 共180页
2023NGINX完全指南第二版.docx_第4页
第4页 / 共180页
2023NGINX完全指南第二版.docx_第5页
第5页 / 共180页
点击查看更多>>
资源描述

《2023NGINX完全指南第二版.docx》由会员分享,可在线阅读,更多相关《2023NGINX完全指南第二版.docx(180页珍藏版)》请在三一办公上搜索。

1、第二版NGINX完全指南实现高性能负载均衡的进阶实操指南aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1.0简介11.1 在DeOian,Ubuntu上安装NG1.NX11.2 在RedHauCentOS上安装NG1.NX21.3 安装NG1.NXPIuS31.4 验证安装31.5 关成文件.目录和命令41.6 提供静态内容61.7 三1.fi我72 .高性能负SM92.1 简介92.2 HTTP负蛇均衡102.3 TCP负我均衡112.4 UDP负线均衡132.5 负或均衡方式142.6 NGINXp1.usZSbCkyCKH1751825

2、8试配置17619 .17920 .索引181基础知识1.1 简介无论是NGINX开源版还是NGINXP1.us,您都要先在系况上安装它们并学习一些基叱知识.在本章中,您楮学习如何安装NGINX,主要配置文件位于何处以及管理命令是什么.还将了以如何蛤证悠的安装并向默认版务器发出请求.1.2 在Debian/Ubuntu上安装NGINX问题在Debian或Ubuntu机器上安装NGINX开源版.解决方案更新已配置源的软件包信息,并安装一些有助于配Bt官方NGINX软件包仓库的软件包:pt-gctupdateaptinsta1.1-ycur1.11up*2ca-ccrti1.icates1.sb-

3、re1.easedebian-archive-keyriM下载并保存NGINX签名密钥:cur1.https:/nginx.orft/kys7ninx_sinning.key:gpg-derrrtec/usr/sharc/kcyring三in-archivc-kcyrin.SPIkvnu11使用Isbje1.ease设置定义掇作系统4口版本名称的变,然后创建轲源文件:CSre1.enseistrzupprr:*:1.rir:)RE1.1.SE=SIsbre1.ease-cs)echoe=ngtnxrepoboser1.=ttpznginx.orgypackages/OS/OSREIESE/Sb

4、asearch/KPKchcck-Oenab1.ed=修改文件,将UR1.中间的OS替换为rh或centos,具体取决于您的发行版本.分别将版本7.x或8.x的Osre1.ease替换为7或8.然后阖亍以下命令:yunyinx1.a1.1nginxsystcDct1.enab1.enginxsystenct1.startnginxfirena1.1-crad-pcrnancnt-ZomPUbIiC-add-portiOtcpfirewa1.1.-cod-re1.oad详解您刚刚为此解决方案创建的文件将指示YUM软件包管理系统使用官方NGINX开源版软件包仓:.后面的命令将从官方仓库安装NGIN

5、X开源版,指示SyS1.emd在启前时启用NGINX,并告知它立即启动.防火墙命令为TCP协议打开端口80.这是HTTP的家认端口.最后一个命令奥斯加我防火IS,以提交更改,1.4 安装NG1.NXP1.US问题安装NG1.NXP1.us.解决方案Ift访问httpy/cs.nginx.ccmrepo_setup.从下拉菜单中选择您要将NGINXP1.us安装到哪个探作系统,然后技照说明进行操作.其安装说明与开源解决方案类似,但是您需要安装一个证书,以便对NGINXP1.us仓库进行身份验证.详解NGINX会及时更新这个仓库安装指南和NGINXP1.us安装说明.这些说明因您的探作系统和版本而

6、珞有不同,但都有一个共同点:您必须从NGINX门户获取证书和密钥并提供给您的系统,以便对NGINXP1.us仓库进行身份给iE1.5 验证安装问题始证NG1.NX是否安装成功并检直版本.解决方案您可以使用以下命令验证NGINX是否安装成功并检查其板本:$usin-vnginxversion:nginx1.2i.3如本例所示,响应显示了版本.您可以使用以下命令确认NGINX是否正在运行:$px-efrcp11inxroot17381O19:S4?00:00:00nginx:wasterprocessninx17391738019:54?00:00:00ngix:workerprocessPS命令

7、列出了正在国亍的进程.通过将该命令导入到grep中,您可以在输出中搜索特定词.此示例使用grep搜索ngin.结果显示有两个正在运行的进程:master和worker.如果NGINX正在运行中,您将蛤终可以看到一个master以及一个或多个worker进程.清注表,master进程以root身份运行,因为NGINX只有使用最高权限才能正席运行.有关启动NGINX的说朗,请参阅下一节,要了解攵晌将NGINX作为守护进程启动,请使用i11it.d或SyStemd方法.要验证NGINX能否正磕返回请求,请使用浏览器向您的机器发出请求或使用cur1.发送请求时,请使用机器的IP地址或主机名.如果安装在

8、本地,您可以使用1.oca1.host,如下所示:cur1.Iocd1.host您将看到NGINX欢迎页面飘认的HTM1.站点.详解11ginx命令允许您与NGINX二进制文件交互,以便洽卸板本列出已安装的模块、测试配置以及向master进程发送信号.NGINX必须在运行时才能服务请求.ps命令是一种斓定NGINX是守护进程还是前台进程的可旅方法.NGINX默:认提供的配置在送80上运行衿落站点HTTP服务器.为了测试这一默认站点,您可以使用1.oca1.host以及主机的IP地址和主机名向机器发送HTTP请求.1.6 关键文件、目录和命令问题了解出要的NG1.NX目录和命令.解决方案NGIN

9、X文件和目录以下文件、目录和命令对于NG1.NX新手来说十分田要.etcfnginetcnginx目录是NG1.NX服务港的默认f1.己留根,您可以从中找到指示NG1.NX如何运行的配置文件.e1.Gngi,confotegi欣ngmx.conf文件是NG1.NX股务使用的敷认配置入口点.此配置文件能够为worker进程.两优、日志记我动态模块的加载以及对其他NG1.NX配窗文件的引用设Ii全局设置.在默认配置中,ZteZngjnxmggx8”文件包括顶层http代码块,也就是上下文,它提供了下述目录中的所有配置文件.3e忙MgirW8nfd包CSjWWfc0”.”目录包含默认的HTTP版务表

10、配置文件,其中以.8球结尾的文件都包含在eta1.nginx.ng1.nx.conf文件的顶层h1.ip代码块中.最佳实践是利用inc1.ude语句并以这种方式姐织配IS,从而保持配接文件的简洁.在臬些软件包仓库中,此文件夹被命名为SMS-enab1.ed,配罩文件链接到site-avai1.ab1.e文件夹:此惯例已不再使用.Zvae1.ogfngicxfvarngi/目录是NG1.NX的默认日志位窗,您可以从中找到一个access.Iog文件和eof.og文件.访问日志包含NGINX版势的每条请求的条目.如果启用了debug模块,则错误日志文件包含错误事件调试信息.NGINX命令nginx

11、h显示NGINX帮助菜单.nginxV显示NGINX版本.nginxV显示NGINX版本.bui1.d信息和配制拿故,这些参数显示了NGINX二进制文件中内置的模块.nginx-t测试NGINX配置.nginx-7测试NGINX配置并将皴证后的配置打印到屏幕上.此命令在寻求支持时很有用.nginx-ssigna1.-S标记向NGINXmasterifi程发送信号.您可以发送stop,quit,re1.oad和reopen等信号.stop信号可立艮陶止NGINX进程.qui1.信号会在完成当前正在处理的请求后停止NGINX进程.re1.oad信号可壬新加我配置.reopen信号指示NGINX雨新

12、打开日志文件.详解在了解这些关/文件.目录和命令后,您就可以准话开始使用NGINXT.您可以运用这些知识更改默认配置文件,并使用11ginx-t命令测试您的更改.如果测试成功,您还将了解到文IMsI使用ngin-sre1.oad命令指示NGINX而新加载配置.1.7 提供静态内容问Sg使用NG1.NX提供静态内容.解决方案使用以下NGINX配置示例厦盖位于tayg1.n.ddefa1.t.n的默认HTTP服务器配置:JiorVCrI1.isten80dofau1.t,server;server_nae*vexw1.e.oon;1.ocation/(rootusrsh3*nginxhn1.:Sa

13、1.iasusrsiareninyht11i;indexindi*x.htnIindex,h1.n:详解此配置通过HTTPSS80上从目录/us/Iaengw向向卷供静卷文件.第一行配置定义了一个新的server代码块,这为NGINX定义了一个需要侦听的新上下文.第二行指示NGINX侦听端口80.defau1.t-server参数指示NGINX使用此服务翳作为端口80的联认上下文.1.isten指令也可以使用一系列端口.servername指令定义了主机名或应定向到此辍务器的请求的名称.如果配置没有将此上下文定义为defau1.t,server,那么只有当HTTP主机请求头与提供给server

14、name指令的值相匹配时,NG1.NX才会将请求定向到这台服务器.如果您还没有要使用的域名,则可以通过设置defau1.t_server上下文省8Servejname指令.1.ocation代码块根宪UR1.中的路径定义配置.路径或域之后的部分UR1.被称为Sg-资源标识符(URI).理想情况下,NG1.NX会将请求的UR1.匹网f1.ocation代码块.示例使用了,匹配所有i求.root指令向NGINX显示了为给定上下文理供内容时应在何处直找静态文件.在有找请求的文件时,语求的URI会附加到root指令的值,如果我们为IoCation指令提供了URI前缀,另障除非阳i股用a1.ias指令(

15、而非root),否则该前屣将包含在酎加路径中.IoCation指令的第匹配一系列广泛的表达式.有关更多信息,请访问下方其他参考资中的链接.最后,index指令为NGINX提供了一个默认文件或要桧意的文件列表,以防URI中没有提供进一步的路径.其他参考姿料NGINXHTTP1.ocation指令文档1.8 优雅重载问题在保证不丢包的情况下更新加找配JS.解决方案通过使用NG1.NX的re1.oad方法,您可以在不中止服务器的情况下有条不素地田载配nginx-Sre1.oad此示例使用NGINX二进制文件向master进程发送信号,从而达到田戢NGINX系统的目的.详解通过在不中止服务援的情况下市

16、或NGINX配置,您将随够动态更改配置,同时又不丢失任何数据包.在正常运行时间蛟长的动态环境中,您需要在某个时间点更改负爹均物配置.NGINX允许您在保持负我均密器在战的同时执行此操作.此功8限供了无数可能性,例如在实时环境中田新运行配置管理,或者构建应用感知型和集群感知型模块来动态配置和重载NGINX,从而潴足环境需求.高性能负载均衡2.1 简介如今的互联网用户体验溜不开出色的性能和正常运行时间.为此,企业需要运行多个相同的副本,并将负我分散在整个系统集群上.能耕负栽的增加,卖群内会引入新的副本.这种架掏技术称为水物屏,基于软件的热础架构因其灵活性而愈发受欢迎,并创造了更多的可能性.无论是仅

17、有两个系统副本组成的高可用性方案,还是全球范国内成千上万个系疣构成的大型集群,它们都需要一献像其批架构一样动态的负磁均衡就决方案,NG1.NX能够以多种方式满足这一需求,例如HTTP.TCP和用户数据报办议(UDP)负我均衡,本章将会对这些内容进行详细介绍.在实施负栽均衡时,必须要保证对客户体给产生完全正面的影响.许多现代Web架构采用无状态应用层,格状态存储在共享内存或锹据库中.但是并非所有架构都是如此.在交互式应用中,会话状态不仅逋含着亚大价值,而且应用十分广泛.出于多种原因例如在需要处理大数据的应用中,为了避免性畿方面的高用网络开销,这个状态可能就会存催到本地的应用服务器上.在这种情况下

18、,后续的请求会被继续交付到同一台服务器,这对保障用户体验极其无要.与此同时,在会话完成之前,服努器不会得到释放.大规模使用有状态应用需要智箱负载均衡器.NGINXP1.us提供了多种果踪cookie或路由的办法来解决这一问鹿.本章介绍了会话保持.因为它与NGINX和NGINXPIUS的负载均密有关.瑜保NGINX所服务的应用的健康状态十分垂要.出于多种原因,上游(upstream)请求可能会失败,例如由于网络连接不佳、服务器故障或应用故障等等.代理和负载均磨粉必须足够智绫,以检测上游艇务器(负载均衡器或代理后面的服务器)的故障,并停止向它们传输流员;否则客户端只能等待,最终超时.当服务器出现故

19、障时,一种避免服务降级的方法是让代理检食上游假若器的健康伏况.NG1.NX提供了两种不同类型的做康检直方法:被动式(NGINX开源版提供)和主动式(仅NGINXP1.us提供).定期执行的主动尊康的杳会与上游服务器建立连接或向其发送请求,并且睑证响应是否正确,被动健康检更能够在客户端发出请求或建立连接时监控上游服若器的连接或响应.您可能希望使用鼓动犍康怆目来减少上游服努器的负我,并使用主切钦康松者喻定上游服务器的故障,以免引发客户端服务失败.本章燧后探讨了如何监控正在实随负裁均密的上游应用眼若器的混取状况.2.2 HTTP负载均衡问题将负践分发到两台或多台HTTP服务器.解决方案在NGINX的

20、HTTP模块内使用upstream代码块对HTTP服务器实fig负靓均衡:istrv4inbckcri(server10.10.12.-15:80VCiKh11:serverapp.exa111.e.coe:8(1.VZKht=2:serverspax*.exe11r1.e.cau:81.)bckup;JserverIIocntian/(PmXy_PaXhttzhnckmd:该配置对端口80的两台HTTP服务器实施负我均笏,然后再将另一台服务器定义为backup,以便在两台主服务器不可用时发控作用.weight拿数指示NGINX向第二台服务器传输两倍的请求.它的默认值为1.详解HTTP的ups

21、tream模块控制着HTTP负载均衡.该模块定义了一个目标池它可以是Unix套接字、IP地址和DNS(域名服务)记录的任意组合,也可以是它们的混合使用配置.upstream模块还定义了如何将任一请求分发给任何上游(upstream)服务器.每个上游目标都通过server指令在上游池中进行定义.SerVer指令接收Unix套接字,IP地址或FoDN(全跟定域名)以及一些可选的参数.可选参数能援增强对请求路由的控制.这包括均衡裨法中服务器的weight参数(无论器处于待机模式、可用还是不可用),以及琳定服务器是否不可用的管数.NGINXP1.us还提供了许多其他好用的多数,例如对服务器的连接限制高

22、级DNS研析控制以及在眼弟器启动后缓慢增加与版务器的连接等等.2.3 TCP负载均衡问题将负我分发到两台或多台TCP服务器.解决方案在NGINX的stream模块内使用upstream代码块对TCP版努器实施负载均衡:strcan|upstremmysQ1.reed(serverread1.exup1c.cx:3306veiht-5;serverread2.exajp1.Coa:3306:server10.10.12.34:3306backup;server(1.isten3306;proxy.passtysq1.mad;此示例中的server代码块指示NGINX侦听TCP端口3306,并对两

23、个MySQ1.数据冰读取副本实施负载均瘠,同时将另一台服务器定义为backup,以便在主务器崩溃时传输流量.此配SS不会被添K1.到COn3文件夹中,因为该文件夹包含在http代码块中;您应该另行创建名为seamed的文件夹,打开Sxenf文件中的stream代码块,添加新文件夹以支持Stream配置.示例见下.在f的MXZngMX.conf配篇文件中:usernnx;Wriei1.processesKUIo;pidru11115inx.pid:811W1inc1.udeetcnginxstrwn.conf.#*.conf:)名为ZBfeT)gnxQeam.8md7nysJeads.8#的文件

24、可能包含以下配置:Ups1.rcannysq1.read(serverread!,exanp1.e.cca:33O6weigt=5:serverrcad2.cxacp1.e.cas:33O6;server10.10.12.34:306backup:)server(1.isten3306;proxypassBIyJtq1.read:)详解http和stream上下文之间的主要区另!三于它们在OS1.模型的不同层上运行.http上下文在应用层(七层)运行,stream在传谕层(四层)运行.这并不意味ISstream上下文不能通过一些巧妙的脚本获得应用感知链力,而是说hup上下文是专门为了完全理解H

25、TTP协议而设计的.stream上下文默认情况下只能对数祭包进行路由和负我均衡.TCP负载均密由NGINX的stream模块定义.stream模块与HTTP模块T,允许您定义上游(upstream)职务器池并配JS侦听服务器.在配置服务器侦听给定端口时,您必须定义待侦听的端口或者地址加端口(可选).然后您必须配置目标用务,无论这是连接另一个地址的直接反向,铤还是上海资源池.配道中有许多选项可以改变TCP连接反向代理的属性,包括SS1.T1.S蛤证限制、超时和keepa1.ive等.这些代S选项的一些值可以是(或者包含)变,,例如下载速率、验证SSuT1.S证书时使用的名标等.TCP与EP负戟均

26、衡中的upstream指令非常相似,它们均将上游资源定义为服务器,配置格式同样为Unix套接字、沪或FODN,此外服务器wight参数、耿连接数.DNS解析那、连接数馁埴期以及判断服务器是激活状应.故脚状态还是备用模式的参数也都相似.NGINXP1.us甚至提供了更多TCP负载均衡特性,这些高级特性贯穿整份指南.本京福后将介绍所有负我均衡的健康检更.2.4 UDP负载均衡问题格负战分发到两台或多台UDP服务器.解决方案在NGINX的stream模块内使用upstream代码块(定义为udp)对UDP服务器实施负载均衡:strwinIupstrvnntp(serverntp1.exaw1.e.c

27、on:123VZgh1.=2;servernt2.ci即】0.can:123;)server(1.istenJ23udp:prtxy,asntp:这部分配置对使用UDP协议的两台上游(upstream)网络W间协议(NTP)服务融施了负载均衡.UDP负载均衡的指定非常福单,只需使用IiSten指令中的UdP尊数便可.如果进行负载均衡的服务需要在客户筑和股务器之间来回发送多个数据包,卯J可以指定reuseport尊数.例如,OpenVPN、互联网语音例议(VoIP).虚拟更面耨决方案和数据报传输层安全(DT1.S)都是这种类型的服务.下面举例说明了如何使用NGINX处理OpenVPN连接并将其代

28、理到本地运行的OpenVPN服务:S1.rcanIserver1.isten1195udprruxcort;proxy.pass127.0.0.1:1194:)详解悠可胡会问:我的DNSA或服务记录(SRVifig)中已足有多个主机了,又何必再要负我均费器呢?原因是我们不仅有备选的负我均衡算法,我们还可以对DNS服务器本身实施负裁均衡.UDP服务构成了我们在网络系统中依赖的许多服若,例如DNS.NTP.QUIC.HTTP/3和VoIP.UDP负载均衡可婚寸某些企业来说不太常见,但在大型环境中十分有用.与TCP类似,您可以在stream模块中找到UDP负我平衡,并以同样的方式完成大部分配置.两者

29、的主要区别在于,UDP负裁均衡的1.isten指令指回J开的套接字用于处理教据报.此外,在处理数据报时,UDP负载均衡还提供了TCP所没有的一些其他指令,例如ProXyFSPOnSe指令,它向NGINX指定了可以从上游服务器发送多少预期的响应.默认情况下,除非达到proxyjimeout限制,否贝膻T是无限的.ProXy_timeout指令设置了在连接关闭之前,客户疏或代理服务器连接连续进行两次读取或写入操作之间的时间.reuseport悉数指示NGINX为每个WOrker进程创建一个单独的侦听套接字.这允许内核在worker进程之向分发传入的连接,以处理在客户端和服务把之何发送的多个数据re

30、useport功能仅适用于1.inuxkerne1.s3.9及更高版本、DragonFIyBSD,FreeBSD12及更高版本.2.5 负载均衡方式问题轮询负载均衡不适合您的用例,因为您有异掏工作负我或服务器池,解决方案使用NG1.NX的负载均衡方法之一,例如最少连接.最短时间、通用哈希.随机算法或IP哈标此示例格后送上游(UpSIrCam)池的负我均衡算法设为了最少连接:Upsireanbckeni1.eastcnnx:servrback*d.x出p1.e.Ca:serverhckc11d1.crp1.o.con:除了通用哈希、脑机总法和最短时间外,所有其他负载均衡比去都是独立的指令,如上例

31、所示.下面的详解一节解译了这些指令的参数.详解并非所有请求或数据包都有相同的权雨.有羞于此,轮询S至上例使用的加权轮询都将无去满足所有应用或流量的需求.NG1.NX提供了多种负载均瘠算法,您可以根Jg特定的用例进行选择,也可以对你选择的算法进行配置.以下负我均衡方法可用于上游HTTP.TCP和UDP池:颜轮询是默认的负载均衡方法,它按照上游池中服务器列表的联序分发请求.当上游服务器的客量变化时,您还可以考虑使用加权轮阅.权R的整数值越高,服务器在轮询中的优势就越大.权王背后的期去只是加权平均值的统计槌率.最少连接此方法通过将当前请求代理到打开连接数最少的上游服务器实现负载均衡.与轮询一样,在决

32、定将连接发送到哪台版务器时,屐少连接也会考虑赃.其指令名称是1.eastn.iS短时间该算法仅在NG1.NXP1.us中提供,与屐少连接过法类似,它将请求代理到当前连接数1少的上游服务器,但首选平均响应时间Itt短的股竺器.此方法是展算杂的负载均笏算法之一,能够满足高性能Web应用的需求,母短时间在最少连接的基础上进行了优化,因为少金连接并不一定怠味若最快的响应.使用此算法时,切记要考虑服务请求时间拗计差异.有些请求可能本身就需要更多的处理,请求时间也就更长,因而拉宽了抗计的范围.请求时间长并不一定意味落服务器性他欠佳或超负荷工作.但是,需要进行更多处理的请求可以考虑使用肆步工作流用户必须为此

33、指令指定header或IaS1.by1.e叁数.当指定header时,使用接牧响应头的时间;当指定1.astbyte时,使用授牧完整响应的时间.其指令名称是1.easttime.通用哈希管理员使用请求或运行时给定的文本.变量或两者的组合定义哈希值.NGINX能够为当前请求生成哈希伯并将其放在上游服务器上,从而在这些务器之间分发负载.当您希望更好地控制请求的发送位留或确定摩台上游版务器Ia有可能缓存数据时,此方法就会派上用场.请注意,当从池中游力四出赊服若器时,将田新分发哈希请求.Itm法有一个可选的参数:consistent,它能够格至新分发带来的影晌最小化.其指令名称是hash.随凯该方法用

34、于指示NGINX从组中随机选择一舔艮务器,同时考f三务器的权亚.可选的two(method参故指示NGINX随机选择两台服务器,然后使用提供的负我均衡方法对两者均匀地分发请求.默认情况下,如果传筋的参数只有two.没有method,则使用IeaS1.Conn方法.Bfi机负载均密的指令名称是random.IP蛤希此方法仅适用于HTTP.IP哈希第;去使用客户髭IP地址作为哈希.IP哈希与通用哈希存在细潴的不同,前者使用IPv4地址的前三个/US制位或整个IPv6地址,而后者使用的是远程变量,当会话状态十分灾要,但又无去通过应用的共享内存进行处理时,此方法可确保客户端始终被代理到同一上游服务器(

35、只要版务器可用).此方法在分发哈希伯时也考虑了weight叁数.只指令名称是ip-hash.2.6 NGINXP1.us2.StickyCookie问题使用NG1.NXP1.us将下游(downstream)客户端绑定到上游(upstream)服务器.解决方案使用stickyoki指令指示NGINXP1.us创建和跟踪ckie:uptreBbackendIxorverhnckrnci1.cxnn1.c.con;serverbackcfxJ;stickycookieaffinityexpires=Ihdofvin-.(!xnr1.o.canhttpoo1.ysoCUrgpath=/;此配置创建并跟踪了一ckie,该okie可以将下游客户途绑定到上游服为那.在此示例中,cookie被命名为affrty,为设置,有效期为一个小时,无法在客户端使用,只能通过HTTPS发送,并且对所有路径有效.详解在stcky指令中使用cookie参数,为第一个请求创建一个包含上游服务器信息的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号