这篇文章给大家聊聊关于深度解析nginx:从基础架构到高性能应用实践,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
[[324261]]
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. 反向代理反向代理是指代理后端的中间服务器服务器响应客户端请求,代理对象就是服务器。
2.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 实战二实现效果:根据浏览器中输入的路径不同而跳转不同端口上的服务。
具体配置: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 实战一实现效果:在浏览器地址栏输入http://192.168.4.32/example/a.html,平均到5000和8080端口,达到负载均衡的效果。
具体配置:上游myserver{server192.167.4.32:5000;server192.168.4.32:8080;}server{listen80;#监听端口server_name192.168.4.32;#监听地址位置/{roothtml;#html目录indexindex.htmlindex.htm;#设置默认页面proxy_passhttp://myserver;#请求被定向到myserver定义的服务器列表}}nginx 分配服务器策略轮询(默认)按照请求的时间顺序一一分配。如果服务器宕机,可以自动消除。
权重权重越高,分配的客户端越多,默认为1。例如:upstream myserver { server 192.167.4.32:5000 Weight=10;服务器192.168.4.32:8080权重=5;复制代码
ip根据请求IP的哈希值分配。每个访问者都有对后端服务器的固定访问权限。例如:上游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 实战一实现效果:3天内,如果通过浏览器地址栏访问http://192.168.4.32/a.jpg,将不会从服务器获取资源。 3天(过期)后,会从服务器重新下载。
具体配置:#添加缓存配置proxy_cache_path/tmp/nginx_proxy_cachelevels=1keys_zone=cache_one:512minactive=60smax_size=1000m;#添加缓存配置位置~\.(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 ires是一个资源集,设置一个过期时间,设置expires参数为使浏览器能够在过期时间之前缓存内容,并减少与服务器的请求和流量。也就是说,不需要去服务器验证,可以直接通过浏览器本身确认是否过期,因此不会产生额外的流量。此方法非常适合不经常更改的资源。
5. 动静分离5.1 实战一实现效果:通过浏览器地址栏访问www.abc.com/a.html,访问静态资源服务器的静态资源内容。通过浏览器地址栏访问www.abc.com/a.jsp,即可访问动态资源服务器的动态资源内容。
具体配置:upperstatic{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 实战一实现效果:准备两台nginx服务器,通过浏览器地址栏访问虚拟IP地址,停止主服务器上的nginx,再次访问虚拟IP地址仍然有效。
具体配置:(1)在两台nginx服务器上安装keepalived。
-keepalived 相当于使用脚本来检测当前服务器是否还活着的路由。如果还活着,则继续访问,否则会切换到另一台备份服务器。
#安装keepaliveduminstallkeepalived-y#检查版本rpm-q-akepalivedkeepalived-1.3.5-16.el7.x86_64 (2)修改主备服务器/etc/keepalived/keepalived.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#在/etc/hosts文件中配置,通过它我们可以访问我们的主机}vrrp_script_ch k_http_端口{ script'/usr/local/src/nginx_check.sh'interval2#检测脚本执行的时间间隔weight2#权重每次增加2}vrrp_instanceVI_1{interfaceens7f0#网卡、stateMASTER需要根据情况修改#更改MASTER to BACKUPvirtual_router_id51#主备机的virtual_router_id必须相同priority100#主备机优先级不同。主机值较大,备份机值较小。 advert_int1#多久(默认1s)发送一次心跳,检测服务器是否还活着authentication{ auth_typePASSauth_pass1111}virtual_ipaddress{192.168.1.100#VRRPH虚拟地址,可以绑定多个}}字段说明
router_id:在/etc/hosts文件中配置,通过它我们可以访问我们的主机。 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 :1 localhost localhost.localdomain localhost6 localhost6.localdomain6 127.0.0.1 LVS_DEVEL 复制代码间隔:设置脚本执行的间隔权重:当脚本执行失败,即keepalived或nginx挂起时,权重增加的值(可以是负值)。界面:输入ifconfig命令查看当前网卡名称。 ens7f0:flags=4163UP、广播、运行、多播mtu1500inet192.168.4.32netmask255.255.252.0broadcast192.168.7.255inet6fe80:e273:9c3c:e675 3 33607c60prefixlen64scopeid0x20link.(3)在/usr/local/src目录下添加检测脚本nginx_check.sh。
#!/bin/bashA=`ps-Cnginx-no-header|wc-l`if[$A-eq0];然后/usr/local/nginx/sbin/nginxsleep2if[ps-Cnginx-no-header|wc- l`-eq0];thenkillallkeepalivedfifi(4) 启动两台服务器的nginx和keepalived。
#启动nginx./nginx#启动keepalivedsystemctlstartkeepalived.service(5)查看虚拟ip地址ip a。停止主服务器192.168.4.32 nginx和keepalived,然后访问虚拟IP检查高可用效果。
6. 原理解析
Nginx启动后,Linux系统中有两个进程,一个是master,一个是worker。 master作为管理员,不参与任何工作,只负责将不同的任务分配给多个worker(一般有多个worker)。
ps-ef|grepnginxroot20473102019?00:00:00nginx:masterprocess/usr/sbin/nginxnginx4628204730Jan06?00:00:00nginx:workerprocessnginx4629204730Jan06?0 0:003336 000nginx:workerprocessworker 是如何工作的?客户端首先通过master发送请求。管理员收到请求后,会将请求通知工作人员。多名工人将争夺它。机制来抢夺任务,拿到任务的worker会通过tomcat、反向代理、访问数据库等转发请求(nginx本身不直接支持java)。
一个 master 和多个 worker 的好处?可以使用nginx -s reload进行热部署。每个worker都是一个独立的进程。如果其中一个worker出现问题,其他worker将独立运行,继续竞争任务并执行客户端的请求流程,而不会造成服务中断。设置多少个 worker 合适?Nginx和redis类似,都采用io复用机制。每个worker都是一个独立的进程。每个进程只有一个主线程。它以异步和非阻塞的方式处理请求。每个工作线程都可以最大限度地发挥CPU的性能。因此,worker的数量等于服务器上CPU的数量是最合适的。
思考:
(1)发送一个请求会占用多少个worker连接?
(2)有师傅1名,工人4名。每个worker支持的最大连接数为1024。系统支持的最大并发数是多少?
作者:臧晓静
原文链接:https://juejin.im/post/5e1c263e5188254dc74a3b23
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7867.html
用户评论
想提升自己对Nginx的理解?这个高级篇肯定能帮到你!
有16位网友表示赞同!
一直想深入了解Nginx是如何工作的,这篇文章感觉很详细。
有10位网友表示赞同!
从原理到实战,这样安排确实能让读者更全面的掌握Nginx。
有7位网友表示赞同!
现在很多网站都在用Nginx,学习它的高级技巧真的很必要。
有19位网友表示赞同!
希望文章能解释清楚一些nginx的一些复杂的概念。
有8位网友表示赞同!
实战讲解最管用!期待看看一些真实的项目案例。
有13位网友表示赞同!
搞懂Nginx原理对于服务器架构规划来说很关键啊。
有6位网友表示赞同!
终于有篇专门讲Nginx高级的教程了,太棒了!
有7位网友表示赞同!
学习Nginx的过程中遇到很多困惑,希望这篇文章能解答我的疑问。
有12位网友表示赞同!
感觉这篇标题很有深度,对Nginx有一定了解的人应该能有所收获。
有18位网友表示赞同!
我对web服务器一直比较感兴趣,这篇Nginx高级篇值得一看。
有8位网友表示赞同!
这个标题给我一种要开阔我眼界的感觉,期待看到更深入的内容。
有8位网友表示赞同!
学习的路上始终需要深入理解核心原理,这篇文章很适合我。
有18位网友表示赞同!
希望文章能够用通俗易懂的语言来讲解Nginx的原理。
有20位网友表示赞同!
了解Nginx的原理可以帮助我更好地配置和使用它。
有11位网友表示赞同!
对于新手来说,这篇Nginx高级篇会不会有点难度?
有17位网友表示赞同!
终于可以摆脱使用Nginx的束缚,深入理解它的运作机制了!
有18位网友表示赞同!
期待作者能分享一些实战经验和技巧,帮助我们更好地应用Nginx。
有8位网友表示赞同!
学习Nginx不仅是提升技术水平,也是为了更好地服务于项目。
有18位网友表示赞同!
好的教程能让别人更加理解Nginx,也让开发者更容易掌握技能。
有6位网友表示赞同!