反向代理和负载均衡
一、反向代理
nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。
nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不需要从后台服务器获取了。
但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFS、MFS分布式共享存储。
1.1 什么是代理?
说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;
此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程。
1.2 正向代理
我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家肯都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们。
这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
1.3 反向代理
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!
1.4 正反向代理结合
在实际生产项目中,大部分的就是正向代理和反向代理结合起来使用。
我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。
二、负载均衡
http proxy模块,功能很多,最常用的是proxy_pass和proxy_cache
如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清除指定的URL缓存。这个集成需要在安装nginx的时候去做
nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内。
2.1 nginx负载均衡的模式
**1.轮询(默认):**接收到的请求安装顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
**2.ip_hash:**每个请求按照发起客户端的IP的hash结果进行匹配,这样的算法下一个固定IP地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
2.2 nginx负载均衡案例
环境说明:
主机 | IP | 安装 | 系统 |
---|---|---|---|
nginx | 192.168.100.10 | nginx | CentOS-7 |
rs1 | 192.168.100.20 | httpd | CentOS-7 |
rs2 | 192.168.100.30 | httpd | CentOS-7 |
2.2.1 rs1和rs2主机部署好网页
# rs1
yum -y install httpd
echo RS1 > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
# rs2
yum -y install httpd
echo RS2 > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
2.2.2 nginx配置负载均衡
vim /usr/local/nginx/conf/nginx.conf
# 在http{}配置upstream
upstream webserver {
server 192.168.100.20;
server 192.168.100.30;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webserver;
}
nginx -s reload
2.2.3 测试访问
curl http://192.168.100.10

2.2.4 设置权重
vim /usr/local/nginx/conf/nginx.conf
# 在http{}配置upstream
upstream webserver {
server 192.168.100.20 weight=3;
server 192.168.100.30;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webserver;
}
nginx -s reload

2.2.5 ip_hash配置
vim /usr/local/nginx/conf/nginx.conf
# 在http{}配置upstream
upstream webserver {
ip_hash;
server 192.168.100.20;
server 192.168.100.30;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webserver;
}
nginx -s reload

2.2.6 动静分离
增加一台主机:192.168.100.200 部署tomcat,网页内容为Hello World
vim /usr/local/nginx/conf/nginx.conf
# 在http{}配置upstream
upstream webserver {
server 192.168.100.20;
server 192.168.100.30;
upstream tomcat {
server 192.168.100.200:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webserver;
}
location /test {
proxy_pass http://tomcat;
}
nginx -s reload

