Nginx是一款自在的、开源的、高性能的HTTP服务器和反向代理服务器,此文次要是记录一下在Nginx配置时,location应该如何配置。

http区块

Nginx的HTTP配置次要包含三个区块,构造如下:

http { //这个是协定级别  include mime.types;  default_type application/octet-stream;  keepalive_timeout 65;  gzip on;    server { //这个是服务器级别      listen 80;      server_name localhost;        location / { //这个是申请级别          root html;          index index.html index.htm;        }      }}

location区块

location是Nginx服务器十分外围的配置,用于匹配指定的uri(申请uri不蕴含查问字符串,如http://localhost:8080/test?id=10,申请uri是/test)。个别在批改Nginx配置时,大部分也是围绕着location这个配置进行批改。

不局部状况下其实是不须要很简单的配置的,做个动静拆散曾经能满足绝大多数单体服务的;而在分布式环境下,某个server中通常须要配置很多location,来将申请散发到不同的微服务下,此时你必须十分相熟location 的配置和匹配规定,否则真是无从下手。

上面来看一下一个简略的location配置:

location / {     root   home/;     index  index.html;}

根本语法

location [ = | ~ | ~* | ^~ | @] uri {...}

意思是能够用 = ~ ~ *或 ^~ @ 符号为前缀,当然也能够没有前缀(因为 [A] 是示意可选的 A ; A|B 示意 A 和 B 选一个,下面的样例就属于没有符号前缀的例子),紧接着是 uri ,再接着是{…} 指令块,整个意思是对于满足这样条件的 uri 实用指令块 {…} 的指令。

匹配模式

所有的模式能够分为两种,匹配程序也是基于这两种模式来进行解决的:

  • 一般字符串(literal strings) ,是以无前缀、 = ^~ 三种模式的 uri;
  • 正则表达式(regular expression),是以 ~ ~* 前缀两种模式的uri;

匹配程序

  1. 一般字符 = 准确匹配。如果发现准确匹配,nginx进行搜寻其余匹配
  2. 其余一般字符匹配,先匹配所有一般字符串,将最准确(命中长度)的匹配临时存储;
  3. 如果第2步中有 ^~ 命中的,则跳过第4步,间接到第5步;
  4. 依照配置文件中的申明程序进行正则表达式匹配,只有匹配到一条正则表达式,则进行匹配,取正则表达式为匹配后果;
  5. 如果所有正则表达式都匹配不上,则取之前一般字符串中存储的后果;
  6. 如果一般字符串和正则表达式都匹配不上,则报404 NOT FOUND。

总结一下就是: 一般命中程序无所谓,因为是按命中精准度来确定的 ;正则命中辨别程序,因为是从返回后命中的,命中一个后就不会持续匹配下一个正则。

example

  1. 无前缀示意:必须以指定模式开始:

    server {  listen 80;  server_name localhost;  location /abc {    ……  }}那么,如下是对的:http://baidu.com/abchttp://baidu.com/abc?p1http://baidu.com/abc/http://baidu.com/abcde
  2. ^~ 示意:相似于无前缀修饰符的行为,区别是,如果此模式匹配,是会进行搜寻正则匹配的,然而会持续搜寻一般模式。
  3. =示意:必须与指定的uri准确匹配

    server {  listen 80;  server_name localhost;  location = /abc {    ……  }}那么,如下是对的:http://baidu.com/abchttp://baidu.com/abc?p1如下是错的:http://baidu.com/abc/http://baidu.com/abcde
  4. ~ 示意:指定的正则表达式要辨别大小写

    server {  listen 80;  server_name localhost;           location    ~   ^/abc$ {    ……  }}那么,如下是对的:http://baidu.com/abchttp://baidu.com/abc?p1=11&p2=22如下是错的:http://baidu.com/ABChttp://baidu.com/abc/http://baidu.com/abcde
  5. ~* 示意:指定的正则表达式不辨别大小写

    server {  listen 80;  server_name localhost;        location ~* ^/abc$ {    ……  }}那么,如下是对的:http://baidu.com/abchttp://baidu..com/ABChttp://baidu..com/abc?p1=11&p2=22如下是错的:http://baidu..com/abc/http://baidu..com/abcde
  6. @示意:这些location区段客户端不能拜访,只能够由外部产生的申请来拜访,如try_files或error_page等,以error_page为例:

        server {  listen 80;  server_name localhost;  error_page 404 @fallback                location /abc {             //检测文件4.html和5.html,如果存在失常显示,不存在就去查找@qwe值              try_files    /4.html        /5.html      @fallback;                 }             location @fallback  {             proxy_pass http://www.baidu.com;    --跳转到百度页面      }  }

    当uri匹配上/abc时,会按程序检测文件的存在性,并且返回找到的第一个文件,最初一项就是跳转到百度,这种写法能够代替本来罕用的rewrite,貌似能够进步解析效率;

root&alias区别

Nginx指定文件门路有两种形式root和alias,两种指令有不同的应用办法和作用域,root能够配置在http、server、location、if区块中,然而alias只能配置在location区块中。

root与alias次要区别在于Nginx如何解释location前面的uri,这会使两者别离以不同的形式将申请映射到服务器文件上。

  • root的处理结果是:root门路+location门路

    location ^~ /appImg/{    root /home/nginx;}

    这个location相当于拜访服务器上的文件门路: /home/nginx/appImg/abc.jpg

  • alias的处理结果是:应用alias门路替换location门路

    location ^~ /appImg/{    alias /home/nginx/;}

    这个location相当于拜访服务器上的文件目录:/home/nginx/abc.jpg(即alias不会应用location前面配置的门路),而且如果alias 指定的是目录,前面肯定要加上 /,否则会找不到文件。