简述

本文主要介绍如何配置和使用Nginx服务器缓存机制。

序言

提高Web应用服务器响应速度除了优化Web内容本身之外,另一个主要办法就是把不需要实时更新的动态页面输出结果转化成静态网页形成缓存,进而按照静态网页来访问。这种机制能够使得动态网站响应速度显著提升,Web缓存技术是减轻服务器负载、降低网络拥塞、增强网络可扩展性的有效办法。

原理

Web缓存技术原理是Web服务器根据客户端的请求从后端服务器获取响应数据,回传给客户端,并将该响应数据在本地建立副本保存。当下次有相同的客户端请求时,Web服务器直接使用本地的副本响应访问请求,而不是向后端服务器再次发送请求。本地副本具有一个过期时间,超过该时间将会更新。

优点

客户端的部分请求内容直接从Web服务器处获取,减轻了后端服务器负载,减少了Web服务器与后端服务器之间的网络流量,减轻了网络拥塞,同时减少数据传输延迟,有效降低客户访问延迟。另外,如果由于后端服务器故障或网络故障造成服务器无法响应客户端请求,客户端可以从Web服务器中获取缓存内容副本,可以增强了数据的可用性。

常用方案

Web缓存技术常用的配置方案有"404错误驱动Web缓存"、"资源不存在驱动Web缓存"、"Memcached缓存机制"、"Proxy Cache缓存机制"和"Nginx和Squid组合"。


404错误驱动Web缓存


当Nginx服务器处理客户端请求时,发现请求资源数据不存在,会产生404错误,服务器捕获该错误,进一步转向后端服务器请求数据,将后端服务器的响应数据回传给客户端,同时在本地缓存。

nginx.conf配置

upstream backend {ip_hash;server backend.example.com:80;}server {listen 80;server_name localhost nginx_ip;location / {#主目录root /myweb/nginx/;#404重定向到errpage目录下error_page 404 =200 /errpage$request_uri;}location /errpage/ {internal;alias /home/html/;index index.html;proxy_pass http://backend/;#后端不返回压缩(gzip/default)数据proxy_set_header Accept-Encoding "";#指定nginx将代理返回的文件保存proxy_store on;#配置缓存数据的访问权限proxy_store_access user:rw group:rw all:r;#配置临时目录proxy_temp_path /myweb/nginx/proxy_temp 1 2;}}

配置将404错误响应进行重定向,然后使用location块捕获重定向请求,向后端服务器发起请求获取响应数据,然后将数据转发给客户端的同时缓存到本地。


资源不存在驱动Web缓存


该方法同"404错误驱动Web缓存"的方法在原理上类似,不同之处是,该方法是通过location块的location if条件判断直接驱动Nginx服务器与后端服务器的通信与Web缓存,而后者是对资源不存在引发的404错误进行捕获,进而驱动Nginx服务器与后端服务器的通信和Web缓存。

nginx.conf配置

upstream backend {ip_hash;server backend.example.com:80;}server {listen 80;server_name localhost nginx_ip;location / {root /home/html/;#配置该目录不能通过外部链接直接访问internal;alias /myweb/nginx/;#后端不返回压缩(gzip/default)数据proxy_set_header Accept-Encoding "";#指定nginx将代理返回的文件保存proxy_store on;#配置缓存数据的访问权限proxy_store_access user:rw group:rw all:r;#配置临时目录proxy_temp_path /myweb/nginx/proxy_temp 1 2;#判断请求资源是否存在if(!-f $request_filename){#配置后端upstream地址proxy_pass http://backend/;}}}

使用location if条件判断支持的"!-f"判断请求的资源在Nginx服务器上是否存在,如果不存在就通过后端服务器获取数据,然后回传给客户端,同时使用Proxy Store进行缓存。


Memcached缓存机制


memcached是一套高性能的基于分布式的缓存系统,用于动态Web应用以减轻后台数据服务器的负载。它可以独立于任何程序单独作为后台程序运行,通过在内存中的缓存数据来减少对后台数据服务器的请求,从而提高客户端的响应。

memcached可以处理并发的网络连接。它在内存中开辟一块空间,然后建立一个Hash表,将缓存数据通过键/值存储在Hash表中进行管理。memcached由服务端和客户端两个核心组件所组成,服务端先通过计算"键"的Hash值来确定键/值对在服务端所处的位置。当确定键/值对的位置后,客户端就会发送一个查询请求给对应的服务端,让它来查找并返回确切的数据。

memcached指令:memcached_pass、memcached_connect_timeout、memcached_read_timeout、memcached_send_timeout、memcached_buffer_size、memcached_next_upstream指令。

memcached_pass指令:用于配置memcached服务器的地址。

语法

memcached_pass address;

address为memcached服务器地址,支持IP+端口的地址或者是域名地址。也可以使用upstream指令配置一个memcached服务器组,然后将address配置为upstream的名称。

memcached_connect_timeout指令:用于配置连接memcached服务器的超时时间。

语法

memcached_connect_timeout time;

time为设置的超时时间,默认为60s,建议该时间不要超过75s。

memcached_read_timeout指令:用于配置Nginx服务器向memcached服务器发出两次read请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。

语法

memcached_read_timeout time;

time为设置的超时时间,默认为60s。

memcached_send_time指令:用于配置Nginx服务器向memcached服务器发出两次write请求之间的等待超时时间,如果在该时间内没有进行数据传输,连接将会被关闭。

语法

memcached_send_timeout time;

time为设置的超时时间,默认为60s。

memcached_buffer_size指令:用于配置Nginx服务器用于接收memcached服务器响应数据的缓存区大小。

语法

memcached_buffer_size size;

size为设置的缓存区大小,一般是所在平台的内存页大小的倍数,默认值为:

memcached_buffer_size 4k|8k;

memcached_next_upstream指令:用于配置了一组memcached服务器的情况下使用。服务器组中各memcached服务器的访问规则遵循upstream指令配置的轮询规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一个组内服务器处理。

语法

memcached_next_upstream status …;

status为设置的memcached服务器返回状态,可以是一个或者多个。这些状态包括:

error,在建立连接时、向memcached服务器发送请求或者读取响应头时服务器发生连接错误。

timeout,在建立连接时、向memcached服务器发送请求或者读取响应头时服务器发生连接超时。

invalid_header,memcached服务器返回的响应头为空或者无效。

not_found,memcached服务器未找到对应的键/值对。

off,无法将请求发送给memcached服务器。

nginx.conf配置

upstream backend {ip_hash;server backend.example.com:80;}server {listen 80;server_name localhost ngin_ip;location / {set $memcached_key "$uri?$args";memcached_pass memcached_ip:port;error_page 404 502 504 = @fallback;}location @fallback{proxy_pass http://backend;}}

通过设置$memcached_key变量的值"$uri?$args",Nginx服务器会根据该值调用Hash算法向memcached服务器发送查询请求。如果在请求缓存数据的时候返回状态码404、502或504时,则将错误进行重定向,捕获并转向后台服务器请求实际数据。


Proxy Cache缓存机制


该机制是Nginx服务器自己实现的类似于Squid的缓存机制,它使用md5算法将请求链接hash计算后生成文件系统目录保存响应数据。

Nginx服务器在启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率,并且还会生成专门的管理进程对磁盘上的缓存文件进行过期判定、更新等方面的管理。

Proxy Cache缓存机制支持对任意链接响应数据的缓存,不仅限于200状态时的数据。

nginx.conf配置

http {#配置了缓存数据存放路径proxy_cache_path /myweb/nginx/proxycache levels=1:2 max_size=2m inactive=5m loader_sleep=1m;#配置Proxy Cache使用的内存Cache空间keys_zone=MYPROXYCACHE:10m;#配置响应数据的临时存放目录proxy_temp_path /myweb/nginx/tmp;upstream backend {ip_hash;server backend.example.com:80;}server {listen 80;server_name localhost ngin_ip;location / {proxy_pass http://backend;#配置使用MYPROXYCACHE这个keys_zoneproxy_cache MYPROXYCACHE;#配置200状态和302状态的响应缓存1小时proxy_cache_valid 200 302 1h;#配置301状态的响应缓存1天proxy_cache_valid 301 1d;#配置其他状态的响应数据缓存1分钟proxy_cache_valid any 1m;}}}

http块中,配置缓存数据存放路径和Proxy Cache使用的内存Cache空间。缓存数据存放在磁盘上/myweb/nginx/proxycache目录下,它包含两级hash目录,缓存数据的总量不能超过20MB;如果缓存在5分钟内没有被访问,则强制更新。内存Cache控件的名字为MYPROXYCACHE,大小不能超过10MB,每隔1分钟遍历一次磁盘缓存源数据,更新内存Cache中的缓存索引。

server块中,配置使用上面设置好的MYPROXYCACHE内存空间进行Proxy Cache工作,对不同响应状态的数据缓存时间进行了配置。


Nginx和Squid组合


Squid Cache(简称Squid)是目前在大访问量的网站建设中应用非常广泛的Web缓存服务器。

它可以作为网页服务器的前置缓存服务器来缓存相关的请求数据,也可以缓存公网资源为局域网内用户提供共享资源。但是,Squid服务本身不支持在单台服务器同一端口下运行多个进程,这样的话就需要给每一个Squid服务分配一台服务器设备,这样非常浪费资源。

Squid服务器配置:

将多个Squid服务安装到同一台服务器上的不同目录下,并配置不同的监听端口,如:

/Squid0 监听在squid_server_ip:10010/Squid1 监听在squid_server_ip:10011/Squid2 监听在squid_server_ip:10012

其中,squid_server_ip是部署Squid服务的服务器IP地址。

Nginx配置:

user www www;worker_processes 10;error_log /usr/local/nginx/logs/nginx_error.log;pid /usr/local/nginx/nginx.pid;worker_rlimit_nofile 51200;events {use epoll;worker_connections 51200;}http {include mime.types;default_type application/octet-stream;sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;upstream squid_server {server squid_server_ip:10010;server squid_server_ip:10011;server squid_server_ip:10012;}server {listen 80;server_name localhost ngin_ip;#将客户端请求转向Squid服务器组处理location / {proxy_pass http://squid_server;proxy_redirect off;proxy_set_header Host $host:80;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}}

ok,以上就是如何配置和使用Nginx服务器缓存机制详细讲解,看完记得转发、点赞和收藏。如果有错误,欢迎批评指正,感谢。