1、server块
server块既虚拟主机部分,如果请求中的Host头和server_name相匹配,则将请求指向对应的server块,示例如下:
server {
server_nametestnginx.com www.testnginx.com;
}
server_name 支持使用通配符正则表达式,支持配置多域名,服务器名称。当有多个server块时,会存在匹配优先级的问题,优先级顺序如下:
- 精确的名字
- 以*开头的最长通配符名称,如 *.testnginx.com;
- 以*结尾的最长通配符名称,如 testnginx. * ;
- 按照文件顺序,第一个匹配到的正则表达式;
- 如果没有匹配到的对应的server_name,则会访问default_server;
2、location块
localtion块在server块中使用,它的作用是根据客户端请求URL去定位不同的应用。即当服务器接收到客户端请求之后,需要在服务器指定端指定目录去寻找客户端所请求的资源,这就需要使用请求URL匹配对应的location命令。下表是URL在location块中的匹配规则说明。
匹配格式 | 作用 | 优先级 | 备注 |
---|---|---|---|
location=/uri | =表示精确匹配 | 1 | |
location ^~/uri | ^~匹配以某个URL前缀开头的请求,不支持正则表达式 | 2 | |
location ~ | 区分大小写的匹配,属于正则表达式 | 3 | 如果有多个,优先级根据在文件中出现的先后顺序 |
location~* | 不区分大小写的匹配,属于正则表达式 | 4 | |
location /uri | 表示前缀匹配,不带修饰符,但是优先级没有正则表达式高 | 5 | |
location / | 通用匹配,默认找不到其它匹配时,会进行通用匹配 | 6 | |
location @ | 命名空间,不提供常规的请求匹配 |
这个名称是自己起的,在其它的nginx配置文件中有其对应。例如:
location ~ /basic-api(.*) {
set $name portal_cluster;
proxy_set_header Host $http_host;
proxy_pass http://$name/portal$1$is_args$args;
}
其中,
- ~是区分大小写匹配;
- $name对应portal_cluster对应localhost:8880;
$1对应正则表达式匹配的第一个内容(.*); - $is_args的含义是,如果请求有参数,为?;如果请求没有参数,为空字符串;
- $args的含义是请求中的参数。
- 因此,如果有请求:http://www.test.com/basic-api/a/b/c?key=value
- 会被转发到:http://localhost:8880/portal/a/b/c?key=value