代理与反向代理、负载均衡和缓存
如何实现服务器之间的协同功能呢?
通过Nginx提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度。
代理和反向代理
代理(正向代理,目标服务器不知道谁在访问)
位于客户端和目标服务器之间,起到一个中转的作用。其实就是客户端想访问目标服务器,但是因为某些原因不能够直接访问,则把请求和目标服务器发给代理服务器,代理服务器再去请求目标服务器,把返回的响应结果返回给客户端。
反向代理(用户实际并不知道最终服务器,只是访问一个反向代理服务器而已)
客户端会把反向代理服务器当成目标服务器,向反向代理服务器发送请求后,反向代理服务器再请求内部的后端服务器,把得到的响应结果返回给客户端。
特性:
- 安全性。反向代理具有安全性。能隐藏真实的内部服务器。
- 功能性。正向代理主要用途是为防火墙内的局域网用户提供访问外网的途径。反向代理主要用途是将防火墙内的服务器提供给外边的用户访问,同时也可以为多个后端服务器提供负载均衡功能、缓存功能等。
反向代理服务配置
在Nginx配置文件中的location块中,这是 proxy_pass
` 指令。
server{
listen 80;
server_name test.test;
#将本机接收到的test.test的请求全部转发到另外一台服务器192.168.78.128
location /{
proxy_pass http://192.168.78.128;
#下面是其他辅助指令
proxy_set_header Host $host; #更改来自客户端的请求头信息
proxy_set_header X-Real_IP $remote_addr; #用户真实访问ip
proxy_connect_timeout 2; #配置nginx与后端服务器建立连接的超时时间
proxy_read_timeout 2; #配置nginx向后端发出read请求的等待响应超时时间
proxy_send_timeout 2; #配置nginx向后端服务器发出write请求的等待响应超时时间
proxy_redirect http://www.baidu.com; #用于修改后端服务器返回的响应头中的Location和Refresh
}
}
负载均衡
负载均衡(load balance):就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度。
- 一个没有负载均衡的web架构如下图:
用户直接连接服务器,这个时候如果这台服务器挂了,那么就整个网站挂了。
- 有负载均衡的web架构
用户不直接访问后端服务器,而是访问负载均衡服务器,由负载均衡服务器再次转发到后端服务器。如果这个时候有一台后端服务器挂掉了,那么负载均衡服务器会剔除掉它,将后续请求都转发到好的那台,这样就不影响网站的正常运行。这个时候我们也需要考虑负载均衡服务器会不会挂掉,那就引入第二个负载均衡服务器来缓解一下。
负载均衡的配置
通过配置负载均衡服务器的Nginx中的
upstream
指令可以实现。
不同负载均衡配置的特点如下图所示:
配置方式 | 说明 |
---|---|
轮询方式(默认) | 每个请求按照时间顺序逐一分配到不同的后端服务器,如果有服务器宕机,会自动剔除。 |
权重方式(weight) | 利用weight制定轮询的权重比率,与访问率成正比,用于后端服务器性能不均的情况,性能好的服务器weight高一点。 |
ip_hash | 使每个访客固定访问一个后端服务器,这样可以解决session共享的问题。 |
第三方模块(fair、url_hash)nginx默认不包含第三方模块,使用时需要安装 | 第三方模块采用fair,按照每台服务器的响应时间来分配,响应时间短的优先分配。如果第三方模块采用的是url_hash,则安装url的hash值来分配。 |
一般轮询配置
server{
listen 80;
server_name test.test;
location / {
proxy_pass http://web_server; #反向代理
}
}
#配置负载均衡服务器组
upstream web_server {
server 192.168.78.128;
server 192.168.78.129;
}
加权轮询配置
#配置负载均衡服务器组
upstream web_server {
server 192.168.78.128 weight=1;
server 192.168.78.129 weight=3;
}
这里面的权值总和为一个循环,这里以4次为一个循环,那么就是每四次请求中,三次会被分派到129这个服务器,一次分配到128,但是具体三次并不会顺序执行,而是按照算法分散执行。
我们也可以设置每台web服务器在负载均衡调度中的状态。
upstream web_server{
server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2; #允许请求失败次数,在请求max_fail次数失败后,暂停服务的时间
server 192.168.78.200 backup; #预留的备份服务器
server 192.168.78.33 down; #当前服务器不参与负载均衡
}
ip_hash 配置
upstream web_server{
ip_hash;
server 192.168.78.120;
server 192.168.78.123;
server 192.168.78.33 down; #如果这台服务器宕机,则用down表示当前服务器暂不参与负载均衡
}
使用ip_hash的时候,不能使用weight和backup。
第三方模块(fair)
- 备份已安装的Nginx
由于使用第三方模块,需要重新编译Nginx,所以需要关闭已经开启的Nginx进程,对已经安装好的Nginx进行备份,便于恢复。
cp -r /usr/local/nginx /usr/local/nginx_old
- 重新编译安装Nginx
先从github获取fair模块,下载到zip到root目录下,解压。
unzip nginx-upstream-fair-master.zip #解压
mv nginx-upstream-fair-master nginx-upstream-fair #重命名
如果没有 unzip
命令,则需要用 yum install unzip
安装。
cd nginx-1.10.1
#配置
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/root/nginx-upstream-fair
#编译安装
make && make install
- 配置fair的负载均衡
打开新安装的Nginx配置文件,在 http
块下实现fair的负载均衡。
server{
listen 80;
server_name test.test;
location / {
proxy_pass http://web_server
}
}
upstream web_server{
server 192.168.78.128;
server 192.168.78.132;
fair; #使用fair
}
缓存配置
对于一些含有大量内容的网站来说,随着访问量的增多,对于经常被访问的内容,如果每一次都从服务器中获取,则给服务器很大的压力。所以我们可以利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。
原理
web缓存服务器位于内容源web服务器和客户端之间,当客户端访问一个url时,缓存服务器请求内容源服务器,并将响应结果缓存到内存或硬盘,当下一次请求同一个url时,缓存服务器直接将已缓存的内容输出给客户端,这样就减少了再次向内容源服务器请求的次数。
永久缓存配置(proxy_store)
Nginx提供了
proxy_store
指令用于缓存内容服务器响应到本地,若不手动删除,则一直存在。
server{
listen 80;
server_name test.test;
location / {
root cache; #制定个缓存文件的保存目录
proxy_store on; #开启本地缓存
proxy_store_access user:rw group:rw all:r; #设置缓存的读写规则
proxy_temp_path cache_tmp; #设置反向代理时接收的数据临时存储文件的目录,该目录会自动创建
#利用正则匹配缓存文件、目录或符号链接是否存在,如果不存在再执行块语句
if(!-e $request_filename){
proxy_pass http://192.168.78.128;
}
}
}
临时缓存(proxy_cache)
Nginx服务器提供了
proxy_cache
指令设置临时缓存。采用md5算法将请求链接进行hash后,根据具体配置生成缓存文件目录,保存响应数据。
在缓存服务器上配置 nginx.conf
中的 **http**
块。
#代理临时目录
proxy_temp_path /usr/local/nginx/proxy_temp_dir; #设置缓存服务器接收内容服务器响应内容使用的临时目录
#web缓存目录和参数设置
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50minactive=1m max_size=500m; #自定义保存目录,
配置 server
块:
server {
listen 80;
server_name test.test;
#增加两个响应头,用于获取访问的服务器地址与缓存是否成功
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location /{
proxy_cache cache_one; #设置缓存区域名称
proxy_cache_key $host$uri$is_args$args; #以域名、uri、参数组合成web缓存的key,nginx根据key值哈希
proxy_cache_valid 200 10m; #对200状态码设置缓存时间
proxy_cache_valid 304 1m;
proxy_cache_valid any 1m; #其他未设置的缓存1分钟
proxy_pass http://192.168.78.128;
}
}
缓存清理配置
因为Nginx不支持清理制定url的缓存,需要借助第三方模块来实现。例如ngx_cache_purge
- 备份已安装的Nginx
在添加 ngx_cache_purge 模块之前,关闭Nginx服务,备份已有的Nginx服务。
cp -r /usr/local/nginx /usr/local/nginx_old2
- 重新编译安装Nginx
在github获取 ngx_cache_purge zip包,并解压安装。
unzip ngx_cache_purge-master.zip
mv ngx_cache_purge-master /usr/local/ngx_cache_purge
#进入ngxin文件的解压目录配置一下
cd nginx-1.10.1
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/usr/local/ngx_cache_purge
#编译和安装
make && make install
- 配置缓存清理功能
使用
proxy_cache_purge
指令实现缓存清理。
注意:
- 指定的缓存区名称和proxy_cache_purge指令中出现的缓存区名称一致。
- key值设置规则要一致。
- 清理缓存的location的编写位置在所有location之前,防止其他正则location提前匹配。
location ~/purge(/.*){
allow 192.168.78.1;
deny all;
proxy_cache_purge cache_one $host$uri$is_args$args;
}
如果有什么错误的地方,希望大家能指出,一起学习进步。
本作品采用《CC 协议》,转载必须注明作者和本文链接
666666
8888888,66666666
:+1:
图文结合,简单易懂 :+1: :+1: :+1:
哈,简单易懂 没想象的那么难
正向代理是代理客户端,反向代理服务器端
proxy_set_header X-Real_IP $remote_addr; #用户真实访问ip
不加这个获取到的是代理服务器的ip吗正向代理和反向代理不都是用户不知道目标服务器的情况下,访问代理服务器吗?无非就是代理服务器是否将负载分配和一台服务器还是多台服务器,那这个正向和反向怎么想着是相同的
难道是正向代理是客户端创建的?而反向代理是服务器端创建的?
明白了
请问, 对于反向代理: 是否后端的所有服务在返回数据时,
@yz_well 是
学习了,感谢分享👍