当前位置: 首页 > 后端技术 > Node.js

Nginx正确配置Location

时间:2023-04-03 13:17:17 Node.js

文章最初发表于公众号:程序员周先森本平台不定时更新,喜欢我的文章请关注我的微信公众号。之前讲过Nginx的基本配置。本文主要介绍Nginx中Location命令的作用。本文主要详细介绍Nginx的location配置原则。Location就是根据用户请求的URI进行不同的定位,定位到不同的处理方式。如果匹配成功,则进行相关操作。首先需要介绍一下Nginx的echo模块,它可以配置的Location标签是否正确,是否达到了配置的目的。安装echo模块echo模块可以用来在Nginx中输出一些信息,在调试和排错过程中是一个比较好的工具。安装该模块后,Nginx可以使用echo命令向用户浏览器输出字符,可以用来检查Nginx配置的正确性。下载Nginx-echocd/usr/local/nginx-1.12.2/wgethttps://github.com/openresty/...解压文件tarzxvfv0.60.tar.gz查看安装的模块nginx-V进入NginxConfigurecd/usr/local/nginx-1.12.2/./configure目录下--add-module=/usr/local/nginx-1.12.2/echo-nginx-module-0.61--add-module=/usr/local/nginx-1.12.2/ngx_image_thumb-master编译安装,如果是升级,可以使用makeupgrademake&&makeinstallNginx实际处理请求的模块是ngxhttpcore_module模块,在处理请求的时候,可以通过记录变量访问日志,或者可以使用echo模块的输出。我们可以简单看个例子:输出请求参数请求结果:[root@VM_0_2_centos~]#curlwww.niyueling.cn/index.html?author=niyueling--header"content-type:text/html;"-H"content-length:200"query_string:from=jdilongrequest_method:GETcontent_type:text/html;content_length:200fastcgi_script_name:/index.phprequest_uri:/index.php?from=jdilongdocument_uri:/index.phpdocument_root:/application/nginx1.8.1/html_server:HTTP/1.1https:nginx_version:1.8.1remote_addr:192.168.229.196remote_port:46786server_addr:192.168.229.196server_port:80server_name:www.xyz.comuri:/index.php可以看到我们可以发送一系列请求在我们的请求通过echo模块参数提取打印出来。echo_sleep定时输出位置/echo_with_sleep/{echohello;echo_flush;echo_sleep3;echoworld;}echo_sleep可以设置延时输出,单位是秒。异步访问其他urllocation/{echo_reset_timer;echo_location_async/sub1/;echo_location_async/sub2/;echo"take$echo_timer_elapsedsecfortotal.";}location/sub1/{echo_sleep2;echohello;}location/sub2/{echo_sleep1;echoworld;}echo_location_async可以异步访问其他地址,不影响当前函数的执行。上面的执行结果$echo_timer_elapsed最终输出值为0。使用echo需要注意一点,如果echo后面有配置return或者proxy_pass,echo的输出会被覆盖,即浏览器看不到回声的内容。Location配置Location语法:location[=|~|~*|^~]patt{}Location类型:location=patt{}[精确匹配]locationpatt{}[普通匹配]location~patt{}[正则匹配]括号是修饰符,不能写参数。这是一般比赛。Nginx匹配类型的优先级:Nginx配置虚拟服务器server{listenaddress[:PORT]|PORT;server_nameSERVER_NAME;rootDOCUMENT_ROOT;}可以通过listen监听端口,有多种设置方案:listen192.168.0.100:8000;监听192.168.0.100的8000端口监听192.168.0.100;监听192.168.0.100的80端口listen8000;监听本地8000端口listen*:8000;监听本地8000端口listenlocalhost:8000;监听127.0.0.1的80端口listen[::]:8000;监听本地ipv6端口8000listen[::1];在80端口监听本地ipv6地址,通过server_name设置虚拟服务器名称。简单的说就是我们在浏览器中访问的域名。如果域名需要设置多个,用空格隔开,支持*通配任意长度的任意字符。简单举个例子:server_nameniyueling.cnwww.niyueling.cnLocation配置Location语法规则:location[=|~|~*|^~]patt{}Location命中过程先进行精确匹配,如果命中则立即返回结果结束解析过程;准确匹配未命中判断普通匹配,如果有多次命中,则记录“最长”的命中结果,但解析不会结束;继续判断正则匹配,根据正则匹配设置的规则和正则表达式进行匹配,如果有多个从上到下匹配的正则匹配。一旦匹配成功,立即返回结果并结束解析。匹配方式和优先级顺序:优先级顺序从上到下,优先级逐渐递减。location=/uri  =开头表示完全匹配,只有完全匹配才会生效。location^~/uri  ^~??前缀匹配URL路径,在正则表达式之前。location~pattern ~开头表示区分大小写的正则匹配。location~pattern ~开头表示不区分大小写的正则匹配。location/uri    没有任何修饰符也表示前缀匹配,但是在正则匹配之后。location/     是通用匹配,任何不匹配其他location的请求都会被匹配,相当于switch中的default。简单的例子:server{listen80;服务器名称本地主机;location=/text.htmlroot/var/www/html;索引文本.html;}位置/{根html;索引default.html;}location~image{root/var/www/image;索引index.html;}}第一个位置对应精确匹配,浏览器输入127.0.0.1/text.html定位到服务器/var/www/html/text.html文件。第二个位置对应普通匹配,浏览器输入127.0.0.1定位服务器/usr/local/nginx/html/default.html文件。第三个位置对应正则匹配,浏览器输入127.0.0.1/image定位服务器上的文件/var/www/html/text.html。注意:在进行前缀匹配时,会先找到最长的前缀匹配,然后再检查前缀匹配前是否有^~修饰符。如果没有^~修饰符,则搜索正则匹配,找到匹配正则匹配的位置然后执行。如果最长前缀匹配有^~修饰符,则命中该位置,其他正则匹配位置不匹配;例子如下:请求http://localhost/static/files...命中ruleC,如果ruleB有^~修饰符,则命中ruleB:location^~/static/{echo"ruleA";}location/static/files{echo"ruleB";}location~.(gif|jpg|png|js|css)${echo"ruleC}欢迎关注我的个人公众号:程序员周先森。baidu.com/resource/2124c628a84324e86d61801569050122.png)