nginx在应用中的作用解决跨域请求过滤配置gzip负载均衡静态资源服务器nginx是一个高性能的HTTP和反向代理服务器,也是一个通用的TCP/UDP代理服务器,最初由俄罗斯人IgorSysoev编写。Nginx现在几乎是很多大型网站的必备技术。大多数情况下,我们不需要自己去配置它,但是了解它在应用中的作用以及如何解决这些问题是非常有必要的。下面我将从nginx在企业中的实际应用来阐述nginx在应用中的作用。为了便于理解,我们先了解一些基础知识。nginx是一个高性能的反向代理服务器。那么什么是反向代理呢?正向代理和反向代理代理是服务器和客户端之间的假设服务器层。代理会收到客户端的请求并转发给服务器,然后将服务器的响应转发给客户端。不管是正向代理还是反向代理,都实现了以上功能。正向代理正向代理是指客户端和原始服务器(originserver)之间的服务器。为了从原始服务器获取内容,客户端向代理发送请求并指定目标(源服务器),然后代理发送源服务器转发请求并将获取的内容返回给客户端。正向代理是给我们的,也就是给客户端的。客户端可以根据正向代理访问自己无法访问的服务器资源。正向代理对我们是透明的,对服务器是不透明的,即服务器不知道自己收到的访问是来自代理还是真实客户端。反向代理(ReverseProxy)方法是指使用代理服务器接受Internet上的连接请求,然后将请求转发给内网的服务器,并将从服务器得到的结果返回给请求连接的请求互联网。客户端,此时代理服务器对外充当反向代理服务器。反向代理服务于服务器。反向代理可以帮助服务端接收客户端的请求,帮助服务端转发请求,负载均衡等。反向代理对服务端是透明的,对我们是不透明的,即我们不知道自己访问的是一个代理服务器,但是服务器知道反向代理在为他服务。BasicConfiguration配置结构下面是一个nginx配置文件的基本结构:events{}http{server{locationpath{...}locationpath{...}}server{...}}main:nginx的全局配置,为全局生效。事件:影响nginx服务器或用户网络连接的配置。http:可以嵌套多个服务器,配置代理、缓存、日志定义、第三方模块配置等大部分功能。server:配置虚拟主机的相关参数。一个http中可以有多个服务器。location:配置请求的路由和各种页面的处理。upstream:配置后端服务器的具体地址,负载均衡配置中必不可少的部分。内置变量以下是nginx一些配置中常用的内置全局变量,你可以在配置的任何地方使用。|变量名|功能||-----|-----||$host|请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名||$request_method|客户客户端请求类型,如GET、POST|$remote_addr|客户端IP地址||$args|请求中的参数||$content_length|请求头中的Content-length字段||$http_user_agent|客户端代理信息||$http_cookie|客户端cookie信息||$remote_addr|客户端IP地址||$remote_port|客户端端口||$server_protocol|请求使用的协议,如HTTP/1.0、HTTP/1.1`||$server_addr|服务器地址||$server_name|服务器名称||$server_port|服务器端口号|解决跨域,先追本溯源,跨域是怎么回事。跨域定义的同源策略限制了从同一源加载的文档或脚本如何与来自另一个源的资源进行交互。这是隔离潜在恶意文件的重要安全机制。不同源之间的读操作一般是不允许的。同源定义如果两个页面的协议、端口(如果指定)和域名相同,则两个页面具有相同的来源。nginx解决跨域的原理例如:前端服务器的域名是:fe.server.com后端服务的域名是:dev.server.com现在如果我发起一个请求fe.server.com到dev.server.com,肯定会出现跨域。现在我们只需要启动一个nginx服务器,设置server_name为fe.server.com,然后设置相应的location拦截前端的跨域请求,再将请求代理回dev.server.com即可。比如如下配置:server{listen80;server_namefe.server.com;location/{proxy_passdev.server.com;}}这样可以巧妙的绕过浏览器的同源策略:fe.server.com访问nginx的fe.server。com属于同源访问,nginx转发给服务器的请求不会触发浏览器的同源策略。请求过滤是根据状态码来过滤error_page500501502503504506/50x.html;location=/50x.html{#将下面的路径适配为存放html的路径。root/root/static/html;}根据URL名称过滤,精确匹配URL,将所有不匹配的URL重定向到首页。location/{rewrite^.*$/index.htmlredirect;}基于请求类型的过滤器。if($request_method!~^(GET|POST|HEAD)$){return403;}配置gzipGZIP是指定的三种标准HTTP压缩格式之一。目前绝大多数网站都在使用GZIP传输HTML、CSS、JavaScript等资源文件。对于文本文件,GZip的效果非常明显。开启后,传输所需的流量会减少到原来的1/4~1/3左右。并非每个浏览器都支持gzip。如何知道客户端是否支持gzip?请求标头中的Accept-Encoding标识对压缩的支持。启用gzip需要客户端和服务端都支持。如果客户端支持gzip解析,那么只要服务端能返回gzip文件,就可以启用gzip。我们可以通过nginx配置让服务器支持gzip。下面响应中的content-encoding:gzip表示服务器上启用了gzip压缩方法。gzipon;gzip_http_version1.1;gzip_comp_level5;gzip_min_length1000;gzip_typestext/csvtext/xmltext/csstext/plaintext/javascriptapplication/javascriptapplication/x-javascriptapplication/jsonapplication/xml;gzip启用或禁用gzip模块默认值为off可以配置为on/offgzip_http_version启用GZ要求HTTP低版本默认值为HTTP/1.1为什么默认版本不是1.0?HTTP运行在TCP连接之上,自然具有与TCP相同的三向握手和慢启动特性。启用持久连接后,在服务器发送响应后保持TCP连接打开。同一客户端/服务器对之间的后续请求和响应可以通过此连接发送。为了尽可能提高HTTP性能,使用持久连接尤为重要。HTTP/1.1默认支持TCP持久连接,HTTP/1.0也可以通过显式指定Connection:keep-alive来开启持久连接。对于TCP长连接上的HTTP报文,客户端需要一种机制来准确判断结束位置,但是在HTTP/1.0中,这种机制只有Content-Length。HTTP/1.1对应的新的transfer-encoding:chunked传输机制可以解决这类问题。Nginx还有配置chunked的属性chunked_transfer_encoding,默认开启。当启用GZip时,Nginx不会等到文件GZip完成后才返回响应,而是边压缩边响应,可以显着提高TTFB(TimeToFirstByte,首字节时间,WEB性能优化的重要指标).唯一的问题是当Nginx开始返回响应时,它无法知道要传输的文件有多大,即它无法给出Content-Length响应头。因此,如果在HTTP1.0中使用Nginx开启GZip,则无法获取Content-Length,这就导致在HTTP1.0中只能在开启持久链接和使用GZip之间做出选择,所以这里gzip_http_version默认设置为1.1。gzip_comp_level压缩级别,级别越高,压缩率越大,当然压缩时间也越长(传输速度越快但CPU消耗越多)。默认值为1,压缩级别为1-9gzip_min_length。设置允许压缩的最小字节数。Content-Length小于此值的请求不会被压缩。默认值:0。当设置值较小时,压缩后的长度可能会比原始文件大。建议设置gzip_types为1000以上gzip压缩的文件类型(MIME类型)默认值:text/html(js/css默认不压缩)负载均衡什么是负载均衡?服务窗口中,需要服务的用户较多。我们需要一种工具或策略来帮助我们将这么多用户分配到每个窗口,以实现资源的充分利用和更少的排队时间。把前台的服务窗口想象成我们的后台服务器,终端后面的人就是无数个发出请求的客户端。负载均衡就是帮助我们将众多的客户端请求合理分配到每台服务器上,从而达到充分利用服务器资源,减少请求时间的目的。nginx如何实现负载均衡upstream指定后端服务器地址列表upstreambalanceServer{server10.1.22.33:12345;server10.1.22.34:12345;server10.1.22.35:12345;}拦截服务器中的响应请求并转发请求转到在上游中配置的服务器列表。server{server_namefe.server.com;listen80;location/api{proxy_passhttp://balanceServer;}}上面的配置只指定了nginx需要转发的服务器列表,并没有指定分配策略。Nginx实现负载均衡策略轮询策略。默认情况下,所有客户端请求都被轮询并分配给服务器。这种策略可以正常工作,但是如果其中一台服务器压力过大,出现延迟,就会影响分配给这台服务器的所有用户。upstreambalanceServer{server10.1.22.33:12345;server10.1.22.34:12345;server10.1.22.35:12345;}最小连接数策略将请求优先分配给压力较小的服务器,可以平衡各个队列的长度,并避免向压力很大的服务器添加更多请求。upstreambalanceServer{least_conn;server10.1.22.33:12345;server10.1.22.34:12345;server10.1.22.35:12345;}最快响应时间策略依赖NGINXPlus,优先响应时间最短的服务器.upstreambalanceServer{fair;server10.1.22.33:12345;server10.1.22.34:12345;server10.1.22.35:12345;}来自同一个ip的客户端ip绑定请求永远只分配一台服务器,有效解决了问题动态网页中的会话共享。upstreambalanceServer{ip_hash;server10.1.22.33:12345;server10.1.22.34:12345;server10.1.22.35:12345;}静态资源服务器位置~*\.(png|gif|jpg|jpeg)${root/root/static/;autoindexon;access_logoff;expires10h;#设置过期时间为10小时}匹配以png|gif|jpg|jpeg结尾的请求,将请求转发到本地路径,root中指定的路径为nginx本地路径。同时也可以进行一些缓存设置。总结nginx很强大,还有很多值得探索的地方。以上部分配置为公司实际配置的应用(简化)。如果您有任何意见或建议,请在下方留言...
