什么是反向代理?
先说一下什么是正向代理吧。
正向代理是代理的客户端。比如我们访问米国的网站,一般是需要挂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; #反向代理
}
}
}