反向代理
实例 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 种。
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流的方案。
- 动态和静态文件混合在一起发布,通过 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 可以做主备使用的方案。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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