当前位置: 首页 > Linux

【nginx运维基础(五)】Nginx定位攻略

时间:2023-04-07 01:45:25 Linux

Overviewlocation有“位置”的意思,根据Uri进行不同的定位。它在虚拟主机的配置中必不可少。Location可以通过不同的处理方式定位网站的不同部分。伪静态、反向Proxy、负载均衡等都离不开位置。语法location[=|~|~*|^~]patt{}中括号不能写任何参数,这个叫一般匹配,也可以写参数。因此大类型可以分为3种:location=patt{}[exactmatch]locationpatt{}[generalmatch]location~patt{}[regularmatch]匹配指令exactmatch=完全匹配指定的pattern,和这里的模式仅限于简单的字符串,这意味着这里不能使用正则表达式。服务器{server_namewebsite.com;location=/abcd{[…]}}http://website.com/abcd#完全匹配http://website.com/ABCD#如果运行Nginx服务器的系统本身不区分大小写,比如Windows,那么它也匹配http://website.com/abcd?param1#忽略查询字符串参数(querystringarguments),也匹配http://website.com/abcd/#不匹配,因为后面有一个斜杠end,Nginx不认为这是精确匹配http://website.com/abcde#不匹配,因为不是完全匹配一般匹配(None)可以理解为左前缀匹配(如pattern%)。在这种情况下,匹配那些以指定模式开头的URI。注意这里的URI只能是普通字符串,不能使用正则表达式Type.server{server_namewebsite.com;location/abcd{[…]}}http://website.com/abcd#完全匹配http://website.com/ABCD#如果运行Nginx服务器系统本身对大小写不敏感,比如Windows,所以也匹配http://website.com/abcd?param1#Ignorethequerystringarguments(查询字符串参数),这里是/abcdhttp:/之后的?param1/网站。com/abcd/#末尾的反斜杠(trailingslash)也在匹配范围内http://website.com/abcde#仍然匹配,因为URI是以pattern开头的正则匹配~区分大小写(onwindowInvalid),pattern必须是正则表达式server{server_namewebsite.com;location~^/abcd${[…]}}http://website.com/abcd#完全匹配http://website.com/ABCD#不匹配,~区分大小写http://website.com/abcd?param1#忽略querystringarguments(查询字符串参数),这里是?param1after/abcdhttp://website.com/abcd/#不匹配,因为末尾有尾斜杠,所以不匹配正则表达式^/abcd$http://website.com/abcde#不匹配正则表达式^/abcd$正则匹配~*不区分大小写,pattern必须是正则表达式server{server_namewebsite.com;location~*^/abcd${[…]}}http://website.com/abcd#完全匹配http://website.com/ABCD#匹配,这是它不区分大小写的特性http://website.com/abcd?param1#忽略查询字符串参数(querystringarguments),这里是/abcd后面的?param1http://website.com/abcd/#不匹配,因为末尾有一个反斜杠(trailingslash),所以不匹配正则表达式^/abcd$http://website.com/abcde#不匹配正则表达式^/abcd$regularmatch^~匹配情况与一般匹配类似,匹配以指定匹配模式开头的URI!~和!~*是区分大小写和不区分大小写的非匹配正则一般匹配/任何请求都会被匹配。特殊匹配@用来定义一个Location块,这个块不能被外部Client访问,只能通过Nginx内部配置指令访问,比如try_files或者error_page匹配优先http://www.test.com/域名后面(uri:http请求行第二列)开始匹配,即/,匹配原则一般是左前缀匹配,location/{}可以匹配所有HTTP请求,因为任何HTTP请求都必须以'/',但是常规位置和任何其他比'/'长的正常位置(location/{}是最短的正常位置,所以任何其他正常位置都会比它长,当然location=/{}是一样的lengthaslocation^~/{}可以看出,匹配的优先级可以概括为:越详细越优先是不是有点像css选择器?Example1#首先检查是否存在完全匹配,如果是,停止匹配过程location=patt{configA}location/{root/usr/local/nginx/html;indexindex.htmlindex.htm;}如果访问http://test.com/,定位过程是 1:精确匹配"/",得到index页面为index.htm2:访问/index.htm再次,这次内部跳转uri已经是“/index.htm”,根目录是/usr/local/nginx/html3:最后的结果,访问/usr/local/nginx/html/index.htmExample2location/{root/usr/本地/nginx/html;索引index.html索引.htm;}location/foo{root/var/www/html;indexindex.html;}我们访问http://test.com/foo对于uri"/foo",两个位置的patt可以匹配到,即'/'可以从左边前缀开始匹配'/foo',并且'/foo'也可以从左前缀匹配'/foo'。这时候访问/var/www/html/index.html的真正原因:'/foo'匹配的比较长,所以用它;Example3location~image{root/var/www/image;indexindex.html;}如果我们此时访问http://test.com/image/logo.png,"/"和"/image/logo.png"同时匹配,"image"和"image/logo.png”也可以匹配,谁来扮演角色?将使用正则表达式的结果。因为此时的正则表达式比较详细,图片真的会访问/var/www/image/logo.png再次总结一下优先级顺序如下:1.=2.(无)前提是pattern完全匹配URI(不仅仅是URI的头部,这点很重要)3.^~4.~或~*5。(None)patternMatchingtheheadoftheURI好像和location的书写顺序没有关系?但其实还是相关的#配置服务器{listen9090;服务器名称本地主机;位置~\.html${允许所有;}location~^/prefix/.*\.html${全部拒绝;}}#配置第二台服务器{listen9090;服务器名称本地主机;location~^/prefix/.*\.html${全部拒绝;}location~\.html${允许所有;}}URI请求配置1配置2curlhttp://localhost:9090/regextest.html404NotFound404NotFoundcurlhttp://localhost:9090/prefix/regextest.html404NotFound403ForbiddenLocation~^/prefix/.*.html${denyall;}表示常规位置对于以/prefix/开头的,.html所有以.html结尾的URI请求都被拒绝访问;location~.html${allowall;}表示常规位置允许访问以.html结尾的URI请求。其实前缀是~.html$的子集。在“Configuration1”下,两个请求都匹配location~.html${allowall;},并停止后续搜索,所以允许访问,404NotFound;“Configuration2”下,/regextest.html无法匹配前缀,继续搜索~.html$,允许访问,于是404NotFound;然而/prefix/regextest.html匹配前缀,所以拒绝所有,403禁止访问。优先级最终总结1.=2.(无)前提是pattern完全匹配URI(不仅仅是URI的头部,这点很重要)3.^~4.~或~*5。(None)pattern与URI的头部匹配得越详细,优先级越高,但是在优先级相同的情况下,按照书写顺序谁先出现为准(就近原则)还是很像cssselectors的优先级...root&alias文件路径配置http://www.ttlsa.com/nginx/ng...recommendednecessarylocation#直接匹配网站根目录,通过域名访问网站首页比较频繁,用这个会加快处理速度,官网说的。#这里直接转发给后端应用服务器,也可以是静态Home#第一条强制规则location=/{proxy_passhttp://127.0.0.1:88;}#第二个强制规则就是处理静态文件请求,这也是nginx作为http服务器的强项#有两种配置方式,目录匹配或者后缀匹配,选择一个或者使用location~.*\.(gif|jpg|jpeg|png|bmp|swf)${过期30d;}location~.*\.(js|css)?${过期12h;}location~/\.{全部拒绝;#任何其他后缀不允许访问;}#文章这三个规则是将动态请求转发到后端应用服务器位置的通用规则/{try_files$uri@apache;#try_files将尝试您列出的文件并将内部文件设置为指向}location@apache{internal;#internaldirective指定一个只能被“内部”请求调用的位置,外部调用会返回“Notfound”proxy_passhttp://127.0.0.1:88;proxy_connect_timeout300s;proxy_send_timeout900;proxy_read_timeout900;proxy_buffer_size32k;proxy_buffers432k;proxy_busy_buffers_size64k;proxy_redirect关闭;proxy_hide_header变化;proxy_set_header接受编码'';proxy_set_header主机$host;proxy_set_header引用$http_referer;proxy_set_headerCookie$http_cookie;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}