作者:Raye链接:www.jianshu.com/p/8bf73d1a758c本文只关注Nginx在不加载第三方模块的情况下可以处理的内容。由于第三方模块太多,介绍不完。当然,本文本身还有介绍可能不完整。毕竟我只是亲身使用和了解过。欢迎留言交流。Nginx能做什么?反向代理负载均衡HTTP服务器(动静分离)正向代理以上就是我所知道的Nginx在不依赖第三方模块的情况下可以搞定的。下面详细介绍每个功能的实现方法。反向代理反向代理应该是Nginx做的最多的事情之一。什么是反向代理?连接请求被转发到内部网络的服务器,服务器得到的结果返回给互联网上请求连接的客户端。此时代理服务器对外充当反向代理服务器。简单来说,真实服务器不能被外网直接访问,所以需要一个代理服务器,代理服务器可以在和真实服务器处于同一个网络环境的情况下被外网访问。当然也有可能是同一个服务器,端口不同而已。贴一个简单的反向代理代码服务器{listen80;服务器名称本地主机;client_max_body_size1024M;location/{proxy_passhttp://localhost:8080;proxy_set_headerHost$host:$server_port;}}保存配置文件并启动Nginx,这样我们访问localhost就相当于访问localhost:8080。负载均衡负载均衡也是Nginx的一个常用功能。负载均衡是指分配给多个运行单元执行,如Web服务器、FTP服务器、企业关键应用服务器和其他关键任务服务器等,共同完成工作任务。简单来说就是当有两台或两台以上服务器时,将请求按照规则随机分发到指定的服务器上进行处理。一般负载均衡配置需要同时配置反向代理,通过反向代理跳转到负载均衡。Nginx目前支持3种负载均衡策略和2种常用的第三方策略。1.RR(默认)每个请求按照时间顺序一一分配给不同的后端服务器。如果后台服务器宕机,可以自动清除。简单配置上游测试{serverlocalhost:8080;serverlocalhost:8081;}server{listen81;服务器名称本地主机;client_max_body_size1024M;location/{proxy_passhttp://test;proxy_set_headerHost$host:$server_port;}}负载均衡核心代码是upstreamtest{serverlocalhost:8080;serverlocalhost:8081;}这里我配置了2台服务器,当然其实是一个,只是端口不一样,8081服务器不存在,也就是说访问不了,但是我们访问http://localhost的时候就没有问题了,会跳转默认为http://localhost:8080。具体原因是Nginx会自动判断服务器的状态。如果服务器无法访问(服务器宕机),则不会跳转到该服务器,这样也避免了某台服务器宕机影响使用的情况。由于Nginx默认是RR策略,我们不需要其他更多的设置。2.权重指定轮询概率,权重与访问比例成正比,用于后端服务器性能参差不齐的情况。例如,上游测试{serverlocalhost:8080weight=9;serverlocalhost:8081weight=1;}那么在10次中,只有1次访问8081,9次访问80803和ip_hash。有一个问题,就是下一个请求来的时候,这个请求可能会分发到另外一个服务器上。当我们的程序不是无状态的(使用session保存数据)的时候,这时候就出现了很大的问题。比如你把登录信息保存在session中,跳转到另一台服务器时需要重新登录,所以很多时候我们需要一个客户端只能访问一台服务器,这时就需要用到iphash,而每次请求的iphash是按访问ip的hash结果分布,让每个访问者固定访问一个后端服务器,可以解决session问题。上游测试{ip_hash;服务器本地主机:8080;服务器本地主机:8081;}4.公平(第三方)请求按照后端服务器的响应时间进行分配,响应时间短的优先分配。上游后端{公平;服务器本地主机:8080;服务器本地主机:8081;}5.url_hash(第三方)根据访问的url的hash结果分配请求,让每个url都指向同一个后端服务器,后端服务器是一个更有效的缓存。upstream添加hash语句,server语句中不能写权重等参数,hash_method是upstream后端使用的hash算法{hash$request_uri;hash_methodcrc32;服务器本地主机:8080;服务器本地主机:8081;}以上5种负载均衡适用于不同的情况,可以根据实际情况选择使用哪种策略模式,但是fair和url_hash需要安装第三方模块才能使用。由于本文主要介绍Nginx可以做什么,所以在Nginx中安装第三方模块就不会了那么本文介绍HTTP服务器Nginx本身也是一个静态资源服务器。当只有静态资源时,可以使用Nginx作为服务端。同时,静态和动作分离也很流行,可以通过Nginx来实现。首先,让我们把Nginx看成一个静态服务器。资源服务器server{listen80;服务器名称本地主机;client_max_body_size1024M;位置/{roote:wwwroot;索引index.html;这样,如果访问http://localhost,会默认到E盘wwwroot目录下的index.html,如果一个网站只是一个静态页面,那么可以通过这种方式部署。动静分离动静分离就是让动态网站中的动态网页按照一定的规则把不变的资源和经常变化的资源区分开来。动静态资源拆分后,我们可以根据静态资源的特点进行缓存操作,这就是网站静态处理上游测试的核心思想{serverlocalhost:8080;服务器本地主机:8081;}服务器{听80;服务器名称本地主机;位置/{roote:wwwroot;索引index.html;}#allstatic所有请求都由nginx处理,存放目录为html`位置~.(gif|jpg|jpeg|png|bmp|swf|css|js)${roote:wwwroot;}#所有动态请求都转发给tomcat处理location~.(jsp|do)${proxy_passhttp://test;}error_page500502503504/50x.html;location=/50x.html{roote:wwwroot;这样我们就可以把html、图片和css和js放在wwwroot目录下,tomcat只负责处理jsp和请求。比如当我们的后缀为gif时,Nginx会默认从wwwroot获取当前请求的动态图片文件并返回。当然这里的静态文件和Nginx一样是在一台服务器上,我们也可以在另一台服务器上,然后通过反向代理和负载均衡进行配置。只要把最基本的流程想通,很多配置都非常简单。另外,localtion后面其实是跟了一个正则表达式的Forwardproxy,所以非常灵活。正向代理是指客户端和原始服务器(originserver)之间的服务器。客户端为了从原始服务器获取内容,向代理发送请求并指定目标(源服务器),代理将请求转发给源服务器,并将获取的内容返回给客户端。客户端可以使用正向代理。当你需要使用你的服务器作为代理服务器时,你可以使用Nginx来实现正向代理,但是Nginx目前有个问题,就是不支持HTTPS。虽然一直去百度配置HTTPS的正向代理,但是最后发现代理还是不能用。当然也有可能是我的配置不对,希望知道正确方法的同志们留言说明。解析器114.114.114.1148.8.8.8;服务器{resolver_timeout5s;听81;access_loge:wwwrootproxy.access.log;error_loge:wwwrootproxy.error.log;location/{proxy_passhttp://$host$request_uri;resolver是配置正向代理的DNS服务器,listen是正向代理的端口。配置完成后,就可以使用服务器ip+端口号在IE或者其他代理插件上进行代理了。如有错误或其他问题,欢迎留言指正。如果有帮助,请点赞+转发分享。欢迎大家关注米公公的公众号:米公公的技术之路
