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指令优先级跟高,它会直接响应回去。简单高效但不适合复杂重新或内部逻辑处理