共计 3392 个字符,预计需要花费 9 分钟才能阅读完成。
1. 前言
咱们实在的服务器不应该间接裸露到公网上去,否则更加容易泄露服务器的信息,也更加容易受到攻打。一个比拟“平民化”的计划是应用 Nginx 反向代理它。明天就来聊一聊应用 Nginx 反向代理的一些能力,Nginx代理能帮忙咱们实现很多十分无效的 API 管制性能。这也解释了我为什么始终举荐应用 Nginx 来代理咱们的 Spring Boot 利用。
2. Nginx 能够提供哪些能力
Nginx曾经不必太多的赞美了,它曾经失去了业界的宽泛认可。咱们就聊聊它具体可能实现什么性能。
2.1 代理能力
这是针对服务器端咱们最罕用的性能,一台具备公网的 Nginx 服务器能够代理和它能进行内网通信的实在的服务器。让咱们的服务器不间接对外裸露,减少其抗危险能力。
如果 Nginx 服务器 192.168.1.8
能够和同一内网网段的 192.168.1.9
的应用服务器进行通信,同时 Nginx 服务器具备公网能力并将公网绑定到域名 felord.cn
上。那么咱们 Nginx 代理的对应的配置(nginx.conf
)是这样的:
server {
listen 80;
server_name felord.cn;
# ^~ 示意 uri 以某个惯例字符串结尾,如果匹配到,则不持续往下匹配。不是正则匹配
location ^~ /api/v1 {
proxy_set_header Host $host;
proxy_pass http://192.168.1.9:8080/;
}
}
通过以上配置后咱们服务器实在的接口地址是 http://192.168.1.9:8080/foo/get
就能够通过 http://felord.cn/api/v1/foo/get
拜访。
proxy_pass如果以
/
结尾,就相当于是相对根门路,那么 Nginx 不会把 location 中匹配的门路局部代理走; 如果不以/
结尾,也会代理匹配的门路局部。
2.2 Rewrite 性能
Nginx还提供了一个 rewrite
性能让咱们在申请达到服务器时重写 URI, 有点相似Servlet Filter 的象征,对申请进行一些预处理。
在 2.1 的例子中如果咱们要实现如果判断申请为 POST 的话返回405,只须要更改配置为:
location ^~ /api/v1 {
proxy_set_header Host $host;
if ($request_method = POST){return 405;}
proxy_pass http://192.168.1.9:8080/;
}
你能够应用 Nginx 提供的全局变量 (如下面配置中的$request_method
) 或本人设置的变量作为条件,联合正则表达式和标记位(last
、break
、redirect
、permanent
)实现 URI 重写以及重定向。
2.3 配置 HTTPS
之前很多同学在群里问如何在 Spring Boot 我的项目中配置 HTTPS, 我都举荐应用Nginx 来做这个事件。Nginx比 Spring Boot 中配置 SSL 要不便的多,而且不影响咱们本地开发。Nginx中 HTTPS 的相干配置依据上面的改一改就能用:
http{
#http 节点中能够增加多个 server 节点
server{
#ssl 须要监听 443 端口
listen 443;
# CA 证书对应的域名
server_name felord.cn;
# 开启 ssl
ssl on;
# 服务器证书绝对路径
ssl_certificate /etc/ssl/cert_felord.cn.crt;
# 服务器端证书 key 绝对路径
ssl_certificate_key /etc/ssl/cert_felord.cn.key;
ssl_session_timeout 5m;
# 协定类型
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl 算法列表
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 是否 服务器决定应用哪种算法 on/off TLSv1.1 的话须要开启
ssl_prefer_server_ciphers on;
location ^~ /api/v1 {
proxy_set_header Host $host;
proxy_pass http://192.168.1.9:8080/;
}
}
# 如果用户通过 http 拜访 间接重写 跳转到 https 这个是一个很有必要的操作
server{
listen 80;
server_name felord.cn;
rewrite ^/(.*)$ https://felord.cn:443/$1 permanent;
}
}
这里就用到了 rewrite 来进步用户体验。
2.4 负载平衡
个别我的项目都是从小做到大起来的,起步的时候部署一个服务器就够用了,如果你的我的项目用户多了起来,首先祝贺你,阐明你的我的项目方向很对。然而随同而来还有服务器压力,你肯定不想服务器宕机带来的各种损失,你须要疾速进步服务器的抗压能力,或者你想不停机保护防止业务中断,这些都能够通过 Nginx 的负载平衡来实现,而且非常简单。如果 felord.cn
咱们部署了三个节点:
最简略的轮询策略
轮流派发申请,这种配置是最简略的:
http {
upstream app {
# 节点 1
server 192.168.1.9:8080;
# 节点 2
server 192.168.1.10:8081;
# 节点 3
server 192.168.1.11:8082;
}
server {
listen 80;
server_name felord.cn;
# ^~ 示意 uri 以某个惯例字符串结尾,如果匹配到,则不持续往下匹配。不是正则匹配
location ^~ /api/v1 {
proxy_set_header Host $host;
# 负载平衡
proxy_pass http://app/;
}
}
}
加权轮询策略
指定轮询几率,weight
和拜访比率成正比,用于后端服务器性能不均的状况:
upstream app {
# 节点 1
server 192.168.1.9:8080 weight = 6;
# 节点 2
server 192.168.1.10:8081 weight = 3;
# 节点 3
server 192.168.1.11:8082 weight = 1;
}
最终申请解决数将为 6:3:1 进行调配。其实简略轮询能够看作所有的权重均分为 1。轮询宕机可主动剔除。
IP HASH
依据拜访 IP 进行Hash,这样每个客户端将固定拜访服务器,如果服务器宕机,须要手动剔除。
upstream app {
ip_hash;
# 节点 1
server 192.168.1.9:8080 weight = 6;
# 节点 2
server 192.168.1.10:8081 weight = 3;
# 节点 3
server 192.168.1.11:8082 weight = 1;
}
起码连贯
申请将转发到连接数较少的服务器上,充分利用服务器资源:
upstream app {
least_conn;
# 节点 1
server 192.168.1.9:8080 weight = 6;
# 节点 2
server 192.168.1.10:8081 weight = 3;
# 节点 3
server 192.168.1.11:8082 weight = 1;
}
其它形式
咱们能够借助一些插件来实现其它模式的负载平衡,例如借助于 nginx-upsync-module 实现动静负载平衡。咱们是不是借助于此能够开发一个灰度公布性能呢?
2.5 限流
通过对 Nginx 的配置,咱们能够实现漏桶算法和令牌桶算法,通过限度单位工夫的申请数、同一时间的连接数来限度访问速度。这一块我并没有深入研究过这里就提一提,你能够查问相干的材料钻研。
3. 总结
Nginx十分弱小,举荐应用它来代理咱们的后端利用,咱们能够通过配置实现很多有用的性能,而不用进行一些非业务逻辑的编码来实现,如果你在 Spring Boot 中实现限流、配置 SSL 的话,麻烦不说,还影响本地开发,应用 Nginx 能够让咱们分心到业务中去。能够说 Nginx 在这里充当了一个小网关的作用,其实很多出名网关底层都是 Nginx,比方Kong、Orange、Apache APISIX 等,如果你有趣味能够玩一玩 Nginx 的高级状态 Openresty。另外我这里也有一份十分不错的Nginx 入门材料送给你,能够关注:码农小胖哥 回复 nginx 获取。
关注公众号:Felordcn 获取更多资讯
集体博客:https://felord.cn