代理服务器
代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这
个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络
代理功能。一般认为代理服务有助于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代
理、反向代理及透明代理。
代理服务器的类型:
1、正向代理服务器(标准代理服务器)
目的:内网的服务器通过代理服务器,然后能够访问外网的服务器
原理:内网用户将请求发给代理服务器,代理服务器根据用户需求,向真正的web服务器发出请求,然后获取到网页内容之后,在本地缓存然后发给用户。
缺点:需要用户对浏览器进行设置
2、透明代理服务器
目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
3、反向代理服务器(反向加速服务器)
目的:外网客户端通过代理服务器,能够访问内网服务器的资源
原理:外网客户端访问正常的域名或者IP,其实访问的是代理服务器,代理服务器帮助客户端请求页面,在代理服务器上缓存,然后再发送给客户端。
反向代理(7层)
反向代理(七层)
配置反向代理
一、ngx_http_proxy_module模块的 proxy_pass 指令
proxy_pass是反向代理最核心的指令。代理时,后面如果有路径,将替换location部分;否则,将所有路径拼接到后面。
例:访问URL:http://192.168.10.11/static/index.html
配置1:
location /static/ {
proxy_pass http://192.168.10.12; # 后面不接任何路径,所有URL路径将被拼接到后面
}
将被代理到:http://192.168.10.12/static/index.html
配置2:
location /static/ {
proxy_pass http://192.168.10.12/;
}
将被代理到:http://192.168.10.12/index.html
配置3:
location /static/ {
proxy_pass http://192.168.10.12/abc;
}
将被代理到:http://192.168.10.12/abcindex.html
配置4:
location /static/ {
proxy_pass http://192.168.10.12/abc/;
}
将被代理到:http://192.168.10.12/abc/index.html
总结
- 当proxy_pass指令后面不带URI时,将把所有的原始URI拼接到代理后的服务器上;
- 当proxy_pass指令后面带URI时,将替换掉匹配的URI;
- 当使用正则匹配时,proxy_pass指令后面不应带URI。
负载均衡
负载均衡
该功能由ngx_http_upstream_module + ngx_http_proxy_module模块提供
当我们把后端服务器换成后端服务器组后,此代理服务器便成了负载均衡调度器
服务器组的配置
使用 upstream 指令配置服务器组,一个 http 块中可配置多个服务器组。
语法: upstream name { … }
默认: —
语境: http
示例:定义一个服务器组 backend , 由四台后端服务器组成:
...
upstream backend {
server 192.168.10.11 weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 192.168.10.12;
server 192.168.10.13 backup;
}
...
定义后端真实服务器使用 server 指令
语法: server address [参数];
默认: —
语境: upstream
address:后端服务器 ipaddress:port。如果后端服务器使用默认端口,则可省略 :port
参数:
weight=N 定义权值,默认为1
max_conns=N 限制最大连接数
backup 备用服务器,当所有主服务器都宕机后才会起用
down 不起用的服务器
max_fails=N 认为后端服务器失效的连接失败次数
fail_timeout=Ns 心跳检测响应超时秒数,超过这个时间未响应则认为失败
配置负载均衡
示例:
...
server {
...
location / {
proxy_pass http://backend; # 将请求代理到服务器组中,即负载均衡
}
...
}
...
Nginx调度算法
Nginx 调度算法有很多,除官方提供的多种调度算法外,也有很多第三方模块提供支持。
轮循
将所有的请求平均调度到后端所有的服务器上,不考虑服务器之间的差异及后端服务器的真实负载情况,是一种静态策略
示例:
upstream backend {
server 192.168.10.12;
server 192.168.10.13;
}
示例
准备两台机器,同时再服务器端配置nginx(端口80)和Apache(端口改为90)两个服务器
192.168.10.10:80 Nginx
192.168.10.10:90 Apache
192.168.10.11 代理服务器
在服务器端安装httpd
更改apache端口避免重复
把apache的端口改为90,别忘了echo apache 和nginx到各自的index.html文件里面
然后再代理服务器端(nginx端)
使用upstream
标明server,并配置 proxy_pass
测试并重启
curl
一下,实现负载均衡
加权轮循
将后端服务器设置为不同的权值,权值高的服务器承担更多的负载,不考虑后端服务器的真实负载情况,是一种静态策略
示例:
upstream backend {
server 192.168.10.12 weight=1;
server 192.168.10.13 weight=2;
}
在上述配置的情况下,我们增加服务器端nginx的权重为2
重启后curl一下
发现2次nginx1次apache
- ip_hash
根据客户端ip的前三个字节的hash值进行调度,可实现把同一客户端的请求调度到同一台后端服务器上
示例:
upstream backend {
ip_hash;
server 192.168.10.12;
server 192.168.10.13;
}
- least_conn
将请求传递到活动连接数最少的服务器,同时考虑服务器的权重。如果有多个这样的服务器,则使用加权循环平衡方法轮流尝试它们。
示例:
upstream backend {
least_conn;
server 192.168.10.12 weight=1;
server 192.168.10.13 weight=2;
}
-
hash key
根据自定义 key 的 hash 值进行调度。该 key 可以包含文本,变量,以及它们的组合。
请注意,从组中添加或删除服务器可能会导致将大多数密钥重新映射到不同的服务器。 -
random
语法:random [two [method]]
将请求传递到随机选择的服务器,同时考虑服务器的权重。
可选two参数指示 nginx 随机选择两个服务器,然后使用指定的method. 默认方法是least_conn 将请求传递给活动连接数最少的服务器。
该指令出现在 1.15.1 版中。
以下为常用第三方提供的调度算法
7. url_hash
按访问URL的hash值进行调度,可实现同一个URL访问到同一台服务器。适用于后端服务器为缓存服务器。
url_hash需要安装第三模块ngx_http_upstream_hash_module
- fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
fair需要安装第三方模块ngx_http_upstream_fair_module
Reference
- 课堂笔记