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

文章目录

一、nginx常用的转发规则

location 指令说明

  • 该指令用于匹配 URL,语法如下:
指令 说明
= 用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
~ 用于表示 uri 包含正则表达式,并且区分大小写。
~* 用于表示 uri 包含正则表达式,并且不区分大小写。
^~ 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
!~ 区分大小写不匹配。
!~* 不区分大小写不匹配
/a 普通前缀匹配,优先级低于带参数前缀匹配。
/ 任何请求都会匹配
  • 首先匹配 =
  • 其次匹配^~,
  • 其次是按文件中顺序的正则匹配
  • 最后是交给 / 通用匹配
  • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

location转发使用

  • location /api1/
shell 复制代码
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/
		location /api1/ {
			proxy_pass http://localhost:8001/;
        }       
  • location = /api1/ (精确匹配)
shell 复制代码
# 如果请求的是:http://localhost:80/api1,会被匹配到
# 转发形成的就会是:http://localhost:8001/
# 如果请求的是:http://localhost:80/api1/test,不会被匹配到,因为是精确匹配
		location = /api1/ {
			proxy_pass http://localhost:8001/;
        }
  • location ~ /api1 (正则表达式匹配)
shell 复制代码
# 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负载均衡使用

shell 复制代码
#server只能是ip+端口,不然启动报错
	upstream api{
		server localhost:9001;
		server localhost:9002;
		server localhost:9003;
	}
shell 复制代码
#proxy_pass里面的api对应的是upstream后面的api
		location /api/ {	
			proxy_pass http://api/;
        }

三、server_name使用

shell 复制代码
#本机host配置
127.0.0.1 www.test001.com
127.0.0.1 www.test002.com
127.0.0.1 www.test003.com
shell 复制代码
    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块
shell 复制代码
if($request_method !~ ^(GET|POST)$ ){
	return 403;
}

处理静态资源目录遍历问题

  • 过滤.../ |...\,写在server块
shell 复制代码
if( $request_uri ~* \.\.[\\\\/] ){
	return 404;
}

限制客户端使用的ip或者域名

  • 写在server块
shell 复制代码
#当写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 探讨

shell 复制代码
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/api1
		location /api1 {
			proxy_pass http://localhost:8001;
        }        
shell 复制代码
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001/
		location /api1/ {
			proxy_pass http://localhost:8001/;
        }        
shell 复制代码
# 如果请求的是:http://localhost:80/api1,
# 转发形成的就会是:http://localhost:8001//
		location /api1 {
			proxy_pass http://localhost:8001/;
        }     

location ~ /api1 探讨(正则表达式)

shell 复制代码
#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
shell 复制代码
# $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命令语法

txt 复制代码
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匹配
shell 复制代码
#$1为(.*)
rewrite ^/api1/(.*)$ /$1 break;

#$1为前面的(.*),$2为后面的(.*)
rewrite ^/(.*)/(.*)$ /$1 break;

#当正则表达式和请求不匹配的时候,后面的/$1将不被执行,请求不会被rewrite替换
rewrite ^/apitest/(.*)$ /$1 break;

springboot 打印请求路径

yml 复制代码
logging:
  level:
    org.springframework: debug

springboot打印controller被调用的方法

yml 复制代码
logging:
  level:
    org:
      springframework:
        web:
          servlet:
            mvc:
              method:
                annotation:
                  RequestMappingHandlerMapping: trace

Controller获取请求头的内容

java 复制代码
HttpServletRequest request;
Enumeration<String> enumeration= request.getHeaderNames();

参考文档

相关推荐
2301_786756606 分钟前
不做分子仿真、不布局自动化实验室,垂直科研智能平台同样跑通 AI for Science 可持续变现
运维·人工智能·自动化
志栋智能15 分钟前
超自动化安全如何提升合规与审计效率?
运维·安全·自动化
March.s21 分钟前
深入理解 Linux 系统启动原理
linux·运维·服务器
zbyyd1 小时前
Linux 基础与 Shell 命令
linux·运维·arm开发
起名真的太难了1 小时前
Linux系统运维与远程管理核心命令速查指南
linux·运维·服务器
酷可达拉斯1 小时前
自动化运维-Ansible Role详解
linux·运维·服务器·自动化·ansible
智能运维指南1 小时前
智能体自治运维选型指南:2026年企业如何从“AI辅助”走向“AI自治”
大数据·运维·人工智能
suijishengchengde1 小时前
k8s deployment或statefulset分组关停
运维·kubernetes
翼龙云_cloud1 小时前
腾讯云国际代理商:CDB数据库自动备份和异地灾备配置 从快照到跨区域恢复
运维·数据库·云计算·腾讯云
牢姐与蒯2 小时前
Linux首战之进度条
linux·运维·服务器