使用Nginx的proxy_cache缓存功能取代Squid

本文介绍如何使用Nginx实现Web缓存及清除指定URL缓存的方法,并展示了如何配置Nginx以实现高效的负载均衡。文章还提供了详细的安装步骤及配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。

  Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。

   最新的Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。我们已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。

  在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。 而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
  


  1、Nginx 负载均衡与缓存服务器在 Linux 下的编译安装:
ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
tar zxvf pcre-8.00.tar.gz
cd pcre-8.00/
./configure
make && make install
cd ../

wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
tar zxvf ngx_cache_purge-1.0.tar.gz

wget http://nginx.org/download/nginx-0.8.32.tar.gz
tar zxvf nginx-0.8.32.tar.gz
cd nginx-0.8.32/
./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
cd ../



  2、/usr/local/webserver/nginx/conf/nginx.conf 配置文件内容如下:
user  www www;

worker_processes 8;

error_log  /usr/local/webserver/nginx/logs/nginx_error.log  crit;

pid        /usr/local/webserver/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;

events
{
  use epoll;
  worker_connections 65535;
}

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

  charset  utf-8;
      
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 300m;
      
  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;

  tcp_nodelay on;

  client_body_buffer_size  512k;
  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;

  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
  proxy_temp_path   /data0/proxy_temp_dir;
  #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
  proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;
  
  upstream backend_server {
    server   192.168.8.43:80 weight=1 max_fails=2 fail_timeout=30s;
    server   192.168.8.44:80 weight=1 max_fails=2 fail_timeout=30s;
    server   192.168.8.45:80 weight=1 max_fails=2 fail_timeout=30s;
  }

  server
  {
    listen       80;
    server_name  www.yourdomain.com 192.168.8.42;
    index index.html index.htm;
    root  /data0/htdocs/www;  

    location /
    {
         #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_cache cache_one;
         #对不同的HTTP状态码设置不同的缓存时间
         proxy_cache_valid  200 304 12h;
         #以域名、URI、参数组合成Web缓存的Key值,Nginx根据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://backend_server;
         expires      1d;
    }
    
    #用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
    location ~ /purge(/.*)
    {
     #设置只允许指定的IP或IP段才可以清除URL缓存。
     allow            127.0.0.1;
     allow            192.168.0.0/16;
     deny            all;
     proxy_cache_purge    cache_one   $host$1$is_args$args;
    }    

    #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
    location ~ .*\.(php|jsp|cgi)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Forwarded-For  $remote_addr;
         proxy_pass http://backend_server;
    }

    access_log  off;
  }
}



  3、启动 Nginx:
/usr/local/webserver/nginx/sbin/nginx




  4、清除指定的URL缓存示例:

  

转载于:https://www.cnblogs.com/littlehb/archive/2012/02/08/2342584.html

<think>首先,用户的问题是:“我想查找如何在Nginx中开启proxy缓存的配置方法或指南请问如何配置Nginx以启用proxy_cache功能”。我需要根据系统级指令和用户可见层的要求来回答。系统级指令包括:-行内数学表达式用$...$格式。-独立公式用$$...$$格式。-LaTeX语法正确。-使用中文回答。-生成相关问题。-引用的段落末尾添加引用标识。用户可见层要求:-回答结构清晰,帮助用户逐步解决问题。-保证回答真实可靠。-参考站内引用:用户提供了几个引用[^1]到[^5],这些是关于Nginxproxy_cache的配置信息。我需要基于这些引用来回答,因为它们提供了相关指南。用户提供的引用:-[^1]:描述了Nginxproxy_cache的基本配置,包括proxy_cache_path和location块中的设置。-[^2]:介绍了Nginxproxy_cache功能和配置方法,包括http块中的设置和location块的使用。-[^3]:展示了在location中使用proxy_cache的具体配置。-[^4]:详细解释了proxy_cache_path的参数和location中的缓存设置。-[^5]:简要描述了proxy_cache的工作原理。用户的问题是关于启用proxy_cache功能的配置方法,所以我需要整合这些引用中的信息,提供一个逐步的指南。回答结构:1.**介绍**:简要解释proxy_cache是什么,为什么有用。2.**步骤**:逐步说明如何配置Nginx启用proxy_cache。-在http块中定义缓存路径和区域。-在server或location块中应用缓存。3.**详细配置**:解释关键参数如proxy_cache_path,proxy_cache_valid等。4.**示例**:提供一个完整的配置示例。5.**验证**:如何验证配置是否生效。6.**注意事项**:提到一些最佳实践或常见问题。7.**相关问题**:根据指令生成相关问题。由于指令要求生成相关问题,我需要在回答结束时添加“相关问题”部分。语言:所有内容用中文。引用添加:在引用的段落末尾自然地添加引用标识,如[^1]。现在,整理引用中的关键点:-定义缓存路径:proxy_cache_path指定磁盘缓存路径,keys_zone定义内存区域。-在location中使用proxy_cache指令指定使用缓存区域。-参数:proxy_cache_valid定义缓存有效期,proxy_cache_key定义缓存键。-其他设置:如proxy_set_header,expires等。基于引用,我可以构建一个清晰的指南。最终回答结构:1.介绍Nginxproxy_cache。2.配置步骤:a.在nginx.conf的http块中添加proxy_cache_path。b.在server块中定义location,使用proxy_cache。3.解释参数。4.提供完整示例。5.如何重启和验证。6.注意事项。7.相关问题。生成相关问题:-例如:如何优化Nginx缓存性能?如何处理缓存失效?-基于主题,如:缓存清理方法、不同状态码的处理等。确保LaTeX:用户的问题中没有数学表达式,所以可能不需要使用,但如果有涉及,要正确处理。这里可能没有数学内容。</think>### 配置Nginx启用proxy_cache功能指南 Nginx的`proxy_cache`功能允许将后端服务器的响应缓存到磁盘或内存中,从而提升性能并减少后端负载。这在反向代理场景中非常有用,尤其适用于静态资源或高并发请求的处理[^5]。以下是基于Nginx官方文档和最佳实践的配置方法,我将分步说明。配置前请备份`nginx.conf`文件,并确保Nginx版本在0.8.x以上(该功能在此版本后引入)[^2]。 #### 步骤1: 在http块中定义缓存路径和内存区域 在`nginx.conf`文件的`http`块内,添加`proxy_cache_path`指令来定义缓存存储位置和参数。关键参数包括: - `path`: 指定磁盘缓存目录(需确保Nginx有写入权限)。 - `levels`: 设置缓存文件的目录层级结构(例如`levels=1:2`表示一级子目录用1个字符命名,二级用2个字符)。 - `keys_zone`: 定义内存区域名称和大小(用于存储缓存键)。 - `inactive`: 设置未访问缓存的自动清除时间(如`7d`表示7天)。 - `max_size`: 指定磁盘缓存的最大容量(超过时触发LRU淘汰)。 示例配置: ```nginx http { # 定义缓存路径和区域(路径需与proxy_temp_path在同一分区) proxy_temp_path /tmp/proxy_temp_dir; # 临时文件目录 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:100m inactive=7d max_size=10g; # 解释:my_cache缓存区名称,100m内存大小,10g磁盘上限,7天未访问则清除[^4][^2] } ``` #### 步骤2: 在server或location块中启用缓存 在具体的`server`或`location`块中,使用`proxy_cache`指令应用缓存。关键指令包括: - `proxy_cache`: 指定使用缓存区域名称(与`keys_zone`一致)。 - `proxy_cache_valid`: 设置不同HTTP状态码的缓存有效期(如`200`状态码缓存10天)。 - `proxy_cache_key`: 定义缓存键的生成规则(通常基于URI或参数)。 - `proxy_pass`: 指定后端服务器地址。 - 可选优化:添加`proxy_cache_lock on;`防止缓存击穿(多个请求未命中时,仅一个回源)[^4]。 示例配置(针对特定URL路径): ```nginx server { listen 80; server_name example.com; location /media/ { # 匹配/media/路径的请求 proxy_cache my_cache; # 启用my_cache缓存proxy_cache_valid 200 206 304 10d; # 成功响应缓存10天 proxy_cache_valid 404 302 1d; # 错误或重定向缓存1天 proxy_cache_key $uri$is_args$args; # 缓存键包含URI和参数 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://backend_server/media_store.php/media/; # 后端地址[^1][^3] } } ``` #### 步骤3: 重启Nginx并验证配置 1. **重启Nginx**: ```bash nginx -t # 测试配置语法是否正确 nginx -s reload # 重新加载配置[^2] ``` 2. **验证缓存是否生效**: - 访问配置的URL(如`http://example.com/media/test.jpg`)。 - 检查缓存目录(如`/data/nginx/cache`),如果生成子目录和文件(如`a/bc/xxx`),表示缓存成功[^2]。 - 使用`curl -I`查看响应头,若出现`X-Cache-Status: HIT`,则缓存命中。 #### 注意事项 - **路径权限**:确保Nginx用户(如`www-data`)对缓存目录有读写权限,否则缓存失败。 - **缓存键设计**:`proxy_cache_key`需唯一(如包含`$args`避免参数不同导致缓存覆盖)。 - **性能影响**:缓存适合静态内容,动态API建议结合`proxy_cache_bypass`跳过。 - **清理缓存**:手动删除缓存目录文件或使用第三方模块(如`ngx_cache_purge`),Nginx本身无内置清理命令[^2]。 > 引用说明:以上配置基于Nginx社区最佳实践,`proxy_cache`通过将URL哈希后存储到磁盘实现高效缓存,性能优于传统Squid[^2][^5]。关键参数如`levels`和`keys_zone`直接影响缓存组织效率[^4]。 #### 相关问题 1. 如何优化Nginx proxy_cache的性能以减少磁盘IO? 2. 如何处理Nginx缓存失效或强制刷新特定内容? 3. proxy_cache与其他缓存方法(如Redis)相比有哪些优缺点? 4. 如何为不同HTTP状态码(如404或500)设置差异化的缓存策略? 5. 在高并发场景下,proxy_cache的常见故障如何排查?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值