反向代理

实例 1

实现效果

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

准备工作

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

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

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

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

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

配置 nginx

保存配置文件,reload 即可。

实例 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 目录下即可。

配置 nginx

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

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

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

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

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

负载均衡

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

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

  • 轮询(默认)

    每个请求按时间顺序逐一分配到不同的服务器上,如果后端 down 掉,就自动剔除。

  • weight

    权重,默认权重为 1,权重越高被分配的客户端越多。

    指定轮询几率,weight 和访问比例成正比,用于后端服务器性能不均的情况。

    配置方式就是:

    1
    2
    3
    4
    upstream myserver {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }
  • ip_hash

    每个请求按 ip 的 hash 结果分配,这样每个访客固定一个后端服务器,可以解决 session 共享的问题。

    1
    2
    3
    4
    5
    upstream myserver {
    ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    }
  • fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    1
    2
    3
    4
    5
    upstream myserver {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    fair;
    }

实现效果

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

准备工作

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

配置 nginx

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

动静分离

什么是动静分离?

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

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

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

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

  2. 动态和静态文件混合在一起发布,通过 nginx 分开。

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

准备工作

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

1
2
3
4
5
6
7
[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 可以做主备使用的方案。

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

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

准备工作

1、需要两台 nginx 服务器

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

1
yum install keepalived

查看是否安装好

1
2
[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。

1
2
3
4
5
6
7
8
9
#!/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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
! 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