NGINX反向代理缓存


反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理的作用
①保护网站安全:任何来自Internet的请求都必须先经过代理服务器。

简单来说,就是我们网站的所有的请求都要经过反向代理服务器,对反向代理服务器进行安全加固就能解决很大一部分的安全问题。

②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力;

可以在反向代理的服务器上缓存某些静态资源,这样的话在反向代理服务器上存在的资源就不用去web服务器上获取,以减轻web服务器的压力。

 

③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;

可以通过反向代理服务器把请求分发到不同服务器,减轻服务器的压力,还能防止网站某一台服务器挂掉之后,网站就无法访问的问题,做到网站的高可用,减少事故的发生。

 

反向代理缓存设置
一、在反向代理服务器的配置文件中加入:
位置: http段内

proxy_temp_path /data/nginx-temp;  #缓存临时文件路径

proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50m inactive=1m; #缓存保存的路径

 

* levels指定该缓存空间有两层hash目录,第一层目录为1个数字或者字母,第二层为2个数字或者字母

* keys_zone指的是缓存空间名称。 20m 为内存缓存空间大小

* max_size指的是缓存文件可以占用的最大空间。

* inactive指的是如果一个缓存文件多长时间不被访问,就会被删除。(天:d、秒:s、分:m)

 

二、配置的demo
DEMO:

//设置动态服务器的代理 【处理PHP任务】

upstream test {

        #ip_hash;    #[ 使用ip_hash分发 ]

        server 192.168.1.254:81 weight=2 ; #[ 设置这个服务器的权重为2 ]

        server 192.168.1.254:82;

}

//设置获取静态文件的代理

upstream static{

        server 192.168.1.254:81 ; #[ 静态服务器 ]

}

# 设置缓存目录 #

proxy_temp_path /data/nginx-temp; #[temp的目录]

proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50m inactive=1m;

#[ 设置缓存的路径为 /data/nginx-cache 层级为2级,第一级为1个字幕第二个为2个字母 缓存的空间名为 nginx-cache,缓存的内存空间为20M 最大空间为50M 1分钟内没有访问删除这个缓存  ]

# END #

server {

    listen 80;

    server_name _;

    access_log  logs/likang.default.access.log  main;

    error_log logs/error.log error;

 

    root /var/www/html/likang/default;

#设置反向代理

   location /{

        proxy_pass http://test;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   }

#设置静态图片

   location ~.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {

             #root /data/nginx-cache;  #[ 图片的根目录 ]

             proxy_redirect off;   #[关闭跳转]

             proxy_set_header Host $host;  #[ 设置header ]

             proxy_cache nginx-cache;  #[ 缓存的空间 -- 上边定义的  ]

             proxy_cache_valid 200 302 1h; #[ 不同http状态缓存时间不同 ]

             proxy_cache_valid 301 1d;

             proxy_cache_valid any 1m;

             proxy_ignore_headers Set-Cookie Cache-Control;

             proxy_hide_header Cache-Control;

             proxy_hide_header Set-Cookie;

             expires 30d;  #[告诉浏览器缓存有效期 -- 30天内可以直接访问浏览器缓存 ]

             proxy_pass http://static; #[文件不存在去那里获取]

   }

}

解决不缓存的问题:
1. nginx不缓存原因
默认情况下,nginx是否缓存是由nginx缓存服务器与源服务器共同决定的, 缓存服务器需要严格遵守源服务器响应的header来决定是否缓存以及缓存的时常。header主要有如下:

Cache-control:no-cache、no-store

如果出现这两值,nginx缓存服务器是绝对不会缓存的

Expires:1980-01-01

如果出现日期比当前时间早,也不会缓存。

2. 解决不缓存方案
2.1 方法一:

修改程序或者源服务器web程序响应的header

2.2 方法二:

nginx代理直接加上如下一句:

proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

 

或者:

proxy_ignore_headers Set-Cookie Cache-Control;

proxy_hide_header Cache-Control;

proxy_hide_header Set-Cookie;

 

 

扩展:学习nginx的Proxy Cache指令
1 proxy_cache

语法:proxy_cache zone_name;

默认值:None

使用字段:http, server, location

设置一个缓存区域的名称,一个相同的区域可以在不同的地方使用。

在0.7.48后,缓存遵循后端的”Expires”, “Cache-Control: no-cache”, “Cache-Control: max-age=XXX”以及其他等。然而,目前nginx会忽略一些缓存控制指令,如:”private”和”no-store”,同样,nginx在缓存过程中不会处理”Vary”头,为了确保一些私有数据不被所有的用户看到,后端必须设置 “no-cache”或者”max-age=0″头,或者proxy_cache_key包含用户指定的数据如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止缓存私有数据,所以可以分别指定location以便分开私有数据和公有数据。

缓存指令依赖代理缓冲区(buffers),如果proxy_buffers设置为off,缓存不会生效。

 

2 proxy_cache_key

语法:proxy_cache_key line;

默认值:$scheme$proxy_host$request_uri;

使用字段:http, server, location

指令指定了包含在缓存中的缓存关键字。

 

 

复制代码 代码如下:proxy_cache_key "$host$request_uri$cookie_user";

proxy_cache_key "$scheme$host$request_uri";

3 proxy_cache_path

语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

默认值:None

使用字段:http

指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中。缓存的文件名和key为代理URL的MD5 码。levels参数指定缓存的子目录数,例如:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

 

文件名类似于:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

所有活动的key和元数据存储在共享的内存区域中,这个区域用keys_zone参数指定,如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。

cache manager进程控制磁盘的缓存大小,在max_size参数中定义,超过其大小后最少使用数据将被删除。

区域的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节,当区域满了以后key将按照LRU(最近最少使用算法)进行处理。

proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。

 

4 proxy_cache_methods

语法:proxy_cache_methods [GET HEAD POST];

默认值:proxy_cache_methods GET HEAD;

使用字段:http, server, location

GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:

proxy_cache_methods POST;

 

5 proxy_cache_min_uses

语法:proxy_cache_min_uses the_number;

默认值:proxy_cache_min_uses 1;

使用字段:http, server, location

多少次的查询后应答将被缓存,默认1。

 

6 proxy_cache_valid

语法:proxy_cache_valid reply_code [reply_code ...] time;

默认值:None

使用字段:http, server, location

为不同的应答设置不同的缓存时间,例如:

 

 

复制代码 代码如下:proxy_cache_valid  200 302  10m;

  proxy_cache_valid  404      1m;

  proxy_cache_valid  5m;

  proxy_cache_valid  200 302 10m;

  proxy_cache_valid  301 1h;

  proxy_cache_valid  any 1m;

7 proxy_cache_use_stale

为了防止缓存失效(在多个线程同时更新本地缓存时),你可以指定’updating’参数,它将保证只有一个线程去更新缓存,并且在这个线程更新缓存的过程中其他的线程只会响应当前缓存中的过期版本。

 

代码及configure配置:

在ngx_http_proxy_module.c里面定义了每个指令的钩子(即callback),它们在读取配置文件时会被调用。在configure的时候只需要把“HTTP_CACHE”设置为YES(可以找到auto/options里面HTTP_CACHE那行)。“proxy_cache_purge”指令需要下载nginx add-ons里面的“Cache Purge”模块,并在configure的时候用"--add-module="来加载代码。