文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

之前已经讲过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命中过程

  1. 先进行精准匹配,如果命中立即返回结果并结束解析的过程;
  2. 精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;
  3. 继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

匹配模式及优先级顺序:

优先级排序自顶向下,优先级逐步降低。

  • 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的更多相关文章

  1. Nginx 核心配置-location的登录账户认证实战篇

    Nginx 核心配置-location的登录账户认证实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用ab命令模拟网站攻击 1>.安装httpd-tools工具 ...

  2. Nginx 核心配置-location的匹配案例实战篇

    Nginx 核心配置-location的匹配案例实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.location语法规则介绍 在没有使用正则表达式的时候,nginx会先在 ...

  3. Nginx主配置参数详解,Nginx配置网站

    1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...

  4. kohana nginx的配置

    kohana nginx的配置 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php? kohana_uri=/$1 ...

  5. rewrite规则写法及nginx配置location总结

    rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用. 例如http://seanlook.com/a/we/index.php ...

  6. Nginx教程(四) Location配置与ReWrite语法

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } ...

  7. Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617

    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...

  8. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  9. Nginx 配置 Location 规则优先级问题

    nginx 的 location与配置中 location 顺序没有关系,与 location 表达式的类型有关.相同类型的表达式,字符串长的会优先匹配. 以下是按优先级排列说明: 等号类型(=)的优 ...

随机推荐

  1. ansible之数据提取与Juniper实例演示

    一.Ansible列表两种表达方式 基于YAML的列表 my_list: - a - b - c - d 基于Json格式的列表 {"my_list":[ "a" ...

  2. 基于python的mysql复制工具

    一简介 python-mysql-replication 是由python实现的 MySQL复制协议工具,我们可以用它来解析binlog 获取日志的insert,update,delete等事件 ,并 ...

  3. C#简单爬取数据(.NET使用HTML解析器ESoup和正则两种方式匹配数据)

    一.获取数据 想弄一个数据库,由于需要一些人名,所以就去百度一下,然后发现了360图书馆中有很多人名 然后就像去复制一下,发现复制不了,需要登陆 此时f12查看源码是可以复制的,不过就算可以复制想要插 ...

  4. ionic app 监听网络功能

    安装cordova插件: cordova plugin add cordova-plugin-network-information 在app.js 的run()里面的function()注入$cor ...

  5. C#数据结构_排序

    /** * 冒泡排序 * * @param array * @return */ public static int[] bubbleSort(int[] array) { if (array.len ...

  6. Linux的权限属性信息1到10位分别什么意思

    要设置权限,就需要知道文件的一些基本属性和权限的分配规则. 在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性. #ls -l 路径          [ls -l  等价于 ...

  7. in和exists过程对比

    两者执行流程完全不一样. in的过程 select * from tableA a where a.id in (select b.a_id from tableB b); 1)首先子查询,查询B表中 ...

  8. redis desktop manager安装及连接方式

    1.下载安装包 官网下载地址:https://redisdesktop.com/pricing 官网下载需要付费使用 再此附上一个免费的破解版本,绿色安全可用 链接:https://pan.baidu ...

  9. [SNOI2019]字符串

    名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...

  10. HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)

    HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...