nginx相关配置记录

参考文章:

Nginx反向代理与负载均衡实战指南

nginx基础配置之location匹配规则

Nginx配置HTTPS全攻略|从申请证书到安全加固

 

一、location的匹配规则  

 1、location匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配

@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

2、location 匹配的优先级(与location在配置文件中的顺序无关)

=    精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

location = / {  
   #规则A  
}  
location = /login {  
   #规则B  
}  
location ^~ /static/ {  
   #规则C  
}  
location ~ \.(gif|jpg|png|js|css)$ {  
   #规则D  
}  
location ~* \.png$ {  
   #规则E  
}  
location !~ \.xhtml$ {  
   #规则F  
}  
location !~* \.xhtml$ {  
   #规则G  
}  
location / {  
   #规则H  

}  

具体的匹配案例如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在

 

二、server模块配置  

Nginx配置文件-server模块

 

三、location中的alias  

alias 指令用于指定实际的文件系统路径,它将匹配到的 location 映射到不同于原始请求路径的实际目录。与 root 相比,alias 会完全替换匹配到的 URI 前缀。

例如:

location /img/ {
    alias   D:/plugin/files/static/images/;
}
  • alias 指令将匹配到 /img/ 的请求映射到 D:/plugin/files/static/images/ 目录。
  • 当用户请求 /img/127/type3.png 时,Nginx 会将 /img/ 部分替换为 D:/plugin/files/static/images/,然后在该目录中查找对应的文件,即 D:/plugin/files/static/images/127/type3.png

alias 和 root 的区别

  • alias:alias 会替换掉 location 中匹配的路径。
  • 例如:
location /img/ {
    alias /var/www/static/images/;
}

当用户请求 /img/127/type3.png 时,Nginx 实际会查找文件 /var/www/static/images/127/type3.png。需要注意的是,alias 后面的路径和 URI 是组合的,而不是简单地追加。

  • root:root 是在 location 中定义的目录后面追加请求的 URI。
  • 例如:
location /img/ {
    root /var/www/static;
}

当用户请求 `/img/127/type3.png` 时,Nginx 实际会查找文件 `/var/www/static/img/127/type3.png`。可以看到,`root` 会将 `location` 中的路径部分保留下来并追加到 `root` 指定的路径中。

 

使用场景

alias 通常用于将不同的请求路径映射到一个特定的文件夹,这在需要对请求路径做简化或自定义文件路径映射时非常有用。
root 更适用于标准的静态资源路径,尤其是当资源路径和请求路径的结构基本保持一致时。

总结

location 用于匹配请求路径,控制如何处理某些特定路径的请求。

  • alias 用于将匹配到的路径映射到实际的文件系统路径,帮助实现灵活的 URL 路由。
  • 区别于 rootalias 会直接替换路径,而 root 会追加路径。

 

四、Nginx upstream 中的 keepalive 配置详解

image

五、location中的try files  

location / {
    try_files $uri $uri/ /index.html;
}

含义是:

  1. 先找请求路径对应的真实文件;
  2. 再找对应目录;
  3. 都找不到时,内部转发到 /index.html

 

六、proxy_pass 的尾斜杠是高频坑

很多人会写:

location /api/ {
    proxy_pass http://backend:8080/;
}

也有人写:

location /api/ {
    proxy_pass http://backend:8080;
}

这两个不完全一样。

根据 Nginx 的规则:如果 proxy_pass 后面带 URI,那么匹配到的 location 部分会被替换掉;如果不带 URI,则原始请求 URI 通常会原样传给上游。

举例:

location /api/ {
    proxy_pass http://backend:8080/;
}

请求:

/api/users

转发给后端时通常变成:

/users

而:

location /api/ {
    proxy_pass http://backend:8080;
}

请求:

/api/users

转发给后端通常仍是:

/api/users

所以面试时可以说:

proxy_pass 最容易踩坑的是尾部 URI。带 / 常常意味着把 location 匹配部分替换掉,不带 URI 则更接近原样转发。前后端联调时要跟后端确认接口实际路径,避免本地代理和线上代理行为不一致。

 

 

 

 

 

 

 

 

 

 

 

--

posted on 2024-02-21 19:50  有点懒惰的大青年  阅读(57)  评论(0)    收藏  举报