反向代理
反向代理指的是以代理服务器接收用户的的访问请求,代理用户向内部服务器重新发起请求,最后把内部服务器的响应信息返回给用户。这样,代理服务器对外就表现为一台服务器,而访问内部服务器的客户端用的就是代理服务器,而不是真实网站访问用户。
为什么使用反向代理
可以起到保护网站安全的作用,因为任何来自 Internet 的请求都必须先经过代理服务器。
通过缓存静态资源,加速 Web 请求。
实现负载均衡
反向代理例子
环境说明
假如有 AB 两个服务器。A 服务器提供 web 资源,并且只给内网访问。B 服务器有两块网卡,一块与 A 服务器在一个内网,以块是外网。此时,用户 C 想直接访问 A 服务器是行不通的。这时就可以通过 B 服务器代理用户 C 的请求去访问 A 服务器了。
hostname
网卡
IP
说明
moli-04
ens33
192.168.30.6
内网 IP,代理服务器
moli-04
ens37
192.168.93.129
外网 IP,代理服务器
moli-05
ens33
192.168.30.7
内网服务器
两台机器都安装 nginx
moli-05 服务器访问是 wordpress 博客,域名 blog.syushin.org
虚拟机实验环境,就都关闭防火墙了
配置虚拟主机 moli-04 机器上编辑虚拟主机配置文件,内容如下:
[root@moli-04 extra]$ cat blog.syushin.org.conf
server{
listen 80;
server_name blog.syushin.org;
location / {
proxy_pass http://192.168.30.7;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
更改 hosts 文件 windows 上修改 hosts 文件,添加配置
192.168.93.129 blog.syushin.org
浏览器测试
访问地址是 192.168.93.129,出现的界面的 05 机器的页面,配置成功。
负载均衡
负载均衡的功能
对用户的访问请求进行调度管理
对用户的访问请求进行压力分担
负载均衡集群在运行时,一般是通过一个或者多个前端负载均衡器将客户访问请求发到后端的一组服务器上。
Nginx 负载均衡
严格来说,Nginx 仅仅是作为 Nginx Proxy 反向代理的使用的,但是因为这个反向代理功能表现的效果是负载均衡机器的效果,因此 nginx 负载均衡是特殊的反向代理。
实现 Nginx 负载均衡的主要组件:
Nginx 模块
说明
ngx_http_proxy_module
proxy 代理模块,用于把请求发送给服务器节点或 upstream 服务器池
ngx_http_upstream_module
负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
upstream 模块介绍
ngx_http_upstream_module 模块支持的代理方式有 proxy_pass,fastcgi_pass 等,主要使用 proxy_pass。
upstream 模块允许 nginx 定义一组或多组节点服务器组,使用时通过 proxy_pass 代理把网站的请求发送到定义好的对应的节点组中。
示例:创建节点服务器池
upstream blog {
server 192.168.30.5:80 weight=5;
server 192.168.30.6:81 weight=10;
server 192.168.30.7:82 weight=15;
}
upstream:创建节点服务器组的关键字,必须有;blog:节点服务器组的名字,必须有,可自定义名字;server:关键字,后面可加 IP 或者域名或者 IP: 端口,不指定端口默认 80;weight:权重,数值越大被分配的请求越多。默认为 1
设置节点服务器的状态值除了 weight 之外,还有:max_fails:允许请求失败的次数默认为 1. 当超过最大次数时,返回 proxy_next_upstream 模块定义的错误.fail_timeout:max_fails 次失败后,暂停的时间。down:表示当前的节点服务器不参与负载,标志机器永远不可用,可配合 iP_hash 使用 backup:其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。
使用域名的 upstream
upstream blog2{
server www.syushin.com weight=5;
server blog.syushin.org down;
server blog.syushin.cc backup;
}
调度算法
rr 轮询(默认调度算法,静态调度算法)
按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器。
wrr(权重轮询,静态调度算法)在 rr 轮询的基础上加上权重,使用该算法的时候,权重和用户访问成正比,权重值越大,被转发的请求就越多。比如有 30 个请求,2 台服务器 A(10.0.0.1)和 B(10.0.0.2),如果希望 A 处理 10 个请求,B 处理 20 个请求,可以这样定义:
upstream pools{
server 10.0.0.1 weight=1;
server 10.0.0.2 weight=2;
}
ip_hash(静态调度算法)每个请求按客户端 IP 的 hash 结果分配,当新的请求到达,先将客户端 IP 通过哈希算法哈希出一个值,在随后的分配客户端请求中,客户 IP 的哈希值只要相同,就会被分配到同一台服务器。
upstream blog_pool{
ip_hash;
server 192.168.30.5:80;
server 192.168.30.6:8090;
}
注意:当使用 ip_hash 时,不能有 weight 和 backup。
least_conn 算法 least_conn 算法会根据后端服务器的连接数来觉得分配情况,哪台服务器连接数最少就分发多的请求。
调度算法除了上面所列的 (常用) 还有很多,就不一一列举了。
http_proxy_module 模块
http_proxy_module 可以将请求转发到另外一台服务器,在反向代理中,会通过 location 功能匹配指定的 URI,然后把收到符合匹配的 URI 的请求通过 proxy_pass 抛给定义好的 upstream 节点池。
http_proxy 模块参数
参数
说明
proxy_set_header
设置 http 请求 header 项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实 IP 地址
client_body_buffer_size
用于指定客户端请求主体缓冲区大小
proxy_connect_timeout
表示反向代理后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout
表示代理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完所有数据,否则 nginx 将断开这个连接
proxy_read_timeout
设置 nginx 从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx 等待后端服务器的响应时间,其实是 nginx 已经进入后端的排队之中等候处理的时间
proxy_buffer_size
设置缓冲区大小,默认该缓冲区大小等于指令 proxy_buffers 设置的大小
proxy_buffers
设置缓冲区的数量和大小,nginx 从代理的后端服务器获取的响应信息,会设置到缓冲区
proxy_busy_buffers_size
用于设置相同很忙时可以使用的 proxy_buffers 大小,官方推荐的大小为 proxy_buffers * 2
proxy_trmp_file_write_size
指定 proxy 缓存临时文件的大小