nginx请求处理方式

1.静态文件服务器

1.1直接指定资源目录root

这种情况下匹配后的url会全部拼接到root指定的目录后面,多用在请求路径和资源路径一致的情况下

location /test {
    root /user/local/static;
}

location /test2/ {
    root /user/local/static2/;
}

url: /test/h1.png 最终目录/user/local/static/test/h1.png

url:/test2/h2.png 最终目录/user/local/static2/test2/h2.png

root指定目录后会带完整的url,所以root目录最后的分割符“/”可以不加,因为url都是以“/”开头的。如果root指定目录最后加了“/”拼接最终目录时会自动去掉多余的“/”

1.2别名指定资源目录alias

将匹配的url去除掉匹配前缀后的内容拼接到alias指定的目录后,多用在请求路径和资源路径非一致的情况

location /test {
    alias /user/local/test/;
}

location /test2/ {
    alias /user/local/test/;
}

location /test3/ {
    alias /user/local/test;
}

url:/test/a1.jpg 最终目录/user/local/test//a1.jpg

/test/a1.jpg去掉location的/test等于/a1.jpg,alias指定的/user/local/test/拼接/a1.jpg得到最后目录

url: /test2/a1.jpg 最终目录/user/local/test/a1.jpg

/test2/a1.jpg去掉location的/test2/等于a1.jpg,alias指定的/user/local/test/拼接a1.jpg得到最后目录

url: /test3/a1.jpg 最终目录/user/local/testa1.jpg

/test3/a1.jpg去掉location的/test3/等于a1.jpg,alias指定的/user/local/test拼接a1.jpg得到最后目录

2.反向代理

这个是nginx的核心功能用来把请求代理到不同的服务器上,支持http、https、负载均衡组、Unix域套接字等多种目标服务器。通过proxy_pass指定代理服务器的地址。

location /proxy {
    # 指定代理服务器地址
    proxy_pass 服务地址;
    # 添加非必须的参数:代理时将原请求地址ip协议等带上 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

服务地址可以由三部分组成:协议://地址:端口 列如:http://192.168.88.81

location /proxy1 {
    # 指定代理服务器地址
    proxy_pass http://192.168.88.81;    
}

location /proxy2/ {
    # 指定代理服务器地址
    proxy_pass http://192.168.88.81/;    
}
    
location /proxy3 {
    # 指定代理服务器地址
    proxy_pass http://192.168.88.81/;    
}

请求1url:/proxy1/test/t1,最终代理url:http://192.168.88.81/proxy1/test/t1

请求2url:/proxy2/test/t1,最终代理url:http://192.168.88.81/test/t1

请求3url:/proxy3/test/t1,最终代理url:http://192.168.88.81//test/t1

特别注意代理服务器地址最后有没加分隔符“/”

  • 不加代理url=代理服务器地址加url全路径

  • 加了代理url=代理服务器地址加(url请求路径 - location 前缀匹配路径)

总结:添加分隔符“/”的location前缀匹配最好也加分隔符”/“,避免最终拼接的url中出现连续的分隔符。

3.负载均衡

负载均衡是使用nginx做反向代理服务器的核心使用方式。使用upstream创建一个负载均衡组,在组中可以添加多台服务器。

upstream <name> {
    server <server1>;
    server <<地址>[端口]>;
    # 更多服务器
}

常用的负载均衡策略有轮询、根据ip哈希值固定某台机器、加权、连接最少负载

upstream poll {
    # 不指定策略默认轮询
    server 192.168.88.81;
    server 192.168.88.82;
    # 更多服务器
}

upstream poll {
    # 根据请求ip哈希值选择服务器
    ip_hash;
    server 192.168.88.81;
    server 192.168.88.82;
    # 更多服务器
}

upstream poll {
    # 给服务器加权
    server 192.168.88.81 weight=3;
    server192.168.88.82 weight=6;
    # 更多服务器
}

upstream poll {
    # 使用最少连接数策略
    least_conn;
    server 192.168.88.81 weight=3;
    server 192.168.88.82 weight=6;
    # 更多服务器
}

tips:不管你指定什么策略,策略指定服务器如果请求失败,会自动重新发送到负载组中其他服务器。

upstream poll {
    # 不指定策略默认轮询
    server 192.168.88.81;
    server 192.168.88.82;
    # 更多服务器
}

location /test/poll {
    # 指定代理服务器地址,全url路径转发
    proxy_pass http://poll;    
}

location /test2/poll {
    # 指定代理服务器地址,截取匹配路径转发
    proxy_pass http://poll/;    
}

请求1url:/test/poll/t1,最终访问url:http://192.168.88.81/test/poll/t1

请求2url:/test2/poll/t2,最终访问url:http://192.168.88.81//t2

如果因为location配置导致拼接的路径有两个分隔符号“/”,会在error日志中打印错误日志。但不影响实际的调用。

4.Rewriting (重写请求)

请求重写(URL 重写)用于修改传入请求的 URL 或 URI。重写可以用于多种目的,如调整 URL 结构、隐藏内部路径、实现友好的 URL、以及处理请求转发等

rewrite: 用于重写 URL

return: 用于重定向请求或返回状态码

请求重写使用场景不多,只简单说明

rewrite regex replacement [flag];
使用正则表达式匹配,匹配后使用后面的url替换 用flag指定替换后处理方式
last: 重新启动 Nginx 的请求处理过程。
break: 停止执行当前 location 块中的其他重写规则。
redirect: 发送 302 临时重定向响应。
permanent: 发送 301 永久重定向响应。

改写请求前缀

location /category/ {
        rewrite ^/category/(\d+)$ /product/$1 last;
    }
    
请求/category/123,会被改写成/product/123 

return 使用

return code [text];
code: http状态码
text: 可选的文本内容
# 直接返回404
location / {
        return 404;
    }
# 权限拒绝
 location / {
        return 403 "Access Denied";
    }
# 重定向到新的地址
 location / {
        return 301 http://newsite.com$request_uri;
    }

return指令优先级跟高,它会直接响应回去。简单高效但不适合复杂重新或内部逻辑处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值