Nginx
一. 反向代理服务器
正向代理:首先客户端需要配置,代理服务器代替客户端发送请求,站在目标服务器的角度,它是不知实际的客户端是谁,它只认为代理服务器是客户端。
反向代理:客户端不需要做任何的设置,代理服务器只是将请求转发给目标服务器,站在客户端的角度,不知道目标服务器是谁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBZdAPtQ-1677662948981)(images/正向代理.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvueu2VK-1677662948983)(images/反向代理.jpg)]
二. Nginx的三个应用场景
2.1 静态资源服务器
所谓的静态资源服务器,就是将一些静态资源直接放到nginx对应的路径中,可以直接访问最经典的应用场景就是部署前端项目,配置如下:
# 用户访问根路径的时候,默认访问 L:/other-location 这个路径下 a.html 文件
location / {
root L:/other-location;
index a.html;
}
2.2 作为反向代理服务器
2.2.1 代理多项目
在服务器上,只开放一个端口,但是需要定位到多个不同的项目,那么就可以使用代理来进行访问。
# 访问的前缀如果是 /demo1 会把请求转发到 http://localhost:8080/
location ^~ /demo1 {
proxy_pass http://localhost:8080/;
}
# 访问的前缀如果是 /demo1 会把请求转发到 http://localhost:8089/
location ^~ /demo2 {
proxy_pass http://localhost:8089/;
}
对于 proxy_pass 后的路径最后的
/
问题,分为两种情况:
- 如果后面带上斜杠,会自动将url地址中location前缀去掉,然后访问对应的项目,例如:http://localhost/demo1/da,请求到达 http://localhost:8080/的时候,路径就是 http://localhost:8080/da
- 如果后面带上斜杠,不会去掉location中的前缀,例如:http://localhost/demo1/da,请求到达 http://localhost:8080/的时候,路径就是 http://localhost:8080/demo1/da (这个可以在springboot项目中使用 server.servlet.context-path来指定项目前缀)
2.2.1 代理集群
http {
# 其他省略
# web是自定义的名字
upstream web {
ip_hash;
server localhost:8080;
server localhost:8081;
server localhost:8082;
}
server {
#其他省略
location ^~ /cluster {
# web要与upstream后面的只保持一致
proxy_pass http://web/;
}
}
}
集群配置有三种负载均衡策略:
- 轮询的方式,每个结群的节点默认访问两次;
- 权重方式,权重越大,处理的请求越多;
- ip_hash,同一个ip所有的请求都会打到同一台集群节点上。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pez3RLIJ-1677662948984)(images/load-balance.jpg)]
2.3 做IP限流
可以使用Nginx限制用户的访问,例如每秒只能访问固定的次数,具体配置如下:
第一步,在 http 模块下添加如下的配置
# 1.limit_req_zone 是nginx提供的一个功能,是用来做ip访问次数限制的配置
# 2.$binary_remote_addr 也是nginx内部提供的一个功能,自动帮我们去获取远程访问的地址
# 3. my_name: 表示给当前限流功能取了一个名字,例如nginx配置很多项目,不同的项目可能限流策略不同
# 4. 20m指的是信息存储的划分的内存大小;
# 5. rate 表示速率的意思;
limit_req_zone $binary_remote_addr zone=my_name:20m rate=1r/s;
# 可以配置很多个,通过不同的名字来加以区别
limit_req_zone $binary_remote_addr zone=one:20m rate=10r/s;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlFjTglY-1677662948985)(images/limit-req.jpg)]
第二部,在对应的location位置,加上如下的代码
# limit_req 是固定值
# zone=my_name 表示使用哪个限流配置
# burst=3 如果访问的次数操作限流次数,那么最多可以将3个请求缓存起来,然后按照指定的速率继续访问;可以不写
limit_req zone=one burst=3;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQin80x7-1677662948985)(images/req_limit-config.jpg)]
最多可以将3个请求缓存起来,然后按照指定的速率继续访问;可以不写
limit_req zone=one burst=3;
[外链图片转存中...(img-XQin80x7-1677662948985)]