Nginx正确配置Location
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
之前已经讲过Nginx的基本配置,本篇文章主要对Nginx中Location指令的作用进行介绍。本篇文章主要对Nginx的Location配置原则进行详细的讲述。Location是根据用户请求的URI来进行不同的定位,定位到不同的处理方式上,匹配成功即进行相关的操作。首先需要先介绍一下Nginx的echo模块,它可以配置的Location标签是否正确,是否达到配置的目的。
安装echo模块
echo模块可以在Nginx中用来输出一些信息,是在调试排错过程中一个比较好的工具。安装此模块后可以在Nginx用echo命令输出字符到用户的浏览器中,可用于检测Nginx的配置的正确性。
下载Nginx-echo
cd /usr/local/nginx-1.12.2/
wget https://github.com/openresty/echo-nginx-module/archive/v0.60.tar.gz
解压文件
tar zxvf v0.60.tar.gz
查看已安装的模块
nginx -V
进入Nginx目录下配置
cd /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
编译安装,如果是升级可以使用make upgrade
make && make install
Nginx实际处理请求的模块是ngxhttpcore_module模块, 在处理请求时,变量可以通过访问日志记录下来,也可以用于echo 模块进行输出。我们可以简单看个例子:
输出请求参数
请求结果:
[root@VM_0_2_centos ~]# curl www.niyueling.cn/index.html?author=niyueling --header "content-type:text/html;" -H "content-length:200"
query_string: from=jdilong
request_method: GET
content_type: text/html;
content_length: 200
fastcgi_script_name: /index.php
request_uri: /index.php?from=jdilong
document_uri: /index.php
document_root: /application/nginx1.8.1/html
server_protocol: HTTP/1.1
https:
nginx_version: 1.8.1
remote_addr: 192.168.229.196
remote_port: 46786
server_addr: 192.168.229.196
server_port: 80
server_name: www.xyz.com
uri: /index.php
可以看到我们可以通过echo模块将我们请求中的一系列参数提取打印出来。
echo_sleep定时输出
location /echo_with_sleep/ {
echo hello;
echo_flush;
echo_sleep 3;
echo world;
}
可以通过echo_sleep设置延迟输出,单位为秒。
异步访问其他url
location / {
echo_reset_timer;
echo_location_async /sub1/;
echo_location_async /sub2/;
echo "took $echo_timer_elapsed sec for total.";
}
location /sub1/ {
echo_sleep 2;
echo hello;
}
location /sub2/ {
echo_sleep 1;
echo world;
}
echo_location_async可以异步访问其他地址,不影响当前函数执行。上述执行结果$echo_timer_elapsed最终输出值为0。
使用echo有一点需要注意的是,如果echo后边有配置return 或者配置 proxy_pass,则echo的输出会被覆盖,即浏览器无法看到echo的内容。
Location配置
Location的语法:
location [=||*|^~] patt { }
Location类型:
location = patt {} [精准匹配]
location patt {} [普通匹配]
location ~ patt {} [正则匹配]
中括号中为修饰符,可以不写任何参数。此时为一般匹配。
Nginx匹配类型的优先级:
Nginx配置虚拟服务器
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root DOCUMENT_ROOT;
}
通过listen可以对端口进行监听,有多种设置方案:
listen 192.168.0.100:8000; 监听192.168.0.100的8000端口
listen 192.168.0.100; 监听192.168.0.100的80端口
listen 8000; 监听本地8000端口
listen *:8000; 监听本地8000端口
listen localhost:8000; 监听127.0.0.1的80端口
listen [::]:8000; 监听本地的ipv6的8000端口
listen [::1]; 监听本地的ipv6地址的80端口
通过server_name设置虚拟服务器名称,简单一点来说就是我们在浏览器中访问的域名,如果域名需要设置多个则通过空格隔开,支持*通配任意长度的任意字符。简单举个例子:
server_name niyueling.cn www.niyueling.cn
Location配置
Location语法规则:
location [=||*|^~] patt { }
Location命中过程
- 先进行精准匹配,如果命中立即返回结果并结束解析的过程;
- 精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;
- 继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.
匹配模式及优先级顺序:
优先级排序自顶向下,优先级逐步降低。
- location = /uri =开头表示精确匹配,只有完全匹配上才能生效。
- location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
- location ~ pattern ~开头表示区分大小写的正则匹配。
- location ~* pattern ~*开头表示不区分大小写的正则匹配。
- location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
- location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
简单举个例子:
server {
listen 80;
server_name localhost;
location =/text.html
root /var/www/html;
index text.html;
}
location / {
root html;
index default.html;
}
location ~ image {
root /var/www/image;
index index.html;
}
}
第一个location对应精准匹配,浏览器输入127.0.0.1/text.html,定位到服务器/var/www/html/text.html文件。第二个location对应普通匹配,浏览器输入127.0.0.1,定位到服务器/usr/local/nginx/html/default.html文件。第三个location对应正则匹配,浏览器输入127.0.0.1/image,定位到服务器/var/www/html/text.html文件。
注意:
进行前缀匹配时,会先一直找到最长的前缀匹配,然后看该前缀匹配有没有前置的^~ 修饰符,如果没有^~ 修饰符就接着去查找正则匹配,查找到匹配正则匹配后执行该location。如果最长前缀匹配有^~修饰符则命中该location,不回去匹配其他的正则匹配location;例子如下:
请求 http://localhost/static/files/test.jpg 命中规则C,如果规则B有 ^~修饰符,则会命中规则B:
location ^~ /static/ {
echo "规则A";
}location /static/files {
echo "规则B";
}location ~ .(gif|jpg|png|js|css)$ {
echo "规则C
}
欢迎关注我的个人公众号:程序猿周先森。
Nginx正确配置Location的更多相关文章
- Nginx 核心配置-location的登录账户认证实战篇
Nginx 核心配置-location的登录账户认证实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用ab命令模拟网站攻击 1>.安装httpd-tools工具 ...
- Nginx 核心配置-location的匹配案例实战篇
Nginx 核心配置-location的匹配案例实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.location语法规则介绍 在没有使用正则表达式的时候,nginx会先在 ...
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- kohana nginx的配置
kohana nginx的配置 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php? kohana_uri=/$1 ...
- rewrite规则写法及nginx配置location总结
rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用. 例如http://seanlook.com/a/we/index.php ...
- Nginx教程(四) Location配置与ReWrite语法
Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } ...
- Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- Nginx 配置 Location 规则优先级问题
nginx 的 location与配置中 location 顺序没有关系,与 location 表达式的类型有关.相同类型的表达式,字符串长的会优先匹配. 以下是按优先级排列说明: 等号类型(=)的优 ...
随机推荐
- JS实现循环删除数组中元素的方法介绍
这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 本文主要跟大家分享了 ...
- python历史背诵
一.python简介 python2:源代码不统一 有重复功能的代码 默认编码是ascii 没有中文 输出中文需要用头文件 #-*-coding=utf-8-*- 进行转换 py3:源代码统一 没有重 ...
- sparksession创建DataFrame方式
spark创建dataFrame方式有很多种,官方API也比较多 公司业务上的个别场景使用了下面两种方式 1.通过List创建dataFrame /** * Applies a schema to a ...
- 实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署
最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7 ...
- unity之shader
渲染流程分为三个阶段:应用阶段,几何阶段,光栅化阶段. Unity Shader的分类: 使用的是ShaderLab编写unity中的的shader 1 表面着色器 Surface Shader 2 ...
- 使用css实现水平垂直居中
1.通过absolute和margin实现(适用于弹窗,具体位置随浏览器屏幕大小变化改变)这种方式需要居中元素的父级必须采用绝对定位或相对定位,被居中元素的尺寸需要固定. <div class= ...
- 17_defer(延迟调用)关键字的使用
1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...
- sql server创建序列sequence
1.创建一个序列对象 CREATE SEQUENCE [schema_name . ] sequence_name START WITH <constant> INCREMENT BY & ...
- CodeForces - 1150 D Three Religions
题目传送门 题解: id[ i ][ j ] 代表的是在第j个位置之后的第i个字符的位置在哪里. dp[ i ][ j ][ k ] 代表的是 第一个串匹配到第i个位置, 第二个串匹配到第j个位置, ...
- poj 1456 Supermarket(贪心+优先队列)
题目链接:http://poj.org/problem?id=1456 题意:有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间. ...