Pages

Monday, 6 May 2013

nginx下,利用proxy_cache来缓存文件

nginx 配置优化的几个参数。
worker_processes 8,nginx要开启的进程数 ,一般等于cpu的总核数 其实一般情况下开4个或8个就可。
use epoll, Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。处理大量的连接的读写,Apache所 采用的select网络I/O模型非常低效。在高并发服务器中,轮询I/O是最耗时间的操作 目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。
worker_connections 65535;每个工作进程允许最大的同时连接数  (Maxclient = work_processes * worker_connections)

下面介绍http proxy模块中的相关指令:
proxy_next_upstream语法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off] 确定在何种情况下请求将转发到下一个服务器。转发请求只发生在没有数据传递到客户端的过程中。
proxy_connect_timeout后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_send_timeout后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_pass这个指令设置被代理服务器的地址和被映射的URI。
步入正题,开始配置nginx。首先打开nginx.conf文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
user  www www;
worker_processes 2;
error_log  logs/nginx_error.log  crit;
worker_rlimit_nofile 65535;
events
{
    use epoll;
    worker_connections 65535;
}
http
{
    include       mime.types;
    default_type  application/octet-stream;
 
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
 
    sendfile on;
    tcp_nopush     on;
    keepalive_timeout 0;
    tcp_nodelay on;
 
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    ##cache##
    proxy_connect_timeout 5;
    proxy_read_timeout 60;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_temp_path temp_dir;
    proxy_cache_path cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
    ##end##
 
    gzip    on;
    gzip_min_length   1k;
    gzip_buffers   4 8k;
    gzip_http_version  1.1;
    gzip_types   text/plain application/x-javascript text/css  application/xml;
    gzip_disable "MSIE [1-6]\.";
 
    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    upstream appserver {
        server 127.0.0.1;
    }
    server {
        listen       80 default;
        server_name www.gangpao.com;
        location ~ .*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
            proxy_pass http://appserver;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_cache cache_one;
            proxy_cache_valid 200 302 1h;
            proxy_cache_valid 301 1d;
            proxy_cache_valid any 1m;
            expires 30d;
        }
        location ~ .*\.(php)(.*){
            proxy_pass http://appserver;
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        access_log logs/www.gangpao.com.log;
    }
}
说明:
1、http段设置。
proxy_temp_path temp_dir;设置临时目录
proxy_cache_path cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置缓存目录为二级目录,共享内存区大小,非活动时间,最大容量,注意临时目录要跟缓存目录在同一个分区。
2、server段设置
请求静态文件设置。
proxy_cache cache_one;设置缓存共享内存区块,也就是keys_zone名称。
proxy_cache_valid 200 302 1h;设置http状态码为200,302缓存时间为1小时。
expires 30d;设置失期时间,为30天
请求动态文件设置。
proxy_pass http://appserver;不进行缓存,直接转到后端服务器。
测试:当客户端发起http请求时在服务器上会产一个缓存文件如
1
cache/0/b9/8bd841b1c44ee5b91457eb561e44eb90
也可以通过Page Speed查看,页面有没被缓存过。