nginx 判断手机端跳转_nginx基本功能和工作原理

b8209fa917e19e3c59a8d841cb9db5a3.png

nginx能做什么
反向代理正向代理负载均衡HTTP服务器(包含动静分离)反向代理和正向代理1.正向代理
简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。
结论就是,正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。2.反向代理
例如我要访问 localhost:8080/views/test1 这个页面,但view对应的服务器上并没有test1这个资源,它是从另一台服务器上调用的资源。这样view对应的那个服务器就使用了反向代理。即用户只需要把请求发给特定的反向代理服务器,具体请求是谁处理的用户不需要知道(其实也不知道),由代理服务器统一处理。
结论就是反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。总结

  • 正向代理:针对客户端而言, 代理服务器代理客户端,转发请求,并将获得的内容返回给客户端。
  • 反向代理:针对客户端而言, 代理服务器就像是原始服务器,代理集群的web节点服务器返回结果。

负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。1.RR
按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。2.权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream test{ server localhost:8080 weight=9; server localhost:8081 weight=1; }
此时8080和8081分别占90%和10%。3.ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test { ip_hash; erver localhost:8080; server localhost:8081; }4.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend { fair; server localhost:8080; server localhost:8081; }5.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081; }HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。nginx进程模型
在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。
Nginx在启动后,会有一个master进程和多个worker进程。

c87aab0cf115334dc4de1309fcf33929.png

master进程
主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?
首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。
当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。
如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。worker进程
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。多进程IO模型好处
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。nginx多进程事件模型:异步非阻塞
虽然nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。
一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。
而apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个进程在一个时刻只处理一个请求,因此,当并发数上到几千时,就同时有几千的进程在处理请求了。这对操作系统来说,是个不小的挑战,进程带来的内存占用非常大,进程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。
为什么nginx可以采用异步非阻塞的方式来处理呢,或者异步非阻塞到底是怎么回事呢?
我们先回到原点,看看一个请求的完整过程:首先,请求过来,要建立连接,然后再接收数据,接收数据后,再发送数据。
具体到系统底层,就是读写事件,而当读写事件没有准备好时,必然不可操作,如果不用非阻塞的方式来调用,那就得阻塞调用了,事件没有准备好,那就只能等了,等事件准备好了,你再继续吧。阻塞调用会进入内核等待,cpu就会让出去给别人用了,对单线程的worker来说,显然不合适,当网络事件越多时,大家都在等待呢,cpu空闲下来没人用,cpu利用率自然上不去了,更别谈高并发了。
好吧,你说加进程数,这跟apache的线程模型有什么区别,注意,别增加无谓的上下文切换。所以,在nginx里面,最忌讳阻塞的系统调用了。不要阻塞,那就非阻塞喽。非阻塞就是,事件没有准备好,马上返回EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。
好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。


免费赠送Java学习资料,需要的私信我

5920b7805f0f78cbe419b810a09b21b7.png
原文:nginx基本功能和工作原理
来源:微信公众号
作者:动力节点Java资源库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js教程-express框架

概述 Express是基于Node.js平台(建立在Node.js内置的http模块上),快速、开放、极简的Web开发框架。 中文官网 http://www.expressjs.com.cn/。 Github地址:https://github.com/orgs/expressjs。 Express核心特性: 可设置中间件来响应 HTTP…

python猜数字游戏续_python3实现猜数字游戏

本文实例为大家分享了python3实现猜数字游戏的具体代码,供大家参考,具体内容如下 需求目标: 需求:猜数字游戏 1: 开始游戏产生一个1~100随机数 2: 用户输入,游戏根据输入值提示大或者小 3: 用户根据提示继续输入,知道猜…

HTML的script标签

在 HTML 页面中插入一段 JavaScript: 这句话可能大家一开始根本不了解JavaScript,是什么? 在我的了解中JavaScript并不是用java语言开发的,人家用的是c语言和另外一种语言的结合体,就像印度和印度尼西亚根本不是同一…

tesseract4.0.0 中文语言包_一份TensorFlow2.0中文教程

近两个月,网上已经出现了大量 TensorFlow 2 0 英文教程。在此文章中,本文为大家推荐一个持续更新的中文教程,以便大家学习。来源:机器之心今年 3 月份,谷歌在 Tensorflow Developer Summit 2019 大会上发布 TensorFlow…

HTML的块级元素和行级元素的标签列表

行内元素列表: <a>标签可定义锚点 <abbr>表示一个缩写形式 <acronym>定义只取首字母缩写 <b>字体加粗 <bdo>可覆盖默认的文本方向 <big>大号字体加粗 <br>换行符号 <cite>引用进行定义 <code>定义计算机代码文…

mysql select count 5万条数据很慢_mysql亿级数据数据库优化方案测试银行交易流水记录的查询...

点击上方△蓝字关注我们带你征服编程和泡妞两座大山对MySQL的性能和亿级数据的处理方法思考&#xff0c;以及分库分表到底该如何做&#xff0c;在什么场景比较合适&#xff1f;比如银行交易流水记录的查询限盐少许&#xff0c;上实际实验过程&#xff0c;以下是在实验的过程中做…

jvm垃圾回收机制_干货|JVM垃圾回收机制

前言不同于C程序员必须自己完成内存的分配、使用和释放&#xff0c;JAVA语言提供了垃圾回收机制(GC&#xff0c;Garbage Collection)&#xff0c;所以JAVA程序员仅需要负责分配和使用内存即可&#xff0c;而释放内存则由GC负责。这样程序员就从讨厌的内存管理的工作中脱身了。本…

HTML的列表说明

<ul></ul>无序列表&#xff08;Unordered List&#xff09; <ol></ol>有序列表 (Ordered List) <li> 标签定义列表项目。 <li> 标签可用在有序列表 (<ol>) 和无序列表 (<ul>) 中 两个常用的CSS列表属性 CSS3帮助文档 li…

计算机考试网络应用题一定要做到ie浏览器,网络远程教育统考单项练习:计算机应用基础之Internet应用部分(二)...

计算机考试的分数提高离不开日常的练习&#xff0c;下面&#xff0c;就做几道Internet应用部分的题目练习和巩固一下吧&#xff01;1、在IE9浏览器中按地址栏后的“停止”按钮&#xff0c;浏览器将会______。A.中断正在浏览的web页的连接B.关闭该web页的页面C.关闭浏览器窗口D.…

javascript实现图片轮播_第2章 第9节 JavaScript(四)

● 知道哪些ES6&#xff0c;ES7的语法参考回答&#xff1a;promise&#xff0c;await/async&#xff0c;let、const、块级作用域、箭头函数● promise和await/async的关系参考回答&#xff1a;都是异步编程的解决方案● 问了一段js代码&#xff0c;输出结果是什么● js的数据类…

HTML的HTTP 中 GET 与 POST 的区别

99% 的人都理解错了 HTTP 中 GET 与 POST 的区别&#xff08;转&#xff09;转自&#xff1a;WebTechGarden 微信公众号GET 和 POST 是 HTTP 请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过 WEB 开发的人都能说出一二。最直观的区别就是 GET 把参数包含在 UR…

利用计算机可产生随机数,一种利用计算机生成随机数的方法

一种利用计算机生成随机数的方法(2012-07-16 23:22:33)标签&#xff1a;随机数函数数值计数器程序运行杂谈这里介绍一种利用计算机生成随机数的方法&#xff0c;微机都有系统计数器记录自运行开始以来的脉冲数&#xff0c;这是个规律变化的数字&#xff0c;只用它是不能产生随机…

每天最重要的2小时

每天最重要的2小时 各位优秀的同学们&#xff0c;大家早上好&#xff01; 真的特别开心&#xff0c;我们还能继续相约YY空中平台一起学习。一个人走得快&#xff0c;一群人才能走得远。 我是来自一组的金鱼&#xff0c;就是那位拥有“七世记忆”的金鱼&#xff0c;原产地美…

html360度视角观赏,360度全景图是如何生成的?

360度全景图是如何生成的?360度全景图以其生动的交互和沉浸的体验&#xff0c;一直深受很多摄影爱好者的喜欢。不过对于普通的观赏者而言&#xff0c;这种可以360度自由观看的图片&#xff0c;还是具有神奇的魅力。今天&#xff0c;我就讲一讲一张360度全景图是如何生成的吧!普…

未结束的字符文字_PAT B1042:字符统计

题目描述&#xff1a;请编写程序&#xff0c;找出一段给定文字中出现最频繁的那个英文字母。输入格式&#xff1a;输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成&#xff0c;至少包含 1 个英文字母&#xff0c;以回车结束&#…

圣诞表白html,圣诞节表白,最浪漫的表白方式

圣诞节是一个浪漫的节日&#xff0c;红色的圣诞&#xff0c;白色的你们&#xff0c;再适合表白不过了。那么&#xff0c;圣诞节表白&#xff0c;最浪漫的表白方式有哪些呢?和小编一起来看看吧!圣诞节表白1.看着梦幻的圣诞彩灯说“我能喜欢你吗”冬夜绚丽彩灯下的告白&#xff…

怎么发朋友圈才是合适和得体的?

怎么发朋友圈才是合适和得体的&#xff1f; 怎么发朋友圈才是合适和得体的&#xff1f;这个问题估计困扰了不少人。其实你转换一下想法&#xff0c;你作为别人朋友圈的读者&#xff0c;希望看到的是什么内容&#xff1f; 1.这人最近在忙什么&#xff1f; 有没有可能合作。 …

python 3d绘图库_python – 用于科学3d绘图的Mayavi的替代品

在没有令人满意的第一个答案和无法解释的downvote之后编辑&#xff1a; 我需要绘制一个在3D网格中构造的标量字段,如下所示&#xff1a; import numpy as np from mayavi import mlab dt 10 X,Y,Z np.mgrid[0:dt,0:dt,0:dt] F X**2Y**2Z**2 test mlab.figure(size (1024,7…

python数字转字符串_python如何将字符转换为数字

int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符…

计算机网络中缓存技术,编程达人

计算机缓存也就是通常说的Cache&#xff0c;对计算机编程有所了解的应该都知道&#xff0c;缓存常与Redis联系在一起&#xff0c;但是Redis仅仅是应用中的一部分。1、浏览器缓存浏览器面对的问题是网络访问的速度远远低于本地访问的速度&#xff0c;每次都访问造成网络开销太大…