一、Nginx反向代理-负载均衡
首先通过SpringBoot+Freemarker
快速搭建一个WEB
项目:springboot-web-nginx,然后在该项目中,创建一个IndexNginxController.java
文件,逻辑如下:
java
@Controller
public class IndexNginxController {
@Value("${server.port}")
private String port;
@RequestMapping("/")
public ModelAndView index(){
ModelAndView model = new ModelAndView();
model.addObject("port", port);
model.setViewName("index");
return model;
}
}
在该Controller
类中,存在一个成员变量:port
,它的值即是从application.properties
配置文件中获取server.port
值。当出现访问/
资源的请求时,跳转前端index
页面,并将该值携带返回。
前端的index.ftl
文件代码如下:
java
<html>
<head>
<title>Nginx演示页面</title>
<link href="nginx_style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div style="border: 2px solid red;margin: auto;width: 800px;text-align: center">
<div id="nginx_title">
<h1>欢迎来到熊猫高级会所,我是竹子${port}号!</h1>
</div>
</div>
</body>
</html>
从上可以看出其逻辑并不复杂,仅是从响应中获取了port
输出。
OK~,前提工作准备就绪后,再简单修改一下nginx.conf
的配置即可:
java
upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2
server 192.168.0.000:8080 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.0.000:8090 weight=200 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {
location / {
root html;
# 配置一下index的地址,最后加上index.ftl。
index index.html index.htm index.jsp index.ftl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 请求交给名为nginx_boot的upstream上
proxy_pass http://nginx_boot;
}
}
至此,所有的前提工作准备就绪,紧接着再启动
Nginx
,然后再启动两个web
服务,第一个WEB
服务启动时,在application.properties
配置文件中,将端口号改为8080
,第二个WEB
服务启动时,将其端口号改为8090
。
最终来看看效果:
因为配置了请求分发的权重,8080、8090
的权重比为2:1
,因此请求会根据权重比均摊到每台机器,也就是8080
一次、8090
两次、8080
一次......
二、Nginx请求分发原理
客户端发出的请求192.168.12.129
最终会转变为:http://192.168.12.129:80/
,然后再向目标IP
发起请求,流程如下:
- 由于
Nginx
监听了192.168.12.129
的80
端口,所以最终该请求会找到Nginx
进程; Nginx
首先会根据配置的location
规则进行匹配,根据客户端的请求路径/
,会定位到location /{}
规则;- 然后根据该
location
中配置的proxy_pass
会再找到名为nginx_boot
的upstream
; - 最后根据
upstream
中的配置信息,将请求转发到运行WEB
服务的机器处理,由于配置了多个WEB
服务,且配置了权重值,因此Nginx
会依次根据权重比分发请求。