Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
正向代理,举个例子:我们要访问github官网。但是由于网站在国外,我们访问不到,这个时候,我们可以购买一个服务器,这个服务器就是正向代理。
正向代理的概念:正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
反向代理,举个例子:我们访问淘宝的时候,会访问http://www.taobao.com。这个时候我们并不知道具体访问的是哪个服务器(比如淘宝布了n个服务器),但是依然可以返回我们想要的数据。这个代理就是反向代理。
反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires:7d
}
启用gzip压缩可以有效减小传输文件的大小,提升页面加载速度。在Nginx配置文件中,可以使用gzip指令来开启gzip压缩。
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain text/css application/javascript;
gzip_vary on;
比如有个需求,对于状态码200的响应,缓存保留5分钟;对于404的响应,缓存保留1分钟。
http {
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 5m;
proxy_cache_valid 404 1m;
}
}
这个配置启用了一个名为"my_cache"的缓存区,并将其设置在"/path/to/cache"路径中。这里还设置了缓存过期时间,对于状态码200的响应,缓存保留5分钟;对于404的响应,缓存保留1分钟
HTTP模块:用于进行http协议信息的一些配置
EVENT模块:用于nginx工作模式的配置
MAIL模块:模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。
Nginx实践
API网关是一个服务器,是系统对外的唯一入口。H5、APP、PC访问的统一入口。
且提供统一的路由方式。
1 同一对外接口,比如app,网站,客户端都通过网关来访问服务。
2 可以进行统一鉴权。
3 服务限流
4 全链路跟踪
路由断言工厂RoutePredicateFactory包含的主要实现类如图所示,包括Datetime、请求的远程地址、路由权重、请求头、Http地址、请求方法、请求路径和请求参数等类型的路由断言。
Datetime–AfterRoutePredicateFactory
spring:
cloud:
gateway:
enabled: true
routes:
- id: app-service001 /**路由唯一ID**/
uri: http://localhost:9000 /** 目标URI**/
predicates: /**断言,为真则匹配成功**/
/**匹配亚洲上海时间 2021-11-29:17:42:47 以后的请求**/
- After=2021-11-29T17:42:47.000+08:00[Asia/Shanghai]
- Path=/app1/** 配置规则Path,如果是app1开头的请求,则会将该请求转发到目标URL**/
同样BeforeRoutePredicateFactory
是在某个时间之前执行。
BetweenRoutePredicateFactory
有两个参数,datetime1、datetime2 (Java ZonedDateTime)。匹配发生在 datetime1之后和datetime2之前的请求
。
CookieRoutePredicateFactory
CookieRoutePredicateFactory可以接收两个参数,一个是 Cookie 名称,一个是
正则表达式
,路由规则会通过获取对应的 Cookie 名称值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
以下路由匹配具有名为chocolate的cookie,且该 cookie的值以 ch.p开头的请求。
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=chocolate, ch.p
HeaderRoutePredicateFactory
一个 header 中属性名称和一个
正则表达式
,这个属性值和正则表达式匹配则执行。
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
HostRoutePredicateFactory
HostRoutePredicateFactory 接收一组参数,
一组匹配的域名列表
。它通过参数中的主机地址作为匹配规则。
以下配置表示消息头中的Host以somehost.org或者anotherhost.org结尾则会匹配转发。
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.org
MethodRoutePredicateFactory
MethodRoutePredicateFactory 需要methods的参数,
它是一个或多个参数
,使用HTTP方法来匹配。
如果请求方法是GET或POST,则此路由匹配。
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
PathRoutePredicateFactory
PathRoutePredicateFactory接收一个匹配路径的参数。使用请求路径来匹配。
如果请求路径是,例如:/red/1、 /red/1/、 /red/blueor、/blue/green ,则此路由匹配。
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
QueryRoutePredicateFactory
QueryRoutePredicateFactory接受两个参数,请求参数和可选的regexp(Java正则表达式)。
以下配置表示,必须包含一个名为green的参数,并且其值匹配正则表达式 gree.。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://example.org
predicates:
- Query=green,gree.
WeightRoutePredicateFactory
WeightRoutePredicateFactory有两个参数:group 和 weight(一个int数值)。权重是按组计算的。
该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发到weightlow.org。
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
过滤器将会对
请求
和响应
进行处理.。比如添加参数、URL重写等。
局部过滤器过滤单个路由,全局过滤器过滤整体路由。
AddRequestHeader
将X-Request-red:blue消息头添加到所有匹配请求的下游
请求消息头中
。
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-red, blue
AddRequestParameter
red=blue添加到下游
请求参数中
。
spring:
cloud:
gateway:
routes:
- id: add_request_parameter_route
uri: https://example.org
filters:
- AddRequestParameter=red, blue
AddResponseHeader 同样如此
DedupeResponseHeader
DedupeResponseHeader 剔除重复的响应头,接受一个name参数和一个可选strategy参数。name可以包含以空格分隔的标题名称列表。
如果网关 CORS 逻辑和下游逻辑都添加了响应头Access-Control-Allow-Credentials和Access-Control-Allow-Origin响应头的重复值,这将删除它们。
spring:
cloud:
gateway:
routes:
- id: dedupe_response_header_route
uri: https://example.org
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
RedirectTo
RedirectTo需要两个参数,status和url。该status参数应该是300系列HTTP重定向代码,如301,url参数应该是一个有效的URL。这是消息头的Location值。
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- RedirectTo=302, https://acme.org
在之前的案例中,我们的路由都是写在配置文件中的,在微服务架构中,后台有很多个,如果每一个都需要配置,那么肯定是不现实的,所以Spring Cloud Gateway提供了基于注册中心服务发现机制的动态路由。
Spring Cloud Gateway支持与Eureka、Nacos、Consul等整合开发,根据service ld自动从注册中心获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例时不用修改Gateway的路由配置。
后面的文章将具体介绍
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedHeaders: "*"
allowedMethods: "*"
default-filters:
- DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST