重识Nginx - 11 使用ngx_http_proxy_module的proxy_cache搭建一个具备缓存功能的反向代理服务

2022-10-05 07:58:57 浏览数 (1)

文章目录

  • 官网说明 ngx_http_proxy_module
    • proxy_cache_path
    • proxy_cache_key
    • proxy_cache_valid
    • 其他参数 按需
  • 实操
    • 环境
    • nginx 8888 反向代理配置
    • nginx 9999 配置 (Mock后端服务)
    • 验证
    • 访问 http://ip:8888/a.html
    • 查看/tmp/nginxcache目录
    • 停掉 9999 后台服务
    • 再此访问 http://ip:8888/a.html
    • 如果删掉 b 这个目录呢 (后台服务也是停掉的)
    • 再次启动9999 ,一切正常了,又重新缓存了

官网说明 ngx_http_proxy_module

https://nginx.org/en/docs/http/ngx_http_proxy_module.html

proxy_cache_path

代码语言:javascript复制
Syntax:	proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=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

proxy_cache_key

代码语言:javascript复制
Syntax:	proxy_cache_key string;
Default:	
proxy_cache_key $scheme$proxy_host$request_uri;
Context:	http, server, location

Defines a key for caching, for example

代码语言:javascript复制
proxy_cache_key "$host$request_uri $cookie_user";

By default, the directive’s value is close to the string

代码语言:javascript复制
proxy_cache_key $scheme$proxy_host$uri$is_args$args;

proxy_cache_valid

代码语言:javascript复制
Syntax:	proxy_cache_valid [code ...] time;
Default:	—
Context:	http, server, location

Sets caching time for different response codes. For example, the following directives

代码语言:javascript复制
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

set 10 minutes of caching for responses with codes 200 and 302 and 1 minute for responses with code 404.

If only caching time is specified

代码语言:javascript复制
proxy_cache_valid 5m;

then only 200, 301, and 302 responses are cached.


In addition, the any parameter can be specified to cache any responses:

代码语言:javascript复制
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;
proxy_cache_valid any      1m;

Parameters of caching can also be set directly in the response header. This has higher priority than setting of caching time using the directive.

  • The “X-Accel-Expires” header field sets caching time of a response in seconds. The zero value disables caching for a response. If the value starts with the @ prefix, it sets an absolute time in seconds since Epoch, up to which the response may be cached.
  • If the header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or “Cache-Control”.
  • If the header includes the “Set-Cookie” field, such a response will not be cached.
  • If the header includes the “Vary” field with the special value “*”, such a response will not be cached (1.7.7). If the header includes the “Vary” field with another value, such a response will be cached taking into account the corresponding request header fields (1.7.7).

Processing of one or more of these response header fields can be disabled using the proxy_ignore_headers directive.


其他参数 按需


实操

环境

nginx 8888 作为反向代理 , 转发到 后端服务 9999 (用nginx模拟)


nginx 8888 反向代理配置

代码语言:javascript复制
[root@VM-0-7-centos conf]# cat nginx.conf

user  root;
worker_processes  1;

events {
    worker_connections  1024;
}


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


    proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    sendfile        on;
   
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 20;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    

    upstream local {
       server 127.0.0.1:9999;  # 用nginx 模拟 后端的服务  
    }

    server {
        listen   8888;
        server_name  artisan.nginx.pub;

       

        location / {
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_cache my_cache;
           proxy_cache_key $host$uri$is_args$args;
           proxy_cache_valid 200 304 302 1d;

           proxy_pass http://local;
        }


     
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重点看

代码语言:javascript复制
    proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

代码语言:javascript复制
  proxy_cache my_cache;
  proxy_cache_key $host$uri$is_args$args;
  proxy_cache_valid 200 304 302 1d;

重启服务

代码语言:javascript复制
[root@VM-0-7-centos artisan_ng]# pwd
/root/ng/artisan_ng

[root@VM-0-7-centos artisan_ng]# ./sbin/nginx -c ./conf/nginx.conf
[root@VM-0-7-centos artisan_ng]#
[root@VM-0-7-centos artisan_ng]# ps -ef|grep nginx
root      841577       1  0 11:26 ?        00:00:00 nginx: master process ./sbin/nginx -c ./conf/nginx.conf
root      841578  841577  0 11:26 ?        00:00:00 nginx: worker process
root      841579  841577  0 11:26 ?        00:00:00 nginx: cache manager process
root      841580  841577  0 11:26 ?        00:00:00 nginx: cache loader process
root      841605  841385  0 11:26 pts/5    00:00:00 grep --color=auto nginx
[root@VM-0-7-centos artisan_ng]#
[root@VM-0-7-centos artisan_ng]#

[root@VM-0-7-centos artisan_ng]#

查看nginx的进程,会发现 多了 两个进程 nginx: cache managernginx: cache loader


nginx 9999 配置 (Mock后端服务)

代码语言:javascript复制
user  root;
worker_processes  1;


events {
    worker_connections  1024;
}


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



    sendfile        on;

    keepalive_timeout  65;

    gzip on;
    gzip_min_length 20;
    gzip_types *;


    server {
        listen    127.0.0.1:9999;  # 仅允许本地访问
        #listen     9999;
        server_name  localhost;


        location / {
           alias  document/;  # 模拟静态资源文件 

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

}

重启 nginx

代码语言:javascript复制
[root@VM-0-7-centos ng]# cd  artisan_ng_backserver/
[root@VM-0-7-centos artisan_ng_backserver]# ll
total 40
drwxr-xr-x 2 root root 4096 Oct  4 10:12 client_body_temp
drwxr-xr-x 2 root root 4096 Oct  4 10:43 conf
drwxr-xr-x 3 root root 4096 Oct  4 10:12 document
drwxr-xr-x 2 root root 4096 Oct  4 10:12 fastcgi_temp
drwxr-xr-x 2 root root 4096 Oct  4 10:12 html
drwxr-xr-x 2 root root 4096 Oct  4 10:12 logs
drwxr-xr-x 2 root root 4096 Oct  4 10:12 proxy_temp
drwxr-xr-x 7 root root 4096 Oct  4 10:12 sbin
drwxr-xr-x 2 root root 4096 Oct  4 10:12 scgi_temp
drwxr-xr-x 2 root root 4096 Oct  4 10:12 uwsgi_temp
[root@VM-0-7-centos artisan_ng_backserver]# ./sbin/nginx -c /root/ng/artisan_ng_backserver/conf/nginx.conf
[root@VM-0-7-centos artisan_ng_backserver]#
[root@VM-0-7-centos artisan_ng_backserver]#

验证

代码语言:javascript复制
[root@VM-0-7-centos tmp]# /root/ng/artisan_ng/sbin/nginx -c /root/ng/artisan_ng/conf/nginx.conf
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]# /root/ng/artisan_ng_backserver/sbin/nginx -c /root/ng/artisan_ng_backserver/conf/nginx.conf
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]# ps -ef|grep nginx
root      847458       1  0 12:04 ?        00:00:00 nginx: master process /root/ng/artisan_ng/sbin/nginx -c /root/ng/artisan_ng/conf/nginx.conf
root      847459  847458  0 12:04 ?        00:00:00 nginx: worker process
root      847460  847458  0 12:04 ?        00:00:00 nginx: cache manager process
root      847461  847458  0 12:04 ?        00:00:00 nginx: cache loader process
root      847512       1  0 12:05 ?        00:00:00 nginx: master process /root/ng/artisan_ng_backserver/sbin/nginx -c /root/ng/artisan_ng_backserver/conf/nginx.conf
root      847513  847512  0 12:05 ?        00:00:00 nginx: worker process
root      847533  841385  0 12:05 pts/5    00:00:00 grep --color=auto nginx
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]# ll
total 4
drwx------ 2 root root 4096 Oct  4 12:04 nginxcache
-rw-r--r-- 1 root root    0 Oct  4 12:04 stargate.lock
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#
[root@VM-0-7-centos tmp]#  启动后 就有 nginxcache 目录了,只不过为空  
[root@VM-0-7-centos tmp]# cd nginxcache/
[root@VM-0-7-centos nginxcache]# ll
total 0
[root@VM-0-7-centos nginxcache]#

我们看到 2个 进程都起好了 .

访问 http://ip:8888/a.html

查看/tmp/nginxcache目录

代码语言:javascript复制
[root@VM-0-7-centos nginxcache]# ll
total 4
drwx------ 3 root root 4096 Oct  4 12:05 b
[root@VM-0-7-centos nginxcache]#

[root@VM-0-7-centos nginxcache]# tree b/
b/
└── d0
    └── a2621ddcb53455c06f238e9b4e5a1d0b

1 directory, 1 file
[root@VM-0-7-centos nginxcache]#

停掉 9999 后台服务

代码语言:javascript复制
[root@VM-0-7-centos nginxcache]# netstat -anp|grep 9999
tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      847512/nginx: maste
tcp        0      0 127.0.0.1:9999          127.0.0.1:45968         TIME_WAIT   -
[root@VM-0-7-centos nginxcache]# kill  847512
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#

再此访问 http://ip:8888/a.html

如果删掉 b 这个目录呢 (后台服务也是停掉的)

再次启动9999 ,一切正常了,又重新缓存了

代码语言:javascript复制
[root@VM-0-7-centos nginxcache]# /root/ng/artisan_ng_backserver/sbin/nginx -c /root/ng/artisan_ng_backserver/conf/nginx.conf
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]# netstat -anp|grep 9999
tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      848053/nginx: maste
[root@VM-0-7-centos nginxcache]#




[root@VM-0-7-centos nginxcache]# ll
total 4
drwx------ 3 root root 4096 Oct  4 12:09 b
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]#
[root@VM-0-7-centos nginxcache]# tree b/
b/
└── d0
    └── a2621ddcb53455c06f238e9b4e5a1d0b

1 directory, 1 file
[root@VM-0-7-centos nginxcache]#

又重新缓存了。

0 人点赞