已解决
nginx使用详解:转发规则、负载均衡、server_name
来自网友在路上 11208120提问 提问时间:2023-11-26 20:31:45阅读次数: 120
最佳答案 问答题库1208位专家为你答疑解惑
文章目录
- 一、nginx常用的转发规则
- location 指令说明
- location转发使用
- 二、upstream负载均衡使用
- 三、server_name使用
- 四、其他常用配置
- 限制请求类型
- 处理静态资源目录遍历问题
- 限制客户端使用的ip或者域名
- 五、需要注意的地方
- location /api1 探讨
- location ~ /api1 探讨(正则表达式)
- $host 和 $remote_addr 的区别
- 其他
- Rewrite命令语法
- springboot 打印请求路径
- springboot打印controller被调用的方法
- Controller获取请求头的内容
- 参考文档
一、nginx常用的转发规则
location 指令说明
- 该指令用于匹配 URL,语法如下:
- 首先匹配 =
- 其次匹配^~,
- 其次是按文件中顺序的正则匹配
- 最后是交给 / 通用匹配
- 当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
location转发使用
- location /api1/
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/location /api1/ {proxy_pass http://localhost:8001/;}
- location = /api1/ (精确匹配)
# 如果请求的是:http://localhost:80/api1,会被匹配到
# 转发形成的就会是:http://localhost:8001/
# 如果请求的是:http://localhost:80/api1/test,不会被匹配到,因为是精确匹配location = /api1/ {proxy_pass http://localhost:8001/;}
- location ~ /api1 (正则表达式匹配)
# rewrite重写了请求路径,break不可省略,$1为正则匹配的内容
# ^/api1/(.*)$,在这个正则表达式中,$1为(.*)中的内容
# proxy_set_header的使用并不会失效
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/location ~ /api1 { rewrite ^/api1/(.*)$ /$1 break;proxy_set_header test001 $host:$server_port;proxy_set_header test002 $remote_addr;proxy_pass http://localhost:8001;}
二、upstream负载均衡使用
#server只能是ip+端口,不然启动报错upstream api{server localhost:9001;server localhost:9002;server localhost:9003;}
#proxy_pass里面的api对应的是upstream后面的apilocation /api/ { proxy_pass http://api/;}
三、server_name使用
- 看下列代码,端口一样,server_name不一样
- 访问http://www.test001.com/api/test,进入第一个server,转发的实际为http://localhost:9001/test
- 访问http://www.test002.com/api/test,进入第二个server,转发的实际为http://localhost:9002/test
- 对于没有配置的server_name,默认进入第一个server处理
- 访问http://127.0.0.1/api/test,进入第一个server,转发的实际为http://localhost:9001/test
- 访问http://www.test003.com/api/test,进入第一个server,转发的实际为http://localhost:9001/test
#本机host配置
127.0.0.1 www.test001.com
127.0.0.1 www.test002.com
127.0.0.1 www.test003.com
server { #监听端口listen 80; #服务名server_name www.test001.com; location / {root html;index index.html index.htm;}location /api/ { proxy_pass http://localhost:9001/;}#500类型错误处理error_page 500 502 503 504 /50x.html;#映射文件50x.htmllocation = /50x.html { #相对路径root html;}}server { #监听端口listen 80; #服务名server_name www.test002.com; location / {root html;index index.html index.htm;}location /api/ { proxy_pass http://localhost:9002/;}#500类型错误处理error_page 500 502 503 504 /50x.html;#映射文件50x.htmllocation = /50x.html { #相对路径root html;}}
四、其他常用配置
限制请求类型
- 只允许GET和POST请求,写在server块
if($request_method !~ ^(GET|POST)$ ){return 403;
}
处理静态资源目录遍历问题
- 过滤…/ |…\,写在server块
if( $request_uri ~* \.\.[\\\\/] ){return 404;
}
限制客户端使用的ip或者域名
- 写在server块
#当写127.0.0.1的时候,使用localhost会报500,只能使用127.0.0.1
if ( $host !~ ^127.0.0.1 ){return 500;
}
五、需要注意的地方
- 当使用 location ~ 的时候, proxy_pass结尾不能为 / ,不然会报错
- access_log需要写在log_format后面,不然启动会报错。
- access_log只能打印出请求的路径,无法打印出代理之后的路径。
location /api1 探讨
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/api1location /api1 {proxy_pass http://localhost:8001;}
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/location /api1/ {proxy_pass http://localhost:8001/;}
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001//location /api1 {proxy_pass http://localhost:8001/;}
location ~ /api1 探讨(正则表达式)
#proxy_pass最多只能写到端口
#比如http://localhost:9001/,多个/报错
#比如http://localhost:9001/test,多个/test报错
#所以正则表达式的转发经常配合rewrite使用location ~ /api1 { proxy_pass http://localhost:9001;}
$host 和 $remote_addr 的区别
- $host 是客户端使用的ip或者域名,$remote_addr是客户端真正的ip
# $host为127.0.0.1
# $remote_addr为127.0.0.1
http://127.0.0.1/api/test# $host为www.test001.com
# $remote_addr为127.0.0.1
http://www.test001.com/api/test# $host为localhost
# $remote_addr为127.0.0.1
http://localhost/api/test# 假设我本机ip为192.168.1.27
# $host为www.baidu.com
# $remote_addr为192.168.1.27
https://www.baidu.com/s?wd=北京
其他
Rewrite命令语法
rewrite < regex > < replacement > [flag]
regex:正则表达式
replacement :跳转后的内容
flag:rewrite支持的flag标记
#$1为(.*)
rewrite ^/api1/(.*)$ /$1 break;#$1为前面的(.*),$2为后面的(.*)
rewrite ^/(.*)/(.*)$ /$1 break;#当正则表达式和请求不匹配的时候,后面的/$1将不被执行,请求不会被rewrite替换
rewrite ^/apitest/(.*)$ /$1 break;
springboot 打印请求路径
logging:level:org.springframework: debug
springboot打印controller被调用的方法
logging:level:org:springframework:web:servlet:mvc:method:annotation:RequestMappingHandlerMapping: trace
Controller获取请求头的内容
HttpServletRequest request;
Enumeration<String> enumeration= request.getHeaderNames();
参考文档
- springboot 打印请求的uri和请求参数
- Servlet–HttpServletRequest获取请求信息(请求头、请求行、参数)详解
- Nginx配置文件
- Nginx之正则表达式、location匹配简介以及rewrite重写
- nginx 正则路径匹配
- Nginx的基本使用
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"nginx使用详解:转发规则、负载均衡、server_name":http://eshow365.cn/6-42190-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!