Nginx的Web缓存服务与新浪网的开源NCACHE模块

一、ngx_http_proxy_module模块

什么是web缓存
Web缓存位于内容源web服务器和客户端之间,当用户访问一个
URL时,web缓存服务器回去后端web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,web缓存服务器直接输出内容给客户端,而不是像源服务器再次发送请求。web缓存降低了内容源web服务器、数据库的负载,减轻了网络延迟,提高了用户的响应速度,增强了用户体验。
最著名的还要数Squid Cache,其主要在Unix一类系统运行。

ngx_http_proxy_module模块可根据用户请求的uri传递至后端服务器,实现反向代理

Nginx的Web缓存服务
Nginx从0.7.48后支持类似于Squid的缓存模块。这个缓存是把URL及相关组合当做key,用md5算法对key进行希哈,得到硬盘上对应的希哈路径,从而将缓存内容保存在该目录内。支持任意URL链接。同时也支持404/301/302这样的非200状态码。
Nginx的Web缓存服务主要用于proxy_cache相关指令集和fastcgi相关指令集构成,前者用于反向代理时,对后端内容源进行缓存,后者主要用于对FastCDI的动态程序进行缓存。两者功能基本一样。

命令:

proxy_cache相关指令集
1、proxy_cache指令
语法:proxy_cache zone_name;
默认值:none
使用环境:http,server,location
该指令用于设置那个缓存区将被应用,zone_name的值为proxy_cache_path指令创建的缓存区明称。
2、proxy_cache_path指令
语法:proxy_cache_path path[levels=number]
keys_zone=zone_name:zone_size[incative=time] [max_size=size];
默认值:none
使用环境:HTTP
eg:
proxy_cache_path /data0/proxy_cache_dir levels=1:2
keys_zone=cache_one: 500m inactive=1d max_size=30g;
注意该指令只能在http标签内配置,levels指定该缓存有两层hash目录,第一层为1个字母,第二层为2个字母,保存文件名类似于/data0/proxy_cache_dir/c/29/fdg35415fg35f4gsdf2g1535gh465h;key_zone参数用来为缓存区起名,500m指定内存空间大小为500MB;inactive的1d是如果缓存数据在1天之内没有被访问,将被删除;max_size的30g是指硬盘的缓存空间为30GB。
3proxy_cache_methods指令
语法:proxy_cache_methods [GET HEAD POST];
默认值:proxy_cache_methods GET HEAD;
使用环境:http,server,location
该指令用于设置用于缓存那些HTTP方法,默认缓存 HTTP GET/HEAD
方法,不缓存HTTP POST方法。
4proxy_cache_min_uses指令
语法:proxy_cache_min_uses the_number;
默认值:proxy_cache_min_uses 1;
使用环境:http,server,location
该指令设置缓存最小的使用次数,默认值是1.
5、proxy_cache_valid指令
语法:proxy_cache_valid reply_code [reply_code…]time;
默认值:none
使用环境:http,server,location
该指令用于对不同的返回状态码的URL设置不同的缓存时间,例如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
如果不指定状态吗,直接指定时间,则只有200、301、302状态的URL缓存5分钟。
6、proxy_cache_key指令
语法:proxy_cache_key line;
默认值:none
使用环境:http,server,location
该指令用来设置web缓存的key值,Nginx根据key值md5希哈存储缓存。一般根据‘$host(域名)、$request_uri(请求路径)’等组合变量合成proxy_cache_key.例如:proxy_cache_key
"$host:$server_port$uri$is_args$args";

1.proxy_pass

proxy_cache完整示例
su
yum -y install pcre//安装pcre
wget
tar zxvf ngx_cache_purge-2.3.tar.gz//获取nginx_cache_purge
cd nginx-1.6.3//进入你的nginx文件目录(nginx安装请参考前面的博客)
 ./configure --user=www --group=www --addmodule=../ngx_cache_purge-2.3
--prefix=/usr/local/webserver/nginx --with-http_stub_status_module
--with-http_ssl_module
配置nginx.conf
cd /usr/local/webserver/nginx/conf

    设置一个代理服务器的地址,协议,和一个可选的URI的位置应该映射。作为一个协议,“HTTP”或“https”可以指定。地址可以被指定为一个域名或IP地址,和一个可选的端口

#user  www www;
worker_processes  1;

语法:proxy_pass
URL;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

可用的上下文:location,
if in location, limit_except

#pid        logs/nginx.pid;

注意proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;
用户请求时传递的uri将直接附加代理到的服务的之后;

events {
    use epoll;
    worker_connections  1024;
}

2.proxy_set_header

http {
    include      mime.types;
    default_type  application/octet-stream;

设定发往后端主机的请求报文的请求首部的值

    #log_format  main  '$remote_addr - $remote_user [$time_local]
"$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent"
"$http_x_forwarded_for"';

语法:proxy_set_header
FIELD VALUE;

    #access_log  logs/access.log  main;

可用的上下文:http,
server, location

    #charset utf-8;

示例:

    server_name_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;

proxy_set_header
X-Real-IP  $remote_addr;

    sendfile        on;
    #tcp_nopush    on;

proxy_set_header
X-Forwarded-For $proxy_add_x_forwarded_for;

    keepalive_timeout  30;

3、proxy_cache_path

    tcp_nodely  on;

定义可用于proxy功能的缓存

    proxy_temp_path /data0/proxy_temp_path;

语法: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];

    proxy_temp_path /data0/proxy_temp_path levels=1:2
key_zone=cache_one:200m inactive=1d max_size=30g;
    upstream my_sever_pool{
        server 192.168.1.2:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.4:80 weight=1 max_fails=2 fail_timeout=30s;

可用上下文:http

    }

示例:

 

proxy_cache_path
/var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m
max_size=1g;

    #gzip  on;

4、proxy_cache

    server {
        listen      80;
        server_name  localhost;

指明要调用的缓存,或关闭缓存机制

        #charset koi8-r;

语法:proxy_cache
ZONE | off;

        #access_log  logs/host.access.log  main;

可用上下文:http,
server, location

        location / {
            proxy_set_header Host $host;
        proxy_set_header X-Forward-For $remote_addr;
        proxy_pass ;
      # root  html;
            #index  index.html index.htm;
        }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        #使用web缓存区cache_one
        proxy_cache cache_one;

5、proxy_cache_key

        #对不同状态码设置不同缓存时间
        proxy_cache_valid 200 304 12h;
        proxy_cache_valid 301 302 1m;
        proxy_cache_valid any im;
       
#设置web缓存的key值,nginx根据key值md5希哈存储缓存,这里根据“域名/URL
参数”组合成key。
        proxy_cache_key $host$uri$is_args$args;
        #反向代理,访问后端内容源服务器
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http:my_server_pool;
    }
   
#用于清除缓存,假设一个URL为
    location ~ /purge(/.*)
    {
        #设定只允许指定的IP或IP段才可以清除URL缓存。
        allow      127.0.0.1
        allow      192.168.0.0/16;
        deny        all;
        proxy_cache_purge cache_one $shot$1$is-args$args;
    }
    access_log 0ff

缓存中用于“键”的内容;

        #error_page  404              /404.html;

语法:proxy_cache_key
STRING;

        # redirect server error pages to the static page /50x.html
        #
        error_page  500 502 503 504  /50x.html;
        location = /50x.html {
            root  html;
        }

默认值:proxy_cache_key
$scheme$proxy_host$request_uri;

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass  ;
        #}

可用上下文:http,
server, location

        # pass the PHP scripts to FastCGI server listening on
127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root          html;
        #    fastcgi_pass  127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME 
/scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

6、proxy_cache_valid

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

定义对特定响应码的响应内容的缓存时长;

    # another virtual host using mix of IP-, name-, and port-based
configuration
    #
    #server {
    #    listen      8000;
    #    listen      somename:8080;
    #    server_name  somename  alias  another.alias;

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

    #    location / {
    #        root  html;
    #        index  index.html index.htm;
    #    }
    #}

可用上下文:http,
server, location

    # HTTPS server
    #
    #server {
    #    listen      443 ssl;
    #    server_name  localhost;

示例:

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

   
定义在http{...}当中

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

   
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1
keys_zone=pxycache:20m max_size=1g;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

   
定义在需要调用缓存功能的配置段,例如server{...}

    #    location / {
    #        root  html;
    #        index  index.html index.htm;
    #    }
    #}

   
proxy_cache pxycache;

}

proxy_cache_key
$request_uri;

更多Nginx相关教程见以下内容

proxy_cache_valid
200 302 301 1h;

CentOS
6.2实战部署Nginx+MySQL+PHP
http://www.linuxidc.com/Linux/2013-09/90020.htm

proxy_cache_valid
any 1m;

使用Nginx搭建WEB服务器
http://www.linuxidc.com/Linux/2013-09/89768.htm

7、proxy_cache_use_stale

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程
http://www.linuxidc.com/Linux/2013-09/89692.htm

   
不确定缓存的响应可以用代理服务器的通信过程中出现错误时,使用该指令的参数匹配的proxy_next_upstream指令的参数

CentOS 6.3下Nginx性能调优
http://www.linuxidc.com/Linux/2013-09/89656.htm

语法:proxy_cache_use_stale
error | timeout | invalid_header | updating | http_500 | http_502 |
http_503 | http_504 | http_403 | http_404 | off ...;

CentOS 6.3下配置Nginx加载ngx_pagespeed模块
http://www.linuxidc.com/Linux/2013-09/89657.htm

可用上下文:http,
server, location

CentOS 6.4安装配置Nginx+Pcre+php-fpm
http://www.linuxidc.com/Linux/2013-08/88984.htm

8、proxy_cache_methods

Nginx安装配置使用详细笔记
http://www.linuxidc.com/Linux/2014-07/104499.htm

   
如果客户端请求方法在这个指令中列出,那么响应将被缓存。“获取”和“头”的方法总是添加到列表中,虽然建议明确指定它们。又见proxy_no_cache指令。

Nginx日志过滤 使用ngx_log_if不记录特定日志
http://www.linuxidc.com/Linux/2014-07/104686.htm

语法:proxy_cache_methods
GET | HEAD | POST ...;

Nginx
的详细介绍
:请点这里
Nginx
的下载地址
:请点这里

可用上下文:http,
server, location

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121861.htm

9、proxy_hide_header

图片 1

   
隐藏所定义的首部,用户不可见

语法:proxy_hide_header
FIELD;

可用上下文:http,
server, location

10、proxy_connect_timeout

   
定义了用于建立与代理服务器连接超时,这个超时通常不能超过75秒。

语法:proxy_connect_timeout
time;

可用上下文:http,
server, location

11、proxy_buffers

   
集数和用于从代理服务器读取响应缓冲区的大小,为一个单一的连接。默认情况下,缓冲区大小等于一个内存页,4K或8K

语法:proxy_buffers
NUMBER SIZE;

可用上下文:http,
server, location 

二、ngx_http_headers_module模块

   
ngx_http_headers_module模块允许添加“过期”和“缓存控制头字段,和任意的领域,一个响应头。向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;

命令:

1、add_header

   
添加自定义首部;

语法:add_header
name value [always];

可用上下文:http,
server, location, if in location

示例:

   
add_header X-Via  $server_addr;

   
add_header X-Accel $server_name;

2、expires

   
用于定义Expire或Cache-Control首部的值;

语法:expires
[modified] time;

可用上下文:http,
server, location, if in location

三、ngx_http_upstream_module模块 

   
ngx_http_upstream_module模块用于定义服务器可以通过proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass参照组,和memcached_pass指令。

命令:

1、upstream

   
定义一组服务器。服务器可以在不同的端口上监听。此外,服务器监听TCP和Unix域套接字可以混合。

语法:upstream
name { ... }

可用上下文:http

示例:

upstream
httpdsrvs {

    server
...

   
server...

    ...

}

2、server

   
在upstream上下文中server成员,以及相关的参数;Context:upstream

语法:server
address [parameters];

可用上下文:upstream

address表示格式:

   
unix:/PATH/TO/SOME_SOCK_FILE

   
IP[:PORT]

   
HOSTNAME[:PORT]

parameters:

   (1)
weight=number

       
权重,默认为1;

   
(2)max_fails=number

       
失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;

   
(3)fail_timeout=time

       
设置将服务器标记为不可用状态的超时时长;

   
(4)max_conns

       
当前的服务器的最大并发连接数;

   
(5)backup

       
将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;

    (6)down

       
标记为“不可用”;

3、least_conn;

   
最少连接调度算法,当server拥有不同的权重时其为wlc,适用于长连接服务

4、ip_hash;

   
源地址hash调度方法;

5、hash

   
基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;

   
作用:将请求分类,同一类请求将发往同一个upstream server;

语法:hash key
[consistent];

示例:

    hash
$request_uri consistent;

    hash
$remote_addr;

6、keepalive

   
为每个worker进程保留的空闲的长连接数量;连接参数设置KeepAlive闲置的最大连接数上游服务器保存在每个工作进程缓存。当这个数字被超过时,最近使用的连接被关闭。

四、ngx_stream_core_module模块

   
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器;

命令:

1、stream

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。