nginx location实战
nginx location高级实战
-
location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个。
-
Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。
-
针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。
官网文档 https://nginx.org/en/docs/http/ngx_http_core_module.html#location
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 ] } 测试用法,如果定义了如上的5个location,则 http://yuchaoit.cn/ 匹配A http://yuchaoit.cn/hello 匹配B http://yuchaoit.cn/documents/hello 匹配C http://yuchaoit.cn/images/葫芦娃.gif 匹配D http://yuchaoit.cn/documents/德玛西亚.gif 匹配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是定义目录别名,结尾必须以 "/" 结束,否则找不到文件。
7.root、alias实践。
# 1.例如目前有一个静态数据目录 /static # 静态图片数据如下 [root@web-9 /www]#ls /www/static/cai1.jpg /www/static/cai1.jpg # 2.前端网页html文件 [root@web-9 /www]#cat /www/index.html welcome chaoge linux course. <img src='/static/cai1.jpg'> # 3.nginx测试配置文件(分别测试root、和alias两种写法) [root@web-9 /etc/nginx/conf.d]#cat movie.yuchaoit.conf server { listen 80; server_name movie.yuchaoit.cn; charset utf-8; access_log /var/log/nginx/movie.yuchaoit.log; error_log /var/log/nginx/error.movie.yuchaoit.log; error_page 404 https://error.taobao.com/app/tbhome/common/error.html; location / { root /www; index index.html index.htm; } location /static/ { root /www; } # location /static/ { # alias /www/static/; #} error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
8.图解root、alias
先记住语法,location 后面支持的四个符号 # 先看懂如下语法!!! # 先看懂如下语法!!! # 先看懂如下语法!!! location = /xixi/ {} # 精确匹配 example.com/xixi/ location ^~ /static/ {} # 不支持正则,完全的字符串匹配 example.com/static/ location ~* /media/ {} # 不区分大小写的正则匹配 example.com/media/xxxxxxxxxxxxxxx example.com/Media/xxxxxxxxxxxxxxx example.com/MEDIA/xxxxxxxxxxxxxxx location ~ /media/ {} example.com/media/xxxxxxxxxxxxxxx location url {} # 比如 # 最低优先级 location / {} example.com/xxixixix example.com/hahaha example.com/aoligei example.com/你谁啊 # 优先级也很低的,没有符号,优先级就很低 # 如果你上面有基于符号的location匹配,优先级高于这里 # 只是带你看看,这个写法,能匹配到什么url # 通用型匹配 # 一般情况下,不会过多的去考虑,大小写的问题, 你知道这个语法就行 # 这个location不是你运维先去定义的 # 你们公司的官网,可以通过什么URL去访问,这是开发工程师去写代码限制好的!!! ############################################################ # 根据开发提供的网站说明书,去写你的nginx location匹配!!! # 你要达到的能力就是,吧老师说的语法,看懂,以及,我也给大家提供后续的生产级别的nginx部署案例,你就看懂了! ############################################################ location /static/ {} example.com/static/aaaaaaaaaaaaaa example.com/static/bbbbbbbbbbbbbbbbbbb example.com/static/xcccccccccccc # 你要注意,这个url结尾的 斜线,尽量,尽量给写上 location /AAA/ {} # 听懂 1 不懂 2 location /BBB/ {} # 看懂 扣 6 不懂 7 ,你学过,练过的写法,就是这些了。 记不住意思,正常,但是你学过了,看笔记,就得知道他们的区别
1.location url {} ,是运维,要配合开发去写的。不是你自己瞎琢磨的。 # 开发写的url,什么意思呢? # 你,获取一个开发写好的源代码,这个源代码里面,设计好了url的规则 #你的nginx要按照这个规则去写, 后面学到jumpserver,你就知道了,例如如下的生产级别nginx设置 # 这些配置,是为了让nginx,找到,匹配堡垒机,每一个组件的设置,请看 server { listen 80; # server_name www.yuchaoit.cn; client_max_body_size 5000m; 文件大小限制 # Luna 配置 # 经过实测,这个v12版本,只能http://10.0.0.61:4200/luna/这样去访问,前端这里有点难处理。 # myjumpserver.com/luna/aaaaaaaaaaaaaaa # myjumpserver.com/luna/bbbbbbbbbbbb location /luna/ { proxy_pass http://luna:4200; } # Core data 静态资源 # myjumpserver.com/media/replay/aaaaaaaaaaaaaaaaaaa # myjumpserver.com/media/replay/bbbbbbbbbbbb location /media/replay/ { add_header Content-Encoding gzip; root /opt/jumpserver-v2.12.0/data/; } # myjumpserver.com/media/aaaaaaa # myjumpserver.com/media/bbbbbb # myjumpserver.com/media/cccc location /media/ { root /opt/jumpserver-v2.12.0/data/; } # 只要你部署这个堡垒机产品,人家产品的html网页中,发送了大量的请求是如下,就进入这些location去找资源 # myjumpserver.com/static/xxxxxxxxxxxxxxxx location /static/ { root /opt/jumpserver-v2.12.0/data/; } # KoKo Lion 配置 # 关于基础组件的,反向代理了 # 只要你的url,访问的是 myjumpserver.com/koko/xxxxxx location /koko/ { proxy_pass http://koko:5000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # lion 配置 # myjumpserver.com/lion/xxxxxxxxx location /lion/ { proxy_pass http://lion:8081; proxy_buffering off; proxy_request_buffering off; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_ignore_client_abort on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 6000; } # Core 配置 # myjumpserver.com/ws/xxxxxxx location /ws/ { proxy_pass http://core:8070; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # myjumpserver.com/api/xxxxxx location /api/ { proxy_pass http://core:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # myjumpserver.com/core/xxxxxx location /core/ { proxy_pass http://core:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 前端 Lina # myjumpserver.com/ui/xxxxxxx location /ui/ { proxy_pass http://lina:9528; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 通用型匹配,上述的url,都匹配不到,就进入到这里!!! # 这里具体意思,等我讲解堡垒机时候,再说 #但是这个写法,你应该已经看懂了!!! #看不懂,就是你练习的不够多!!! location / { rewrite ^/(.*)$ /ui/$1 last; } } # 为什么要写这些location,是人家堡垒机,定义好了这些功能路径 #你 要在前端部署一个nginx作为代理的,话,得基于这些url,去对应的写location。。