nginx使用详解:转发规则、负载均衡、server_name
时间:2024-04-14 16:40:24 来源:网络cs 作者:纳雷武 栏目:国内电商 阅读:
阅读本书更多章节>>>>
首先匹配 =其次匹配^~,其次是按文件中顺序的正则匹配最后是交给 / 通用匹配当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
文章目录
一、nginx常用的转发规则location 指令说明location转发使用 二、upstream负载均衡使用三、server_name使用四、其他常用配置限制请求类型处理静态资源目录遍历问题限制客户端使用的ip或者域名 五、需要注意的地方location /api1 探讨location ~ /api1 探讨(正则表达式)$host 和 $remote_addr 的区别 其他Rewrite命令语法Nginx 中隐藏版本号修改nginx.conf文件修改fastcgi.conf文件 springboot 打印请求路径springboot打印controller被调用的方法Controller获取请求头的内容 参考文档
一、nginx常用的转发规则
location 指令说明
该指令用于匹配 URL,语法如下:指令 | 说明 |
---|---|
= | 用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。 |
~ | 用于表示 uri 包含正则表达式,并且区分大小写。 |
~* | 用于表示 uri 包含正则表达式,并且不区分大小写。 |
^~ | 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。 |
!~ | 区分大小写不匹配。 |
!~* | 不区分大小写不匹配 |
/a | 普通前缀匹配,优先级低于带参数前缀匹配。 |
/ | 任何请求都会匹配 |
location转发使用
location /api1/# 如果请求的是:http://localhost:80/api1,# 转发形成的就会是:http://localhost:9001/location /api1/ {proxy_pass http://localhost:9001/; }
location = /api1/ (精确匹配) # 如果请求的是:http://localhost:80/api1,会被匹配到# 转发形成的就会是:http://localhost:9001/# 如果请求的是:http://localhost:80/api1/test,不会被匹配到,因为是精确匹配location = /api1/ {proxy_pass http://localhost:9001/; }
location ~ /api1 (正则表达式匹配) # rewrite重写了请求路径,break不可省略,$1为正则匹配的内容# ^/api1/(.*)$,在这个正则表达式中,$1为(.*)中的内容# proxy_set_header的使用并不会失效# 如果请求的是:http://localhost:80/api1/test,# 转发形成的就会是:http://localhost:9001/testlocation ~ /api1 {rewrite ^/api1/(.*)$ /$1 break;proxy_set_header test001 $host:$server_port;proxy_set_header test002 $remote_addr;proxy_pass http://localhost:9001; }
# 如果请求的是:http://localhost:80/api1/test,# 转发形成的就会是:http://localhost:9001/api1/testlocation ~ /api1 {proxy_pass http://localhost:9001; }
二、upstream负载均衡使用
当有其中一个服务挂了,并不会影响使用。nginx发现超时之后会使用其他能用的服务,当访问到挂了的服务响应会延迟。当所有服务超时则报错#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.com127.0.0.1 www.test002.com127.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.html location = /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.html location = /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.1if ( $host !~ ^127.0.0.1 ){return 500;}
五、需要注意的地方
当使用 location ~ 的时候, proxy_pass结尾不能为 / ,不然会报错access_log需要写在log_format后面,不然启动会报错。access_log只能打印出请求的路径,无法打印出代理之后的路径。location /api1 探讨
# 如果请求的是:http://localhost:80/api1,# 转发形成的就会是:http://localhost:9001/api1location /api1 {proxy_pass http://localhost:9001; }
# 如果请求的是:http://localhost:80/api1,# 转发形成的就会是:http://localhost:9001/location /api1/ {proxy_pass http://localhost:9001/; }
# 如果请求的是:http://localhost:80/api1,# 转发形成的就会是:http://localhost:9001//location /api1 {proxy_pass http://localhost:9001/; }
location ~ /api1 探讨(正则表达式)
#proxy_pass最多只能写到端口#比如proxy_pass http://localhost:9001/,多个/报错#比如proxy_pass http://localhost:9001/test,多个/test报错#所以正则表达式的转发经常配合rewrite使用,但是不用正则表达式依旧可以使用。# 如果请求的是:http://localhost:80/api1/test,# 转发形成的就会是:http://localhost:9001/api1/testlocation ~ /api1 {proxy_pass http://localhost:9001; }
$host 和 $remote_addr 的区别
$host 是客户端使用的ip或者域名,$remote_addr是客户端真正的ip# $host为127.0.0.1# $remote_addr为127.0.0.1http://127.0.0.1/api/test# $host为www.test001.com# $remote_addr为127.0.0.1http://www.test001.com/api/test# $host为localhost# $remote_addr为127.0.0.1http://localhost/api/test# 假设我本机ip为192.168.1.27# $host为www.baidu.com# $remote_addr为192.168.1.27https://www.baidu.com/s?wd=北京
其他
Rewrite命令语法
rewrite < regex > < replacement > [flag]regex:正则表达式replacement :跳转后的内容flag:rewrite支持的flag标记
flag标记说明 | |
---|---|
标记 | 说明 |
last | 相当于Apache的【L】标记,表示完成rewrite |
break | 本条规则匹配完成即终止,不在匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址,爬虫不会更新url |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url |
ast和break比较 | ||
---|---|---|
last | break | |
使用场景 | 一般写在server和if中 | 一般使用在location中 |
URL匹配 | 不重质重写后的url匹配 | 终止重写后的url匹配 |
#$1为(.*)rewrite ^/api1/(.*)$ /$1 break;#$1为前面的(.*),$2为后面的(.*)rewrite ^/(.*)/(.*)$ /$1 break;#当正则表达式和请求不匹配的时候,后面的/$1将不被执行,请求不会被rewrite替换rewrite ^/apitest/(.*)$ /$1 break;
Nginx 中隐藏版本号
如何在 Nginx 中隐藏版本号修改nginx.conf文件
打开 Nginx 配置文件,linux系统下一般在 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。在 http 块中添加以下内容:server_tokens off;
修改fastcgi.conf文件
编辑php-fpm配置文件,如fastcgi.conf或fcgi.conf(这个配置文件名也可以自定义的,根据具体文件名修改)。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的基本使用 阅读本书更多章节>>>>本文链接:https://www.kjpai.cn/guonei/2024-04-14/158606.html,文章来源:网络cs,作者:纳雷武,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
上一篇:重生女皇商拒绝内耗创翻世界郎澴娪萧听雨全本小说章节目录阅读
下一篇:返回列表