反向代理与代理缓存的设置

什么是反向代理?

先说一下什么是正向代理吧。
正向代理是代理的客户端。比如我们访问米国的网站,一般是需要挂vpn才能访问的,vpn的作用是从我们的本土ip转到米国的ip,通过米国的ip再访问,等于中转了一层,但客户端并未感觉到,这就是正向代理。
那反向代理呢?反向代理就是代理服务器。我们访问一个网站,可能后面是多台服务器做的支持,请求被平均分配到各台服务器下去处理(负载均衡),但客户端并未感觉到,这就是反向代理。
好啦,说了这么多,看看如何实现吧。

nginx.conf

worker_processes 1;#进程数,一般是多少核就设置几个,默认是1
events {
  worker_connections  1024;  #最大连接数
}
http {
  upstream  node_server_pool {   #建立服务器池
      server localhost:3000;
      server localhost:3001;
  }
  server{
    listen    80;#监听端口号
    server_name  localhost;  #主机名
    location /  {
      proxy_pass  http://node_server_pool;  #反向代理
     }  
  }

}

从客户端来看,我们只并不知道3000和3001端口,只需访问80端口,也就是http://localhost即可。

server.js

写个node脚本做server。

require('http').createServer(function(req,res){
    res.end('hello'+process.argv[2])
}).listen(process.argv[2])

起两个端口号做服务器池:

>node server.js  3000
>node server.js  3001

然后再用客户端做测试,多次执行curl:

>curl localhost
>curl localhost
>curl localhost
>curl localhost
...

测试结果:

hello 3000
hello 3001
hello 3000
hello 3001
...

请求被均衡分配到两台服务器下面了。

反向代理如何做缓存?

这是个比较实际的问题。
请求进来后经过nginx都转发到下面其他的机器去了,缓存怎么搞呢?
很明显,缓存内容应该是放在nginx所在的那台主机的内存下,一旦命中可以直接返回缓存内容,避免继续穿透。
我们可以开启代理缓存proxy_cache选项来解决这件事。

proxy_cache  zone|off

proxy_cache默认是off关闭的,zone表示处理缓存的内存区域名称,比如:

proxy_cache hello_my_zone

这代表代理缓存开启,内存会划出一块命名为hello_my_zone的区域,专门处理缓存。
不过需要注意的是:
当检测到请求头Cache-Control为no-cache时,代理缓存就不会生效了。
开启了proxy_cache还不够,还需要定义一下缓存内容的存放路径。
语法:
proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size]
实例:

proxy_cache_path /data/nginx_cache/  levels=1:2 keys_zone=hello_my_zone:10m inactive=300s max_size=5g use_temp_path=off;

解释:
path设置缓存数据存放的路径;
levels设置目录层级,如levels=1:2表示两级子目录;
keys_zone表示内存的名字和大小,如keys_zone=hello_my_zone:10m,表示划出内存hello_my_zone是10m空间;
inactive是设置缓存多久失效,当硬盘上的缓存数据在该时间段内没有访问过,就会失效,该数据就会被删除,默认是10s;
max_size设置硬盘中最多可以缓存数据的大小,如果到达这个值,nginx会删除部分访问的数据;
use_temp_path为off时,表示不用临时存放缓存。
注意:
cache内存空间一般不会设置的太大,这块内存只是用来读取缓存目录的文件罢了。
我们把前面的反向代理配置加上代理缓存:

worker_processes 1;#进程数,一般是多少核就设置几个,默认是1
events {
  worker_connections  1024;  #最大连接数
}
http {
  upstream  node_server_pool {   #建立服务器池
      server localhost:3000;
      server localhost:3001;
  }
  #缓存文件的路径设置
  proxy_cache_path /data/nginx_cache/  levels=1:2 keys_zone=hello_my_zone:10m inactive=300s max_size=5g use_temp_path=off;
  server{
    listen    80;#监听端口号
    server_name  localhost;  #主机名
    location /  {
      proxy_cache  hello_my_zone;#开启代理缓存
      proxy_pass  http://node_server_pool;  #反向代理
     }  
  }

}

随着存储的缓存内容不断增多,可能会有磁盘不够用的现象,这时可以采用分割磁盘的方式解决:

worker_processes 1;#进程数,一般是多少核就设置几个,默认是1
events {
  worker_connections  1024;  #最大连接数
}
http {
  upstream  node_server_pool {   #建立服务器池
      server localhost:3000;
      server localhost:3001;
  }
  #缓存文件的路径设置
  proxy_cache_path /path/cache/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
  proxy_cache_path /path/cache/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
  #分割文件
  split_clients $request_uri $my_cache {
    50%   "my_cache_hdd1";
    50%   "my_cache_hdd2";
}
  server{
    listen    80;#监听端口号
    server_name  localhost;  #主机名
    location /  {
      proxy_cache  $my_cache;#开启代理缓存
      proxy_pass  http://node_server_pool;  #反向代理
     }  
  }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容