nginx使用详解:转发规则、负载均衡、server_name

nginx使用详解:转发规则、负载均衡、server_namenginx 使用详解 转发规则 负载均衡 server name nginx 转发

大家好,欢迎来到IT知识分享网。

一、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/test location ~ /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/test location ~ /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后面的api location /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.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.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:9001/api1 location /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/test 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标记 
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://haidsoft.com/127339.html

(0)
上一篇 2025-09-11 21:26
下一篇 2025-09-11 21:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信