当前位置: 首页 > 科技观察

Nginx进阶篇:从原理到实战,吃透Nginx

时间:2023-03-12 00:26:02 科技观察

通过配置Nginx配置文件,实现正向代理、反向代理、负载均衡、Nginx缓存、动静分离、高可用Nginx6功能,并实现Nginx的原理进一步分析。当需要使用Nginx配置文件时,参考本文示例即可。1.正向代理正向代理的代理对象是客户端。正向代理是指代理服务器为客户端访问目标服务器。1.1实战1实现效果:在浏览器中输入www.google.com,浏览器会跳转到www.google.com。具体配置:server{resolver8.8.8.8;listen80;location/{proxy_passhttp://$http_host$request_uri;}}在需要访问外网的客户端上,执行以下操作之一:1.方法一(推荐)exporthttp_proxy=http://你的正向代理服务器地址:代理端口2方法2vim~/.bashrcexporthttp_proxy=http://你的正向代理服务器地址:代理端口2反向代理反向代理是指proxy后端服务器响应客户端请求的中间服务器,代理的对象是服务器。2.1实战1的实现效果:在浏览器中输入www.abc.com,从nginx服务器跳转到linux系统中tomcat的主页面。具体配置:server{listen80;server_name192.168.4.32;#监听地址位置/{roothtml;#/html目录proxy_passhttp://127.0.0.1:8080;#请求重定向到indexindex.htmlindex.htm;#设置默认页面}}2.2实战2实现效果:根据浏览器输入的不同路径,跳转到不同端口的服务。具体配置:server{listen9000;server_name192.168.4.32;#监听地址location~/example1/{proxy_passhttp://127.0.0.1:5000;}location~/example2/{proxy_passhttp://127.0.0.1:8080;}}location指令说明:~:表示uri包含正则表达式,区分大小写。~*:表示uri包含正则表达式,不区分大小写。=:表示uri不包含正则表达式,需要严格匹配。3负载均衡3.1实战1实现效果:在浏览器地址栏输入http://192.168.4.32/example/a.html,平均到5000和8080端口,实现负载均衡效果。具体配置:upstreamserver{server192.167.4.32:5000;server192.168.4.32:8080;}server{listen80;#监听端口server_name192.168.4.32;#监听地址位置/{roothtml;#html目录索引index.htmlindex.htm;#设置默认页面proxy_passhttp://myserver;#请求到myserver定义的服务器列表}}nginx分配服务器策略轮询(默认)按照请求的时间顺序逐一分配。如果服务器宕机,可以自动清除。权重越高,分配的客户端越多,默认为1。例如:upstreammyserver{server192.167.4.32:5000weight=10;服务器192.168.4.32:8080权重=5;}复制代码ip根据请求的ip的hash值分配,每个访问者访问一台后端服务器。例如:上游myserver{ip_hash;服务器192.167.4.32:5000;服务器192.168.4.32:8080;}复制代码fair根据后端服务器的响应时间分配,响应时间短的请求优先。例如:上游myserver{fair;服务器192.168.4.32:5000;服务器192.168.4.32:8080;}4.Nginx缓存4.1实战1的实现效果:3天之内,通过浏览器地址栏访问http://192.168.4.32/a.jpg,不会从服务端拉取资源,会从服务端重新下载服务器在3天后(已过期)。具体配置:#http区添加缓存区配置proxy_cache_path/tmp/nginx_proxy_cachelevels=1keys_zone=cache_one:512minactive=60smax_size=1000m;#server区添加缓存配置位置~\.(gif|jpg|png|htm|html|css|js)(.*){proxy_passhttp://192.168.4.32:5000;#如果没有缓存,转向请求proxy_redirectoff;proxy_cachecache_one;proxy_cache_valid2001h;#为不同的HTTP状态码设置不同的缓存时间proxy_cache_valid5001d;proxy_cache_validany1m;expires3d;}expires是为一个资源设置一个过期时间。通过设置expires参数,浏览器可以缓存过期时间之前的内容,减少服务器与服务器之间的请求和流量。也就是说不需要去服务器验证,直接通过浏览器本身就可以确认是否过期,所以不会产生额外的流量。这种方法非常适合不经常更改的资源。五、动静分离5.1实战1成就:通过浏览器地址栏访问www.abc.com/a.html,访问静态资源服务器的静态资源内容。通过浏览器地址栏访问www.abc.com/a.jsp,访问动态资源服务器的动态资源内容。具体配置:upstreamstatic{server192.167.4.31:80;}upstreamdynamic{server192.167.4.32:8080;}server{listen80;#监听端口server_namewww.abc.com;监听地址#拦截动态资源位置~.*\.(php|jsp)${proxy_passhttp://dynamic;}#拦截静态资源位置~.*\.(jpg|png|htm|html|css|js)${root/data/;#html目录proxy_passhttp://static;autoindexon;;#自动打开文件列表}}6.高可用通常通过nginx主服务器访问后台目标服务集群。当主服务器挂掉后,会自动切换到备份服务器,备份服务器将作为主服务器的角色访问后端目标服务器。6.1实战实现效果1:准备两台nginx服务器,通过浏览器地址栏访问虚拟ip地址,停止主服务器上的nginx,再次访问虚拟ip地址仍然有效。具体配置:(1)在两台nginx服务器上安装keepalived。keepalived相当于一条路由。它使用一个脚本来检测当前服务器是否还活着。如果还活着,则继续访问,否则切换到另一台备份服务器。#installkeepalivedyuinstallkeepalived-y#查看版本rpm-q-akeepalivedkeepalived-1.3.5-16.el7.x86_64(2)修改主服务器/etc/keepalived/keepalivec.conf配置文件(可直接替换),完成来自配置的高可用性主机。keepalived将nginx服务器绑定一个虚拟ip,nginx高可用集群对外暴露这个虚拟ip,客户端通过访问这个虚拟ip来访问nginx服务器。global_defs{notification_email{acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from_Alexandre.Cassen@firewall.locsmtp_server192.168.4.32smtp_connect_timeout30router_idLVS_DEVEL#在rretc/hosts文件中,我们可以通过pp_的http_script访问host的配置在rretc/hosts文件中。script"/usr/local/src/nginx_check.sh"interval2#检查脚本执行的时间间隔weight2#每次加2个权重}vrrp_instanceVI_1{interfaceens7f0#网卡,需要修改stateMASTER#在备份服务器上,改MASTERtoBACKUPvirtual_router_id51#主备机的virtual_router_id必须相同priority100#主备机优先级不同,主机值大,备机值小advert_int1#每次发送心跳多长时间(default1s)检测服务器是否还活着authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.1.100#VRRPH虚拟地址,可以绑定多个}}字段说明router_id:配置在/etc/hosts文件中,通过它我们可以访问我们的主人。127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6127.0.0.1LVS_DEVELcopycodeinterval:设置脚本执行权重的间隔时间:当脚本执行失败,即keepalived或者nginx挂了,权重增加的值(可能是负数)。interface:输入ifconfig命令查看当前网卡名称是什么。ens7f0:flags=4163mtu1500inet192.168.4.32netmask255.255.252.0broadcast192.168.7.255inet6fe80::e273:9c3c:e675:7c60prefixlen64scopeid>0x20添加detection/usrnginx脚本下的检测/源目录。#!/bin/bashA=`ps-Cnginx-no-header|wc-l`if[$A-eq0];then/usr/local/nginx/sbin/nginxsleep2if[ps-Cnginx-no-header|wc-l`-eq0];thenkillallkeepalivedfifi(4)启动两台服务器的nginx和keepalived。#启动nginx./nginx#启动keepalivedsystemctlstartkeepalived.service(5)查看虚拟ip地址ipa。停止主服务器192.168.4.32nginx和keepalived,然后访问虚拟ip查看高可用效果。6、原理分析Nginx启动后,Linux系统中有两个进程,一个是master,一个是worker。master作为管理员,不参与任何工作,只负责将不同的任务分配给多个worker(通常有多个worker)。ps-ef|grepnginxroot20473102019?00:00:00nginx:masterprocess/usr/sbin/nginxnginx4628204730Jan06?00:00:00nginx:workerprocessnginx4629204730Jan06?00:00:00nginx:workerprocessworker如何先通过request发送请求,masterclient收到请求后管理员将请求通知worker,多个worker通过竞争机制抢夺任务。拿到任务的worker会通过tomcat转发请求,反向代理,访问数据库等(nginx本身是不直接支持java的)。一主多工的好处?您可以使用nginx-sreload进行热部署。每个worker都是一个独立的进程。如果其中一个worker出现问题,其他worker会独立运行,并会继续竞争任务,在不造成服务中断的情况下完成客户端的请求流程。应该设置多少工人?Nginx和redis类似,都是使用io多路复用机制。每个worker都是一个独立的进程,每个进程只有一个主线程,以异步非阻塞的方式处理请求。每个worker的线程可以最大限度地发挥CPU的性能。因此,worker的数量与服务器的CPU数量相等是最合适的。思考:(1)发送一个请求,worker会占用多少个连接?(2)有一个master和4个worker,每个worker最大支持的连接数是1024,请问系统最大支持的并发数是多少?作者:臧晓静原文链接:https://juejin.im/post/5e1c263e5188254dc74a3b23