反向代理

实例 1

实现效果

打开浏览器,输入地址,跳转到 Linux 的 Tomcat 的主页面中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJ2SPnY3-1595072583222)(https://i.loli.net/2020/07/18/mcLFe9oyCOBHqkT.png)]

准备工作

安装 Tomcat,使用默认端口 8080。

下载、解压、运行 /bin/startup.sh 即可。

开放防火墙的 8080 端口,重启防火墙。

验证完了 tomcat 安装好后,可以关闭 8080 端口。

firewall-cmd --zone=public --remove-port=8080/tcp --permanent

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PDCpfxD-1595072583223)(https://i.loli.net/2020/07/18/YDROMrLmEx9nbXe.png)]

配置 nginx

保存配置文件,reload 即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVxDByCo-1595072583224)(https://i.loli.net/2020/07/18/bqHJYkBIuiShpyL.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5YYLXQf-1595072583225)(https://i.loli.net/2020/07/18/e7Lk2ZKFScPEoHs.png)]

实例 2

实现效果

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中

nginx 监听端口 80

访问 http://ip/edu/ 跳转到 127.0.0.1:8080

访问 http://ip/vod/ 跳转到 127.0.0.1:8081

准备工作

创建两个 tomcat 服务器,一个 8080,一个 8081(修改配置文件),复制两个 tomcat 文件夹,启动 tomcat。

创建文件夹和测试页面,放在 tomcat 下的 webapps 目录下即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UoEP9anC-1595072583226)(https://i.loli.net/2020/07/18/zCoLsqmXMfb6av7.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDQO7YrR-1595072583226)(https://i.loli.net/2020/07/18/cvThDunSd5bOEak.png)]

配置 nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsQSFtwu-1595072583227)(https://i.loli.net/2020/07/18/8f2DHsAbJymSuKh.png)]

= 用户不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

~ 用于表示 uri 包含正则表达式,并且区分大小写。

~* 用于表示 uri 包含正则表达式,不区分大小写。

^~ 用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zn7B31hH-1595072583228)(https://i.loli.net/2020/07/18/XTy8t2vsuOE9Z7a.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNkKZh1o-1595072583229)(https://i.loli.net/2020/07/18/IpdMPTfH5zC7ay3.png)]

负载均衡

Linux 下提供负载均衡的东西有:Nginx、LVS、Haproxy 等。

nginx 提供的几种负载均衡分配策略:

  • 轮询(默认)
    每个请求按时间顺序逐一分配到不同的服务器上,如果后端 down 掉,就自动剔除。
  • weight
    权重,默认权重为 1,权重越高被分配的客户端越多。
    指定轮询几率,weight 和访问比例成正比,用于后端服务器性能不均的情况。
    配置方式就是:
upstream myserver {
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
}
  • ip_hash
    每个请求按 ip 的 hash 结果分配,这样每个访客固定一个后端服务器,可以解决 session 共享的问题。
upstream myserver {
	ip_hash;
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
}
  • fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
	fair;
}

实现效果

浏览器输入地址,负载均衡效果,访问平均到 8080 和 8081 中。

准备工作

两台 tomcat 服务器,8080 和 8081,创建统一的页面 edu/a.html。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQBt62gD-1595072583230)(https://i.loli.net/2020/07/18/C6leUZYzGxBIWfb.png)]

配置 nginx

http 块中配置 upstream,在 location 中增加 proxy_pass。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scgRAQqG-1595072583230)(https://i.loli.net/2020/07/18/US5CeJZGDjyd614.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyZTch6b-1595072583231)(https://i.loli.net/2020/07/18/JBWfYczj2w4T9Cm.gif)]

动静分离

什么是动静分离?

简单来说就是动态和静态请求分来,不能理解成知识单纯的把动态页面和静态页面物理分离。

严格来说是动态请求跟静态请求分开,可以理解成用 nginx 处理静态页面,tomcat 处理动态页面。

动静分离从目前实现角度来说大致分为 2 种。

  1. 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流的方案。

nginx 源 nginx 源端口_linux

  1. 动态和静态文件混合在一起发布,通过 nginx 分开。
    通过 location 指定不同的后缀实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。具体 expires 定义:是给一个资源设置一个过期时间,无需去服务端验证,直接通过浏览器自身确认是否过期即可,不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 expires 来缓存),我这里设置 3d,表示 3 天内访问这个 url,发送一个请求,比对服务器该文件最后更新时间有没有变换,没有变化则不从服务器专区,返回状态码 304,如果有修改,直接从服务器重新下载,返回状态码 200。

准备工作

准备静态资源,等会访问。

[root@centos-7 data]# ls image/
1.jpg
[root@centos-7 data]# ls www/
a.html
[root@centos-7 data]# pwd
/data
[root@centos-7 data]#

配置 nginx

当然,要加 expires 也是在 location 中加入。


nginx 源 nginx 源端口_centos_02

nginx 源 nginx 源端口_linux_03

高可用配置

如果只有一个 nginx 来做代理,挂了怎么办?

nginx 可以做主备使用的方案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHdLnRmk-1595072583232)(https://i.loli.net/2020/07/18/QTLFAbEijPn86Go.png)]

这两个 nginx 都需要需要用到 keepalived。

这两个 nginx 对外需要提供一个虚拟 ip。

准备工作

1、需要两台 nginx 服务器

2、需要在两台服务器上安装 keepalived

yum install keepalived

查看是否安装好

[root@centos-7 nginx]# rpm -q -a keepalived
keepalived-1.3.5-16.el7.x86_64

默认的 keepalived 配置在 /etc/keepalived/keepalived.conf

3、需要虚拟 ip

高可用配置

主要修改 keepalived 的配置文件。

配置文件如下文,注意有的 keeplived 使用 shell 来检测的,shell 脚本如下文。

然后将两台服务器上的 nginx 和 keepalived 都启动。

启动 keepalived

systemctl start keepalived.service

然后通过虚拟 IP 访问,虚拟 IP 在 keepalived 的配置文件中的虚拟ip。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]; then
	/usr/local/nginx/sbin/nginx
  sleep 2
  if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
  	killall keepalived
  fi
fi
! Configuration File for keepalived

# 全局定义
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL   # 服务器的名字,这个就是全局的唯一值,在 /etc/hosts 中,也可以随便
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 虚拟 ip 配置
vrrp_instance VI_1 {
    state MASTER  # 备份服务器上将这里改为 BACKUP
    interface eth0 # 网卡,
    virtual_router_id 51  # 主、备机器的 virtual_router_id 必须相同,唯一标识
    priority 100  # 主、备机器取不同的优先级,主机值较大,备份机器较小
    advert_int 1 # 时间间隔,每隔多少秒发送一个心跳
    authentication {  # 权限校验方式,用的是 pass,密码是 1111
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {  # VRRP H 虚拟地址,也可以绑定一个ip
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

# 如果使用 shell 脚本的方式检测,取消注释如下配置
vrrp_script chk_http_port {
  script "/usr/local/src/nginx_check.sh"  # 上文中的 shell 路径
  interval 2  # 检测脚本执行的间隔
  weight 2  # 权重,比如 -20 当脚本条件成立,当前主机的权重降低 20
}
# 如果不使用上面的这个 vrrp_script 就使用下面的配置

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

EOF