成功最有效的方法就是向有经验的人学习!

配置nginx缓存WEB服务器

首先下载这两个包

cd /opt
[root@guilin opt]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
[root@guilin opt]# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

安装依赖包

[root@eplb01 opt]# yum -y install gcc gcc-c++ autoconf automake make wget
[root@eplb01 opt]# yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed libtool zlib zlib-devel pcre pcre-devel patch

创建nginx运行用户

[root@eplb01 opt]# useradd -s /usr/sbin/nologin -M www

解压

[root@guilin opt]# tar xvf nginx-1.16.0.tar.gz
[root@guilin opt]# tar xvf ngx_cache_purge-2.3.tar.gz
[root@guilin opt]# ll
total 1032
drwxr-xr-x 8 1001  1001    4096 Apr 23 21:13 nginx-1.16.0
-rw-r--r-- 1 root root  1032345 May 15 14:53 nginx-1.16.0.tar.gz
drwxr-xr-x 3  501 wheel    4096 Dec 24  2014 ngx_cache_purge-2.3
-rw-r--r-- 1 root root    12248 Dec 24  2014 ngx_cache_purge-2.3.tar.gz

编译nginx

./configure --user=www --group=www --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_sub_module

make && make install

创建软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

1.如何配置基本缓存设置
开启简单的缓存配置,只需要两个指令:proxy_cache_path和proxy_cache。proxy_cache_path配置缓存的存放地址和其他的一些常用配置,proxy_cache指令是为了启动缓存。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m use_temp_path=off;
server {
  # ...
  location / {
    proxy_cache mycache;
    proxy_pass http://my_upstream;
  }
}

相关配置说明如下:

/path/to/cache 本地路径,用来设置Nginx缓存资源的存放地址
levels 默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的keyf4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中
key_zone 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
max_size 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
inactive 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
use_temp_path 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
proxy_cache 启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。
2.proxy_cache其他相关指令集
(1)proxy_no_cache

Syntax:proxy_no_cache string ...;
Default: —
Context: http , server , location

该指令用于定义满足条件的响应不会被保存到缓存中。在条件字符串中至少有一个条件不为空或者0,符合这样条件的响应才不会被缓存。举例如下:

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma    $http_authorization;

其中,cookie_nocache、arg_nocache…皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0;
访问匹配策略例如:

if ($request_uri ~ ^/(login|register|password\/reset)/) { set $cookie_nocache 1; }

如果在此链式配置中,只要有一个值不为0,则不会cache;例如:
proxy_no_cache $cookie_nocache(0) $arg_nocache(1) $arg_comment(0)
则不会被cache。`

注:一般会配合proxy_cache_bypass共同使用;

(2)proxy_cache_bypass

Syntax: proxy_cache_bypass string ...;
Default: —
Context: http , server , location

该指令用于定义哪些情况不从cache读取,直接从backend获取资源;配置方式同proxy_no_cache。
(3)proxy_cache_key

Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

给缓存数据定义一个键,例如

proxy_cache_key “$host$request_uri $cookie_user”;

默认情况下,该指令的值的字符串

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

(4)proxy_cache_methods

Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST 方法.。

(5)proxy_cache_valid

Syntax: proxy_cache_valid [code ...] time;
Default:  —
Context:  http, server, location

设置不同响应码的缓存时间,当不指定响应码的时候,例如

proxy_cache_valid 5m;

只对响应码为200,301,302的访问请求资源设置缓存时间,此外可以个性化定制,例如:

proxy_cache_valid 200 302 10m; 
proxy_cache_valid 301 1h; 
proxy_cache_valid 404 1m; 
proxy_cache_valid any 1m;

此外,还可以在相应header里设置优先级更高的缓存有效时间:

“X-Accel-Expires”,设置响应的缓存过期时间,以秒为单位;0为不缓存;
如果没有设置“X-Accel-Expires” header,则关于缓存的配置策略可能会在“Expires”或者“Cache-Control” header中;
如果header含有“Set-Cookie”,则响应不会被缓存,类似的配置可以在“proxy_ignore_header”中可见;
header包含“Vary”并且设置为“*”,则请求不会被缓存,如果“Vary”有具体的值,则对应的请求会被缓存;
(6)proxy_ignore_headers

Syntax:  proxy_ignore_headers field ...;
Default:  —
Context:  http, server, location

不缓存包含在field的响应header,可以设置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”。
如果上述的header field没有设置为忽略,则header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的话,响应会被缓存。
(7)proxy_cache_min_uses指令

Syntax:  proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location

该指令用于设置缓存的最小使用次数,默认值为1

proxy_cache配置语法

Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location

//缓存路径
Syntax: proxy_cache_path path [levels=levels]
[use_temp_path=on|off] keys_zone=name:size [inactive=time]
[max_size=size] [manager_files=number] [manager_sleep=time][manager_threshold=time]
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: —
Context: http

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可以用来在多个硬盘之间分割缓存。举例如下:
我们假设每块硬盘挂载在相应的目录中:/mnt/disk1/mnt/disk2/mnt/disk3

proxy_cache_path /mnt/disk1 levels=1:2 keys_zone=cache_1:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk2 levels=1:2 keys_zone=cache_2:256m max_size=1024G use_temp_path=off;
proxy_cache_path /mnt/disk3 levels=1:2 keys_zone=cache_3:256m max_size=1024G use_temp_path=off;
split_clients $request_uri $disk {
    33.3%     1;
    33.3%     2;
    *         3;
}

location / {
    proxy_pass http://backend;
    proxy_cache_key $request_uri;
    proxy_cache cache_$disk;
}

在这份配置中,使用了3个独立的缓存,每个缓存专用一块硬盘,另外,3个独立的线程池也各自专用一块硬盘。
缓存之间(其结果就是磁盘之间)的负载均衡使用split_clients模块,split_clients非常适用于这个任务。
在 proxy_cache_path指令中设置use_temp_path=off,表示NGINX会将临时文件保存在缓存数据的同一目录中。这是为了避免在更新缓存时,磁盘之间互相复制响应数据。

生产用例

upstream cache {
    server 10.168.204.66:7072;
}
#proxy_cache存放缓存临时文件
#levels     按照两层目录分级
#keys_zone  开辟空间名, 10m:开辟空间大小, 1m可存放8000key
#max_size   控制最大大小, 超过后Nginx会启用淘汰规则
#inactive   60分钟没有被访问缓存会被清理
#use_temp_path  临时文件, 会影响性能, 建议关闭
proxy_cache_path /cache/en levels=1:2 keys_zone=code_cache_en:10m max_size=10g inactive=60m use_temp_path=off;

server {
listen 443 ssl;
server_name www.epermarket.com;
ssl_certificate /usr/local/nginx/crt/server.cer;
ssl_certificate_key /usr/local/nginx/crt/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
if ($request_uri ~ ^/(usr|shopcart|register|password)) {
                set $cookie_nocache 1;
        }
#proxy_cache        开启缓存
#proxy_cache_valid  状态码200|304的过期为12h, 其余状态码10分钟过期
#proxy_cache_key    缓存key
#add_header         增加头信息, 观察客户端respoce是否命中
#proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
location / {
    proxy_pass http://cache;
    proxy_cache code_cache_en;
    proxy_cache_valid 200 304 12h;
    proxy_cache_valid any 10m;
    proxy_cache_key $uri$is_args$args;
    proxy_no_cache $cookie_nocache;
    proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
    add_header Nginx-Cache "$upstream_cache_status";
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    include proxy_params;
}

location ~ /Clear_Cache(/.*) {
allow 127.0.0.1;
allow 10.168.204.0/24;
deny all;
proxy_cache_purge code_cache_en $1$is_args$args;
}
}

可以打开页面看一下,这里我找一个链接测试:https://xxxxxx.com/product/ProductDetail.aspx?ProductID=39360
首次打开:

再次打开:

清理缓存:

再次打开:

赞(0) 打赏
未经允许不得转载:陈桂林博客 » 配置nginx缓存WEB服务器
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册