一、代理服务 比较容易理解吧,简单来说。客户端访问服务器并不是直接访问的,而是通过中间代理服务器,代理服务器再去访问服务器。就像一个中转站一样,无论什么,只要从客户端到服务器,你就要通过我。一)正向代理 正向代理,就是代理服务器为客户端代理,也就是说,服务器并不知道真实的客户端是谁,而是通过代理服务器把请求发送给真实的服务器。比如,通过公司网络访问外网百度,那么公司的代理服务器就会代理你的主机,访问百度网站。百度服务器无法获得你个人的真实主机ip。 就像上图展示的那样。web1、web2就是你在公司内的个人主机ip,然后通过公司的Nginx代理服务器,访问外部网络。 语法:Syntax:proxypassURLDefault:Context:server,location 实践: 删除之前的配置,然后我们加下正向代理的配置:resolver8。8。8。8;谷歌的域名解析地址location{httphost要访问的主机名requesturi请求路径proxypasshttp:} 这样,Nginx的正向代理配置其实就ok了,哦对,别忘了重载Nginx服务器。为了我们可以用本地测试,还需要一些额外的修改。Windows系统,修改下本机的hosts文件,地址在:C:WindowsSystem32driversetc。里面有个hosts,通过编辑器打开,添加如下内容:ip(你服务器的ip)(空格)域名(随便一个域名) 我的添加完了之后是这样的: 然后,你可以正常访问百度,或者其他域名地址,或者也可以通过curl来访问。但是这样我们实际上比较无感,所以我们来看下Nginx日志,日志在varlogNginxaccess。log中。二)反向代理 反向代理,简单来说就是代理服务器代理的是服务器,客户端并不知道真正的服务器是什么。 Nginx配置如下: locationapi{proxypasshttp:localhost:3000;重定向proxysetheaderH向后传递头信息proxysetheaderXRealIP把真实IP传给应用服务器proxyconnecttimeout30;默认超时时间proxysendtimeout60;发送超时proxyreadtimeout60;读取超时在proxybuffering开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxybuffers设置的所有buffer们被写满或者数据被读取完(EOF)proxybuffers4128k;proxybuffers由缓冲区数量和缓冲区大小组成的。总的大小为numbersizeproxybusybufferssize256k;proxybusybufferssize不是独立的空间,他是proxybuffers和proxybuffersize的一部分。Nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxybusybufferssize来控制的,建议为proxybuffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。proxybuffersize32k;用来存储upstream端response的headerproxymaxtempfilesize256k;response的内容很大的话,Nginx会接收并把他们写入到tempfile里去,大小由proxymaxtempfilesize控制。如果busy的buffer传输完了会从tempfile里面接着读数据,直到传输完毕。} 然后需要我们在服务器上安装一下node,简单来说通过下载node官网的linux版node的二进制包,通过ftp传输到服务器。然后解压缩node包,然后配置node环境变量即可。这个就不多说了,大家可以百度一下。 然后我们在服务器新建一个node的http服务,端口号3000、4000、5000,对,创建三个文件。是在服务器上哦,实际上跟在本地没啥区别。 然后我们通过浏览器,你的ipapixxx就可以代理到3000端口的服务了。哦对,别忘了在服务器启动你的node服务。二、负载均衡 我们先来看张图吧: 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。 那么下面,我们来看下,如何通过Nginx服务器,配置集群。首先,我们需要在Nginx服务器,通过不同的端口号,创建几个node服务。node服务的代码类似这样: varhttprequire(http);varserverhttp。createServer(function(request,response){response。end(server3000);});server。listen(3000,function(){console。log(HTTP服务器启动中,端口:3000);}); 然后,Nginx中可以这样配置: http{upstreamzhufeng{server127。0。0。1:3000weight10;server127。0。0。1:4000;server127。0。0。1:5000;}server{location{proxypasshttp:}}} 然后呢,安装一下pm2:yuminstallpm2g 如果太慢的话,可以试试淘宝源。这里就不说怎么配置了哦。然后安装好pm2后,通过pm2启动各个node服务。pm2是一个node应用的进程管理器。 然后,可以通过以下命令来启动和查看node服务进程:启动node服务pm2startxxx。jsnamexxx查看当前服务pm2list 后端服务器调试状态: 状态 描述 down 当前的服务器不参与负载均衡 backup 当其它节点都无法使用时的备份的服务器 maxfails 允许请求失败的次数,到达最大次数就会休眠 failtimeout 经过maxfails失败后,服务暂停的时间,默认10秒 maxconns 限制每个server最大的接收的连接数,性能高的服务器可以连接数多一些 例子:upstreamwebserver{serverlocalhost:3000serverlocalhost:4000serverlocalhost:5000maxfails1failtimeout10s;} 分配方式: 类型 种类 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 weight(加权轮询) 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况 iphash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题 leastconn 哪个机器上连接数少就分发给谁 urlhash(第三方) 按访问的URL地址来分配请求,每个URL都定向到同一个后端服务器上(缓存) fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配 正定义hash hash自定义key 例子: upstreamwebserver{server127。0。0。1:3000;}upstreamwebserver{server127。0。0。1:3000;}upstreamwebserver{server127。0。0。1:3000;}upstreamwebserver{server127。0。0。1:3000;}upstreamwebserver{server127。0。0。1:3000;} 三、其他一)缓存 首先啊,缓存有很多种,比如之前学过的浏览器缓存,还有应用服务器缓存,代理缓存,客户端缓存等等等等。我们可以在Nginx中使用prxoycache来设置代理缓存。http{缓存路径目录层级缓存空间名称和大小失效时间为7天最大容量为10gproxycachepathdataNginxcachelevels1:2keyszonecache:100minactive60mmaxsize10g;} 稍微复杂点的方式如下: if(requesturicache(loginlogout)){setnocache1;}location{proxypasshttp:}locationcache{proxycachevalid20020630430130260m;对哪些状态码缓存,过期时间为60分钟缓存的维度proxysetheaderHosthost:设置头proxysetheaderXRealIP设置头proxysetheaderXForwardedF设置头proxypasshttp:127。0。0。1:6000;} 然后呢,上面的各个字段的含义如下: 键值 含义 proxycache 使用名为cache的对应缓存配置 proxycachevalid20020630430130210d; 对httpcode为200的缓存10天 proxycachekeyuri 定义缓存唯一key,通过唯一key来进行hash存取 proxysetheader 自定义httpheader头,用于发送给后端真实服务器 proxypass 指代理后转发的路径,注意是否需要最后的二)location 它的使用其实就是正则表达式,但是语法规则会有些特性,正则我就不在这里多说,咱们直接看下location的语法:location仅匹配URI,忽略参数前缀字符串常规精确匹配匹配上后则不再进行正则表达式的匹配正则表达式大小写敏感的正则表达式匹配忽略大小写的正则表达式匹配内部调转用于内部跳转的命名locationSyntaxlocation〔〕uri{。。。}locationname{。。。}defaultContextserver,location 匹配的优先级,按照上面的顺序,从上到下,最上面的优先级最高,我们来看个实际的例子: locationT1{return200匹配到第一个正则表达式;}locationT1(w){return200匹配到最长的正则表达式;}locationT1{return200停止后续的正则表达式匹配;}locationT1T2{return200最长的前缀表达式匹配;}locationT1{return200前缀表达式匹配;}locationT1{return200精确匹配;} T1精确匹配T1停止后续的正则表达式匹配T1T2匹配到最长的正则表达式T1T2最长的前缀表达式匹配t1T2匹配到最长的正则表达式三)rewrite 可以实现URI的重写和重定向,它的用处有很多,常用于URL页面的跳转,兼容旧版本,SEO优化(伪静态),维护(后台维护、流量转发),安全(伪静态)等,它的语法是这样的:syntax:rewriteregexreplacement〔flag〕Default:Context:server,location,if如果正则表达式(regex)匹配到了请求的URI(requestURI),这个URI会被后面的replacement替换rewrite的定向会根据他们在配置文件中出现的顺序依次执行通过使用flag可以终止定向后进一步的处理 一个例子:rewriteusers(。)show?user1? flag,标志位是标识规则对应的类型。 flag 含义 last 先匹配自己的location,然后通过rewrite规则新建一个请求再次请求服务端 break 先匹配自己的location,然后生命周期会在当前的location结束,不再进行后续的匹配 redirect 返回302昨时重定向,以后还会请求这个服务器 permanent 返回301永久重定向,以后会直接请求永久重定向后的域名1)last结束当前的请求处理,用替换后的URI重新匹配location可理解为重写(rewrite)后,发起了一个新请求,进入server模块,匹配location如果重新匹配循环的次数超过10次,Nginx会返回500错误返回302http状态码浏览器地址栏显示重定向后的url2)break结束当前的请求处理,使用当前资源,不再执行location里余下的语句返回302http状态码浏览器地址栏显示重定向后的url3)redirect临时跳转,返回302http状态码0浏览器地址栏显示重地向后的url4)permanent永久跳转,返回301http状态码;浏览器地址栏显示重定向后的url 例子如下: locationbreak{}locationlast{}locationtest{return200{code:0,msg:success};}locationredirect{rewriteredirecthttp:www。baidu。}locationpermanent{rewritepermanenthttp:www。baidu。} 可以通过curl来测试一下:curlhttp:115。29。148。6breaktestcurlhttp:115。29。148。6last{code:0,msg:success}curlvLhttp:115。29。148。6redirectcurlvLhttp:115。29。148。6permanent 站在巨人的肩膀上,希望我可以看的更远。 来源:https:www。cnblogs。comzakingp14999350。html