05-nginx高级篇之location高级实战

nginx location高级实战

  • location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个。
  • Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。
  • 针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。

1.语法介绍

Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:    —
Context:    server, location


官网用法

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

2.location语法优先级

优先级从高到低

匹配符 匹配规则 优先级
= 定义 URI 和位置的精确匹配。 1
^~ 以某个字符串开头,不检查正则 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4

3.测试location实战

# 配置文件如下
server {
    listen 22333;
    server_name _;

    # 最低级匹配,不符合其他locaiton就来这
    # 属于通用url规则
    location / {
        return 200 "location /  \n";
    }


    # 优先级最高,等于号后面可以指定url
    location = / {
        return 200 "location = /  \n";
    }


    #以/documents/开头的url,来这里,如符合其他locaiton,则以其他优先
    location /documents/ {
        return 200 "location /documents/ \n";
    }

    #匹配任何以/images/开头的请求,不匹配正则
    location ^~ /images/ {
        return 200 "location ^~ /images/  \n";
    }

    #匹配任何以.gif结尾的请求,支持正则
    location ~* \.(gif|jpg|jpeg)$ {
        return 200  "location ~* \.(gif|jpg|jpeg) \n";
    }

    access_log off;

}

4.客户端测试访问

[root@master-61 ~]#
# 精确匹配
[root@master-61 ~]#curl 10.0.0.9:22333
location = /  
[root@master-61 ~]#
# 依然是精确匹配
[root@master-61 ~]#curl 10.0.0.9:22333/
location = /  
[root@master-61 ~]#
# 没有满足的条件,因此匹配 /
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit
location /  
[root@master-61 ~]#
# 没有满足的条件,因此匹配 /  ,这里注意结尾的斜线
[root@master-61 ~]#curl 10.0.0.9:22333/documents
location /  
[root@master-61 ~]#

# 符合匹配规则,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/
location /documents/ 
[root@master-61 ~]#
# 符合匹配规则,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.html
location /documents/ 
[root@master-61 ~]#

# 依然是没有符合的规则,默认匹配  / 
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.html
location /  
[root@master-61 ~]#

# 通过正则表示匹配内容,只要是.jpg结尾
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg) 
[root@master-61 ~]#

# 即使前面匹配到了/documents/,但是结尾符合jpg优先级更高
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg) 

# 除非结尾文件名不符合,因此匹配到/documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpgggg
location /documents/ 
[root@master-61 ~]#
[root@master-61 ~]#

# 证明  ^~ 优先级 大于 ~*
[root@master-61 ~]#curl 10.0.0.9:22333/images/yuchaoit.jpgggg
location ^~ /images/

5.实际工作使用

实际工作中,会有至少3个匹配规则如下,需要同学们学习了nginx负载均衡即可理解,以及具体的网站部署实践。


# 1.必选规则,设置反向代理,官网也推荐该用法,可以加速处理,因为首页会频繁被访问
# 该location 一般直接设置反向代理,转发给后端应用服务器,或者是静态页;
location = / {
        proxy_pass http://yuchaoit.cn;
}


# 2.静态文件处理,nginx强项
# 两个模式,二选一即可
#   这个表示当用户请求是 http://yuchaoit.cn/static/hello.css 这样的请求时
#   进入/www目录下,寻找static文件夹, 也就是/www/static/hello.css文件
    location ^~ /static/ {
        root /www/;
    }

        # 这个表示请求是以如下静态资源结尾的,进入到/www/下寻找该文件
    #匹配任何以.gif结尾的请求,支持正则
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /www/;
    }


# 3.还有就是通用规则,用于处理未定义的url,默认匹配
# 一般网站除了静态文件的请求,默认就是动态请求,因此直接转发给后端
location / {
    proxy_pass http://my_django:8080/;
}

6. location的root和alias

nginx的location路径匹配功能
1.匹配用户的url
2.匹配到之后决定动作,代理转发,或者设置网页根目录,提供静态数据。


静态页面的设置,就得设置linux中的文件路径,nginx提供了2个参数
root和alias

语法:
1.root是定义最上层目录,目录路径结尾的斜线可有可无;
2.alias是定义目录别名,结尾必须以 "/" 结束,否则找不到文件。

实战用法

root

[root@test-88 ~]#vim /etc/nginx/conf.d/root_test.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/root_test.conf
server {
  listen 33555;
  server_name _;

    location ^~ /static/ {
      root /www/;
}
}
[root@test-88 ~]#mkdir -p /www/static
[root@test-88 ~]#cp /www/huoying/鸣人.jpg  /www/static/
[root@test-88 ~]#ls /www/static/
鸣人.jpg

[root@test-88 ~]#chown -R www.www /www/
[root@test-88 ~]#systemctl start nginx

[root@test-88 ~]#netstat -tunlp | grep 33555
tcp        0      0 0.0.0.0:33555           0.0.0.0:*               LISTEN      1572/nginx: master

alias

[root@test-88 ~]#vim /etc/nginx/conf.d/alias_test.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/alias_test.conf
server {
  listen 55533;
  server_name _;
    location ^~ /static/ {
      alias /www/static/;

}
}
[root@test-88 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@test-88 ~]#systemctl reload nginx
[root@test-88 ~]#netstat -tunlp | grep 55533
tcp        0      0 0.0.0.0:55533           0.0.0.0:*               LISTEN      1572/nginx: master 

posted @ 2024-04-26 11:23  叶长尧  阅读(157)  评论(0编辑  收藏  举报