前端需要了解Ngnix知识速成

nginx代理

Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个非常流行的开源 Web 服务器软件。

1. nginx核心配置项

nginx的默认核心配置文件nginx.conf,nginx的配置项总共可分成6个模块:

  • 全局段:全局配置,对全局生效;
  • events段:配置影响 Nginx 服务器与用户的网络连接;
  • http段:配置代理、缓存、日志等功能和第三方模块的配置,基本是nginx中最常用的配置;
  • server段:配置虚拟主机的相关参数,一个 http 块中可以有多个server 块;
  • location段:用于配置匹配的uri
  • upstream段:配置后端服务器具体地址,负载均衡配置

下面详细讲解6个部分:

  • 1、全局段核心参数

user nginx; # 指定我们Nginx服务的运行用户

worker_processes 1; # 定义Nginx的worker进程数量,一般与服务器CPU核数保持一致

worker_processes auto; # 与当前cpu物理核心数一致

error_log /var/log/nginx/error.log warn; # 指定Nginx错误日志

pid /var/run/nginx.pid; # 指定Nginx PID进程号文件

daemon off ; 指定 Nginx 的运行方式,默认是on,后台运行模式;前台用于调试,后台用于生产

  • 2、events段核心参数

worker_connections 1024; # 指定Nginx当前一个worker进程的最大并发连接数,即并发能力

  • 3、http段核心参数

include /etc/nginx/mime.types; # 应用文件拓展名和文件类型映射文件

default_type application/octet-stream; # 默认文件类型,当Nginx无法识别当前访问页面内容时,触发下载动作

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';# 指定Nginx访问日志格式,下节详细讲解

access_log /var/log/nginx/access.log main; # 定义Nginx访问日志的位置

sendfile on; # 开启文件传输模式

keepalive_timeout 65; # 连接保持超时时间,单位秒,值为0时表示不超时,当Nginx建立TCP连接之后,多长时间没有动作,自动断开

include /etc/nginx/conf.d/*.conf; # 加载自定义的配置文件

#tcp_nopush on; # 减少网络报文段的数量

send_timeout 60s; # 如果在设置的时间内 Nginx 还没有将响应完全发送出去,则会返回 “408 Request Time-out” 错误,默认为60s

keepalive_timeout 60s; # 用于设置 Nginx 保持连接的超时时间。当浏览器发送请求时,如果它已经与 Nginx 建立了连接,则可以直接使用该连接发送请求,而不需要再次建立连接。这样就可以减少建立连接的开销,提高性能

gzip on; # 开启 gzip 文件压缩,浏览器加载的包大概能节约一半的空间,能够很好的提升浏览速度。gzip压缩的详细参数见下文 gzip_vary on; #设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部 gzip_comp_level 6; #设置Gzip压缩程度,级别从1-9,1表示程度最低,效率最高,9压缩程度最高,效率最低最费时间 gzip_min_length 1k; #设置允许压缩的页面最小字节数 gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; #压缩的文件类型

我们在conf.d/default.conf可以看到默认的转发配置,我们借此解读下server段、location段配置

  • 4、server段核心参数:

    server {
    	listen: 80xx; # 监听的端口 
    	server_name [www.xxx.com] # 通过什么网址、域名请求过来的;可以设置多个,用英文逗号隔开 
    	error_page  404    /404.html; # 访问路径不存在时的显示页面 
    	error_page   500 502 503 504    /50x.html; # 内部报错的显示页面
    	localtion / {
    		root html/xxx   # 网站的根目录位置,
    		index index.html  # 指定首页文件
    		...
    	}
    }
    
  • 5、location段核心参数

    localtion / {
    	root html/xxx   # 网站的根目录位置,
    	index index.html  # 指定首页文件
    	proxy_pass [http://127.0.0.1/xxx/]  # 配置转发的路径或负载均衡upstream别名,后文详细讲解
    	proxy_connect_timeout 3s;  # 连接后台服务器的超时时间 
    	proxy_read_timeout 3s;     # 从后台服务器读取数据的超时时间 	
    }
    
  • 6、upstream段核心参数

  • upstream test {  # 负载均衡配置别名,一般配合proxy_pass使用,比如
    	proxy_pass [http://test/]; 
    	# 以权重1:2转发至两个服务 
    	server 192.168.0.1 weight=1;   
    	server 192.168.0.2 weight=2; 
    }
    

    2. nginx各类转发、代理配置详解|location、proxy_pass参数详解

    首先我们要了解nginx进行转发代理的核心在于两处,一是入口,二是出口;入口就是url路径匹配识别对应的路径,出口就是转发映射对应的后台服务地址。

    在这里插入图片描述

2.1 location支持2种匹配模式:精确匹配(普通匹配)和模糊匹配(正则匹配),总共以下几种呈现形式:

  • 1、全路径精确匹配 =

进行uri的全路径精确匹配,要匹配的一模一样的uri 比如 location = /index ,那么只有路径为/index的才会匹配到

  • 2、前缀模糊匹配 ^~

进行uri的前缀精确匹配 比如 location ^~ /user/ ,那么只要是路径以/user/开头的都会匹配到

  • 3、无匹配符号的精确匹配

没有符号,按照路径开头精确匹配,但是匹配到后不会立即返回,还会继续匹配其他普通匹配,如果匹配到,则会舍弃之前匹配的路径 比如 location /user/ , 当访问/user/开头时会匹配到 比如 location /user/admin,当访问/user/admin时会匹配到

  • 4、模糊匹配 ~

进行uri的模糊匹配,区分大小写,匹配到后不再进行其他匹配 比如 location ~ /user/ ,当路径包含/user/时会匹配,比如/admin/user/或者/user/admin/ 当然也可以用正则表达式来表示匹配路径: 比如 location ~ ^/user(.*)admin$,能够匹配以/user开头,admin结尾的路径,.*表示的是任意字符

这里我们简单测试一下,配置后我们访问192.168.244.41/user/xxx/admin,发现是可以正常转发至后台的tomcat服务的,只是tomcat服务中没有/user地址的接口,所以返回404
在这里插入图片描述

我们继续访问192.168.244.41/user/xxx,发现报的就是nginx的404了,这说明请求并没有转发到后台tomcat中,说明没有命中匹配。
在这里插入图片描述

  • 5、模糊匹配 ~*

进行uri的模糊匹配,不区分大小写,匹配到后不再进行其他匹配,优先级与~相同,按照先后顺序优先 比如 location ~ /USER/,当路径包含/USER/时会匹配,如果是/user/则不会,因为区分大小写了

优先级: 由高到低:= > ^~ > 其他,其他匹配根据先后顺序,配置在前的越优先

2.2 proxy_pass 的四种配置写法

首先我们来回顾下proxy_pass的语法:

proxy_pass url;

转发地址url分为带/和不带/,带杠的为绝对根路径,会直接在路径后拼接上不带匹配路径的转发地址;如果没有杠表示相对路径,则会将匹配路径也带上进行转发,我们举例说明:

location /user/ {
    proxy_pass url;
}

访问路径固定为:http://192.168.244.21/user/index.html

  • 1、当proxy_pass http://192.168.244.21:8080/

会跳转至http://192.168.244.21:8080/index.html,带/表示绝对路径,匹配路径/user/会被消除

  • 2、当proxy_pass http://192.168.244.21:8080

会跳转至http://192.168.244.21:8080/user/index.html,相对路径,匹配路径/user/不会被消除

  • 3、当proxy_pass http://192.168.244.21:8080/admin/

会跳转至http://192.168.244.21:8080/admin/index.html,匹配路径/user/被消除,并且保留转发路径里的/admin/

  • 4、当proxy_pass http://192.168.244.21:8080/admin

会跳转至http://192.168.244.21:8080/adminindex.html,因为proxy_pass中也包含了/了,表示绝对路径,所以/user/会被消除

总言之记住一点,带/表示绝对路径,请求路径中的匹配路径(location)转发时会被消除

2.3 server和location模块中proxy_pass的区别

在server模块中的proxy_pass 只需要配置ip(或域名)和端口,相当于端口转发;

而在location中的proxy_pass,也就是我们更加常用的,可以配置域名、ip、端口、uri,此外还需要提供协议:http或https,相当于地址转发。

server {
    listen 80;
    proxy_responses 1;
    proxy_timeout 20s;
    proxy_pass xxx.com:8080;	
	location /user/ {
        proxy_pass http://192.168.244.21:8081;
    }
}

3.return、rewrite重定向、重写详解

我们在日常的生产过程中,常常有需要重定向转发的需求,比如企业更换了域名,但又要保证之前的域名能访问,这就需要做重定向的跳转。

什么是重定向?

重定向是指将客户端的请求从一个URL自动重定向到另一个URL。这通常是通过服务器发送一个特定的HTTP状态码来完成的,告诉客户端(以及搜索引擎)资源已经移动到了新的位置。重定向可以是临时的(302 Found)或永久的(301 Moved Permanently)

一句话概括:重定向转发时浏览器上的地址是会变化的,客户是能感知到的

什么是重写?

重写是指在不改变URL的情况下,修改客户端请求的HTTP请求行(request line)或路径。这通常用于URL的标准化或修改,而不需要告诉客户端资源已经移动。重写通常在服务器配置文件中完成,例如在Nginx的rewrite指令中。

一句话概括:重写转发时浏览器上的地址是会不会变化的,客户是无感的

应用场景: 重定向用于告诉客户端资源已经移动到了新位置 重写用于在不改变客户端URL的情况下修改请求

1.1 return 详解

1.1.1 return 核心概念

介绍:

return指令用于立即结束当前处理块的执行,并返回一个状态码给客户端。这个状态码可以是204(No Content)、400(Bad Request)到500(Server Error)之间的任何值。 return通常用于访问控制、错误处理或配置特定的HTTP响应 该指令可以返回指定的响应码和重定向URL给客户端,也可以返回指定的响应码和文本给客户端

作用域:

server, location, if

语法:

return code [text]; 
return code URL;
return URL;

return的状态码为301、302、303、307、308时,则为重定向; return的状态码为其他时,可以返回响应主体[text]。

1.1.2 return 案例

官方文档:nginx.org/en/docs/htt…

  • 1、返回指定状态码和文本

如果要返回文本,需要指定 default_type application/json;,不配置的话,跳转会默认以下载文件形式

location ~ /user {
    default_type application/json; 
    return 200 "跳转成功";
}
  • 2、重定向到指定链接

重定向分为临时重定向和永久重定向:

永久重定向: 301,308 表示永久重定向,重定向结果会缓存,下次请求直接从缓存获取;区别在于301会进行方法转变,比如一个POST提交的请求,会转换为GET请求转发,而308则会保持原本方法进行转发

临时重定向: 300,该请求有多种可能的响应,浏览器可以选择它们其中的一个。服务器没有任何标准可以遵循去代替用户来进行选择 302,重定向请求转发时使用 GET 方法,不管原请求使用的是何种方法 303,基本跟 302 一致,所以很少用 303,都是使用 302 307,为了补充 302.重定向必须使用原请求的方法和包体访问

location /user/ {
        return 300 "http://www.baidu.com";
}

或者

location /user/ {
        return "http://www.baidu.com";
 }

在这里插入图片描述
在这里插入图片描述

3、返回一个自定义页面,并将参数、uri打印出来

location /test {
     default_type text/html;
     set $name 跳转成功;
     return 200 <html><p>$name</p><p>request_uri:$request_uri</p><p>document_uri:$document_uri</p><p>uri:$uri</p><p>query_string:$query_string</p><p>args:$args</p></html>;
 }

注意,要让nginx支持显示中文,需要在nginx.conf中配置:

http {
     ...
    charset utf-8;
}

在这里插入图片描述

1.2 rewrite 详解

1.2.1 rewrite 核心概念

官方文档:nginx.org/en/docs/htt… 介绍:

Nginx 的 rewrite 模块是一个功能丰富的组件,它使得用户能够通过正则表达式对请求的 URI 进行重写。rewrite 模块支持 PCRE(Perl Compatible Regular Expressions)正则表达式,这为用户提供了强大的匹配和重写能力。通过正则表达式,用户可以精确地控制哪些请求需要被重写以及重写后的 URI。同时,rewrite 模块还提供了一系列的标记(flag),如 last、break、redirect、permanent 等,以控制重写后的行为,例如是否继续执行后续的重写规则、是否返回重定向响应等。这个功能通常用于以下几种场景:

  • URL 规范化:使 URL 看起来更规范、合理,便于用户记忆和搜索引擎优化。
  • 动态 URL 地址伪装:企业常常将动态 URL 地址伪装成静态地址提供服务,以提高系统的负载能力和用户体验。
  • 域名更换:当网站更换域名时,可以通过 rewrite 指令将旧域名的访问跳转到新域名上,确保用户的访问不会受到影响。
  • 业务调整:在服务端进行某些业务调整时,可能需要通过重写 URL 来实现特定的访问控制或数据分发。

作用域:

server, location, if

语法:

rewrite regex replacement [flag];

可选的flag参数:

  • last

标记表示在执行了当前的重写规则后,继续执行后续的 rewrite 规则或 location 匹配。 它通常用在 server 块或 if 块中,以确保重写规则可以与其他规则组合使用,形成一个规则链。

  • break

标记表示在执行了当前的重写规则后,停止执行后续的所有 rewrite 规则。 它通常用在 location 块中,用于确保一旦某个重写规则匹配并执行后,不会继续执行其他可能存在的重写规则。

  • redirect:

标记表示重写规则执行后,返回一个重定向响应(HTTP 302 状态码)给客户端,而不是继续处理请求。 它用于实现临时性的重定向,比如在网站维护时将用户重定向到另一个地址。

  • permanent

标记表示重写规则执行后,返回一个永久重定向响应(HTTP 301 状态码)给客户端,并且后续的请求应该直接跳转到新的 URI,而不是再次执行重写规则。 它用于实现永久性的重定向,比如在域名更改后,将旧域名重定向到新域名。

301和302的应用场景: 302 需要经常变化跳转路径的uri则使用302 301 基本不变的调整uri(http跳转https、seo)

1.2.2 rewrite 案例

1、替换旧域名xxx.com为新域名yyy.com

server {
	listen       80;
	server_name  www.xxx.com;		#域名修改	
	charset utf-8;
	
	location / {
	#添加域名重定向
        if ($host = 'www.xxx.com'){						#$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.yyy.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串
        }
        root   html;
        index  index.html index.htm;
}        

2、旧域名访问/user/的请求跳转新域名,并且访问在路径上添加/new/

server {
	listen       80;
	server_name  www.xxx.com;		
	charset utf-8;
	
	#添加
	locatoin /user/ {
        rewirte (.+) http://www.newxxx.com/new$1 permanent;		#这里的$1为位置变量,代表/user/
    }
	
	locaiton / {
        root   html;
        index  index.html index.htm;
    }
}

3、将动态链接改为伪静态链接(看起来像是静态链接的地址)

用户访问:www.xxx.com/user/view/3… 实际地址:www.xxx.com/user/index.…

location ~ /user/view {
    rewrite /user/(.*)/(.*)/(.*).html /user/$3.jsp?post=$2&action=$1 last;
}
$N 表示第几个括号中的变量

4、业务新版本上线,要求所有 IP 访问任何内容都显示一个维护页面,只有允许 IP 192.168.244.2访问后台业务

先创建维护页面

ehho "<h1>系统升级中... 持续时间 2023-12-24 23:00:00 -2023-12-24 23:50:00 </h1>" > /var/www/html/system.html

修改配置

server {
	listen       80;
	server_name  www.xxx.com;		
	charset utf-8; # 显示中文
 
	# 是否转发标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    # 是否为内部IP
	if ($remote_addr = "192.168.244.2"){		
        set $rewrite false;
    }
	# 跳转维护页面
    if ($rewrite = true){						
        rewirte (.+) /system.html;				#将域名后边的路径重写成/system.html
    }
    location = /system.html {
        root /var/www/html;						#网页返回维护页面
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}

5、项目升级,但部分jsp链接未升级,需要将所有.jsp访问转发到原项目

bash 代码解读复制代码location ~* .*\.jsp {
        rewrite (.+) http://www.old.xxx.com$1 permanent;
}

4 nginx实现正向代理|反向代理和正向代理的区别

1. 相关概念

1.1 什么是反向代理

所谓反向代理,就是用一个代理服务器,来接收客户端的各种请求,而客户端并不知道各类后台实际服务的地址,统一通过代理服务器来实现转发,这样的核心目的是为了保护后台服务对客户端不可见。我们之前演示的配置都基于反向代理的模式,实现各类服务的转发。

这样对于客户端来说,不需要知道各种后台服务,只需要向代理服务器发送请求即可,由代理服务器发出请求。

一般来说反向代理中代理服务器和后台服务是一伙儿的,绑定在一起。

一句话:客户端不知道自己实际请求的到底是谁
在这里插入图片描述

1.2 什么是正向代理

正向代理与反向代理相反,目的是为了隐藏客户端,也就是请求的发起者,让服务提供者感知到的是一个代理服务器,这样可以保护客户端的安全。一些对安全性要求较高的企业,可以基于正向代理实现安全隔离环境。

同时正向代理,也可以帮我们实现一种特殊的主备机制,这也是我们后续主要演示的。

一句话:服务器不知道实际请求自己的到底是谁

在这里插入图片描述

由于正向代码在前段开发中并不常用,这里只介绍一下概念,大家可以用到的时候去查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值