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();

参考文档

相关推荐
海域云赵从友15 分钟前
破解海外业务困局:新加坡服务器托管与跨境组网策略
运维·服务器
上海运维Q先生24 分钟前
面试题整理13----deployment和statefulset区别
运维·面试·kubernetes
记得开心一点嘛2 小时前
Nginx与Tomcat之间的关系
java·nginx·tomcat
虾稿2 小时前
[手机Linux] 七,NextCloud优化设置
linux·运维·服务器
首发运维2 小时前
centos 释放系统预留内存并关闭Kdump服务
linux·运维·centos·linux操作系统问题
稳重的大王2 小时前
威联通NAS部署openwrt软路由保姆级教程附镜像文件
运维·服务器
ascarl20102 小时前
【Nginx系列】---Nginx配置tcp转发
运维·tcp/ip·nginx
新子-存在了2 小时前
linux中 mysql备份
linux·运维·mysql
ZHOUPUYU2 小时前
VMware虚拟机超详细安装Linux教程(最新版)
linux·运维·服务器·windows·微软·centos·虚拟机
成都渲染101云渲染66662 小时前
云渲染,Enscape、D5、Lumion渲染提速教程
运维·服务器·unity·电脑·图形渲染·blender·houdini