nginx的location,upstream,rewrite 和 proxy_pass使用,以及需要注意的地方

nginx主要功能可一个分为3个。

1、页面地址路由,跳转

2、反向代理,负载均衡

3、静态资源访问

今天主要从location,upstream,rewrite 和proxy_pass这几个命令来说。

一 、  location: 顾名思义-->地址。nginx服务器非常核心的配置,一般nginx运维人员在修改nginx配置时,大部分也是围绕着location这个配置进行修改。

      下面看一下一个简单的location配置

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

     这个配置表示任何一个路径访问nginx服务器,都跳转到home目录下的index.html页面中。

     下面来详细说一下location  路径匹配规则。

      location匹配分为3种匹配方式 。

  1、绝对匹配,完全相等 “=” 号 ,比如:

location = /login/demo.html {
       *******
}

     当访问地址端口后面的地址等于/login/demo.html时,就会直接走这个location地址。

  2、正则匹配  ~ 或者  ~*  。前一个区分大小写,后一个不区分大小写

location ^~ /images/ {

# 匹配任何已/images/开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

location ~* .(gif|jpg|jpeg)$ {

# 匹配任何已.gif、.jpg 或 .jpeg 结尾的请求

 3、一般匹配  无符号 ,无符号匹配就算匹配中,也不会break,还会继续向下匹配下去,如果发现正则或者完全匹配的情况,则直接使用。

  

二、proxy_pass  反向代理,如下:

location /login {
     proxy_pass   http://www.sohu.com/
} 

      这种情况下访问nginx服务器,假设当前nginx服务器域名端口为 192.168.0.101:8080

那么当我们访问 http://192.168.0.101:8080/login就会直接跳转到搜狐首页。说明当前访问地址为搜狐网的代理地址。

 需要注意的是,这个地方有一个坑:

 

   proxy_pass 后面的搜狐地址有跟关闭斜杠,其实这个地方加不加关闭斜杠关系很大。我们来就这个关闭斜杠问题简单说一下。

    当地址后面添加关闭斜杠后,当前跳转地址传递的路径是/login后面的地址路径,此处/login后面没有地址所以实际访问的地址是http://www.sohu.com。如果我们访问nginx地址是:http://192.168.0.101:8080/login/demo,那么如果匹配这个location后,实际访问的地址就会是:http://www.sohu.com/demo。

    所以得出的结论是,当后面添加斜杠,location 自身匹配的路径不会被传递,会将另一半的路径传递到proxy_pass。

    还有一点需要注意: 斜杠这个东西只在ip+端口紧跟着后面才有这种坑。如果端口后面还有路径,则斜杠关闭不关闭问题不大。

    当proxy_pass 后面没有反斜杠时,相反,他会将所有的路径都传递到proxy_pass后面。包含/login这个路径

三、rewrite重新路由,rewrite有5中命令模式

   1、break;  如下:

location  /login {
       rewrite  ^/  /demo.html  break;
       root  home/;
}

    这个指令表示,如果location /login匹配成功,则直接在home路径中查找demo.html文件,然后跳转到demo.html。注意这是内部跳转,浏览器上的地址url不会变,还是以/login结尾。

   2、redirect ; 如下

location  /login {
       rewrite  ^/  /demo.html  redirect;
       root  home/;
}

     和break差不多,不过这个表示外部跳转,也会跳转到demo.html页面,不过浏览器地址会自动变成demo.html

   3、permanent ; 和redirect作用类似

   4、last; 如下

location  /login {
       rewrite  ^/  /demo.html  last;
       root  home/;
}

location  /demo.html {
       rewrite  ^/  /demo.html  break;
       root  home/;
}

    如果是last修饰的话,nginx会将/demo.html地址和其他location的地址进行匹配,然后找到匹配的地址,继续执行下去。这里他会执行到 /demo.html 的location中,然后内部跳转到/demo.html页面

  5、没有修饰,就是无任何修饰。如下

location  /login {
       rewrite  ^/  /demo.html ;
       root  home/;
}

     可以看到这个rewrite后面没有任何修饰。当没有任何修饰的情况下,匹配中location后,不会停止,会继续想下面的location继续匹配下去。知道匹配到最后一个,使用最后一个匹配到的。

   四、upstream  , 负载配置

      upstream  用以配置负载的策略,nginx自带的有:轮询/权重/ip_hash。特殊需求可用第三方策略(使用较少)。

       如下:

upstream test{
    server 192.168.0.101:8081;
    server 192.168.0.102:8081;
}

upstream test1 {
    server 192.168.0.101:8081 weight=2;
    server 192.168.0.102:8081 weight=1;
}

upstream test2 {
    ip_hash
    server 192.168.0.101:8081;
    server 192.168.0.102:8081;
}

server{
   listen   80;
   server_name  localhost;

   location /login {
       proxy_pass   http://test/
   } 
}

     当访问:http://localhost/login时,nginx就会在server 192.168.0.101:8081;   server 192.168.0.102:8081这两个服务之间轮询访问。

     upstream  test1 表示上面的服务访问2次,下面的服务访问1次

     upstream  test2 表示更具客户端ip地址的hash值来进行区分访问那个服务,这种设置后,同一个客户端访问的服务一般是不会变的。

      以上

猜你喜欢

转载自blog.csdn.net/zhanglei082319/article/details/88830606