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
但愿日子清静抬头遇见的都是柔情