用Nginx搭建一个具有缓存功能的反向代理服务

1.安装openresty

1.获取资源
wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
2.解压
tar -xvf openresty-1.17.8.2.tar.gz
3.配置
cd openresty-1.17.8.2
./confugure
4.编译与安装
make
su make install

目标目录:
/usr/local/openresty/nginx/sbin/nginx

2. 设置

/sbin/iptables -L -n 查看防火墙等信息
 firewall-cmd --add-port=8080/tcp --permanent  添加8080端口通过防火墙
 firewall-cmd --query-port=8080/tcp            查看8080端口是否通过防火墙
  

3.设计

1.将nginx那个配置文件配置成一个上游的服务器,
2.将openresty里面的nginx配置文件配置成负责反向代理的服务器,从而实现反向代理的功能.
3.缓存的实现则涉及到proxy_cache_path的模块,根据相应的规则进行配置即可.

下面的配置中第一个是被代理的服务器(上游服务器),第二个是代理服务器.
测试缓存功能的时候,将上游服务器关闭之后,还能继续访问资源.

 

 

 

 

 

4.关于 proxy_cache_path模块



    Nginx的http_proxy模块,类似于Squid的缓存功能,使用proxy_cache_path来配置.Nginx对访问过的内容在Nginx服务器本地建立
副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginix服务器与后端
服务器之间的网络流量,减轻网络拥塞,同时还能减小数据传输延迟,提高访问速度。同时,当后端服务器宕机时,Nginx服务器上的副
本资源还能够回应相关的用户请求,这样能够提高后端服务器的可用性。

}

配置项说明如下:

/tmp/nginxcache #本地路径,用来设置Nginx缓存资源的存放地址,指定缓存位置、缓存名称、内存中缓存内容元数据信息大小限制、
缓存总大小限制.缓存位置是一个目录应该先创建好,nginx并不会帮我们创建这个缓存目录

levels          #默认所有缓存文件都放在同一个/tmp/nginxcache下,但是会影响缓存的性能,因此通常会在/tmp/nginxcache下
面建立子目录用来分别存放不同的文件.假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,
那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/tmp/nginxcache/0/6d目录中

key_zone        #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个
request是否命中缓存,1m可以存储8000个key,10m可以存储80000个key

max_size        #最大cache空间,如果不指定,会使用掉所有磁盘空间,当达到配额后,会删除最少使用的cache文件

inactive        #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程
序会删掉文件。inactive默认是10分钟,需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,
但不会被删除,inactive是删除指定时间内未被访问的缓存文件

use_temp_path   #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,官方建议为off,
避免文件在不同文件系统中不必要的拷贝

proxy_cache     #启用proxy cache,并指定key_zone. 另外,如果proxy_cache off表示关闭掉缓存.


缓存的其他知识:
Nginx缓存的一些其他知识
(1)proxy_cache_use_stale增强站点容错能力
源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求:
location / {
    ...
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}
如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,
则会将这些陈旧版本的文件而不是错误信息发送给客户端。
(2)多磁盘分割缓存
         使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。
proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/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 {
    ...
    location / {
        proxy_cache $my_cache;
        proxy_pass http://my_upstream;
    }
}

 例子中的两个proxy_cache_path定义了两个缓存(my_cache_hdd1和my_cache_hd22)分属两个不同的硬盘。split_clients配置部分指定了请求结果的一半在my_cache_hdd1中缓存,另一半在my_cache_hdd2中缓存。基于$request_uri(请求URI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI的请求结果通常会被缓存在同一个缓存中。
(3)缓存命中情况的Nginx变量$upstream_cache_status
$upstream_cache_status的可能值有:
MISS    —— 响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来
BYPASS  —— 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass,这个响应之后可能会被缓存起来
EXPIRED —— 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容
STALE   —— 内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale
UPDATING —— 内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置
REVALIDATED —— proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)
HIT —— 响应包含来自缓存的最新有效的内容

(4)http响应头Cache-Control
当在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,不允许代理对资源进行缓存。
         nginx对缓存的资源会设置一个key,NGINX生成的键的默认格式是类似于下面的NGINX变量的MD5哈希值:$scheme$proxy_host$request_uri,实际的算法有些复杂。 为了改变变量(或其他项)作为基础键,可以使用proxy_cache_key命令。例如,
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

缓存指令proxy_cache_valid
为不同的HTTP返回状态码的资源设置不同的缓存时长。
命令格式为:
proxy_cache_valid [code ...] time;
举例来说,
proxy_cache_valid 200 302 20m;    #响应码是200和302的资源,设置缓存时长为20分钟
proxy_cache_valid 404      2m;    #响应码是404的资源,设置的缓存的时长为2分钟
proxy_cache_valid 200 304 2m;     #说明对于状态为200和304的缓存文件的缓存时间是2分钟,两分钟之后再访问该缓存文件时,文件会过期,从而去源服务器重新取数据


清理缓存指令
proxy_cache_purge


本部分内容引自http://www.osyum.com/article/show/176/~感恩

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值