🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 1\. 摘要 本文介绍NGINX缓存机制,配置和参数说明。 # 2\. 内容 ## 2.1 nginx缓存的优点 ![](//upload-images.jianshu.io/upload_images/1190574-af1c8874843e0a30.png?imageMogr2/auto-orient/strip|imageView2/2/w/1010/format/webp) 如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy\_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。毕竟,IO密集型服务的处理是nginx的强项。 Nginx的缓存加速功能是由proxy\_cache(用于反向代理和静态缓存)和fastcgi\_cache(PHP动态缓存)两个功能模块完成。 **Nginx缓存特点:** * 缓存稳定,运行速度与Squid相差无几(因为都使用硬盘缓存); * 对多核CPU的利用率比其他的开源软件好; * 支持高并发请求数,能同时承受更多的访问请求; ## 2.2 如何进行设置 先上个例子: ~~~php http{ proxy_connect_timeout 10; proxy_read_timeout 180; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 32k; proxy_busy_buffers_size 96k; proxy_temp_file_write_size 96k; proxy_temp_path /tmp/temp_dir; proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; server { listen 80 default_server; server_name localhost; root /mnt/blog/; location / { } #要缓存文件的后缀,可以在以下设置。 location ~ .*\.(gif|jpg|png|css|js)(.*) { proxy_pass http://ip地址:90; proxy_redirect off; proxy_set_header Host $host; proxy_cache cache_one; proxy_cache_valid 200 302 24h; proxy_cache_valid 301 30d; proxy_cache_valid any 5m; expires 90d; add_header wall "hey!guys!give me a star."; } } # 无nginx缓存的blog端口 server { listen 90; server_name localhost; root /mnt/blog/; location / { } } } ~~~ 因为我是在一台服务器上做试验,所以用了两个端口`80`和`90`进行模拟两台服务器之间的交互。 > `80`端口对接的是普通的域名(`http://wangxiaokai.vip`)访问。 > `90`端口负责处理`80`端口代理过来的资源访问。 > 相当于`90`端口是源服务器,`80`端口是nginx反向缓存代理服务器。 * * * 接下来讲一下配置项: ### 2.2.1 http层设置 ~~~undefined proxy_connect_timeout 10; proxy_read_timeout 180; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 32k; proxy_busy_buffers_size 96k; proxy_temp_file_write_size 96k; proxy_temp_path /tmp/temp_dir; proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; ~~~ * proxy\_connect\_timeout `服务器连接的超时时间` * proxy\_read\_timeout `连接成功后,等候后端服务器响应时间` * proxy\_send\_timeout `后端服务器数据回传时间` * proxy\_buffer\_size `缓冲区的大小` * proxy\_buffers `每个连接设置缓冲区的数量为number,每块缓冲区的大小为size` * proxy\_busy\_buffers\_size `开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。` * proxy\_temp\_file\_write\_size `设置nginx每次写数据到临时文件的size(大小)限制` * proxy\_temp\_path `从后端服务器接收的临时文件的存放路径` * proxy\_cache\_path `设置缓存的路径和其他参数。被缓存的数据如果在inactive参数(当前为1天)指定的时间内未被访问,就会被从缓存中移除` ### 2.2.2 server层设置 #### 2.2.2.1 反向缓存代理服务器 ~~~php server { listen 80 default_server; server_name localhost; root /mnt/blog/; location / { } #要缓存文件的后缀,可以在以下设置。 location ~ .*\.(gif|jpg|png|css|js)(.*) { proxy_pass http://ip地址:90; proxy_redirect off; proxy_set_header Host $host; proxy_cache cache_one; proxy_cache_valid 200 302 24h; proxy_cache_valid 301 30d; proxy_cache_valid any 5m; expires 90d; add_header wall "hey!guys!give me a star."; } } ~~~ * proxy\_pass `nginx缓存里拿不到资源,向该地址转发请求,拿到新的资源,并进行缓存` * proxy\_redirect `设置后端服务器“Location”响应头和“Refresh”响应头的替换文本` * proxy\_set\_header `允许重新定义或者添加发往后端服务器的请求头` * proxy\_cache `指定用于页面缓存的共享内存,对应http层设置的keys_zone` * proxy\_cache\_valid `为不同的响应状态码设置不同的缓存时间` * expires `缓存时间` * * * 这里我设置了`图片`、`css`、`js`静态资源进行缓存。 当用户输入`http://wangxiaokai.vip`域名时,解析得到`ip:port`的访问地址。`port`默认为80。所以页面请求会被当前server截取到,进行请求处理。 当解析到上述文件名结尾的静态资源,会到缓存区获取静态资源。 如果获取到对应资源,则直接返回数据。 如果获取不到,则将请求转发给`proxy_pass`指向的地址进行处理。 #### 2.2.2.2 源服务器 ~~~undefined server { listen 90; server_name localhost; root /mnt/blog/; location / { } } ~~~ 这里直接处理`90`端口接受到的请求,到服务器本地目录`/mnt/blog`下抓取资源进行响应。 ## 2.3 如何验证缓存是否有效 细心的读者应该发现,我在第二段例子里,留了个彩蛋 `add_header wall "hey!guys!give me a star."`。 `add_header`是用于在报头设置自定义的信息。 所以,如果缓存有效的话,那么静态资源返回的报头,一定会带上这个信息。 ## 2.4 proxy\_cache主要参数 ~~~bash 1. proxy_cache 语法:proxy_cache zone|off 默认为off,即关闭proxy_cache功能,zone为用于存放缓存的内存区域名称。 例:proxy_cache my_zone; 从nginx 0.7.66版本开始,proxy_cache机制开启后会检测被代理端的HTTP响应头中的"Cache-Control"、"Expire"头域。 如,Cache-Control为no-cache时,是不会缓存数据的。 2. proxy_cache_bypass 语法:proxy_cache_bypass string; 该参数设定,什么情况下的请求不读取cache而是直接从后端的服务器上获取资源。 这里的string通常为nginx的一些变量。 例:proxy_cahce_bypass $cookie_nocache $arg_nocache$arg_comment; 意思是,如果$cookie_nocache $arg_nocache$arg_comment这些变量的值只要任何一个不为0或者不为空时, 则响应数据不从cache中获取,而是直接从后端的服务器上获取。 3. proxy_no_cache 语法:proxy_no_cache string; 该参数和proxy_cache_bypass类似,用来设定什么情况下不缓存。 例:proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; 表示,如果$cookie_nocache $arg_nocache $arg_comment的值只要有一项不为0或者不为空时,不缓存数据。 4. proxy_cache_key 语法:proxy_cache_key string; 定义cache key,如: proxy_cache_key $scheme$proxy_host$uri$is_args$args; (该值为默认值,一般不用设置) 5. proxy_cache_path 语法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] path设置缓存数据存放的路径; levels设置目录层级,如levels=1:2,表示有两级子目录,第一个目录名取md5值的倒数第一个值,第二个目录名取md5值的第2和3个值。keys_zone设置内存zone的名字和大小,如keys_zone=my_zone:10m;inactive设置缓存多长时间就失效,当硬盘上的缓存数据在该时间段内没有被访问过,就会失效了,该数据就会被删除,默认为10s。max_size设置硬盘中最多可以缓存多少数据,当到达该数值时,nginx会删除最少访问的数据。 ~~~ # 3\. 参考 (1)Nginx系列教程(3)nginx缓存服务器上的静态文件 [https://yq.aliyun.com/articles/752967](https://links.jianshu.com/go?to=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F752967) (2)proxy\_cache nginx 反向代理之 proxy\_cache [https://www.cnblogs.com/yyxianren/p/10832172.html](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.cnblogs.com%2Fyyxianren%2Fp%2F10832172.html) (3)Nginx使用upstream负载均衡和proxy\_cache缓存实现反向代理 [https://blog.51cto.com/13770206/2163952](https://links.jianshu.com/go?to=https%3A%2F%2Fblog.51cto.com%2F13770206%2F2163952)