`
saiyaren
  • 浏览: 228011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx cache静态化+tmpfs 高性能cdn方案 原创-胡志广

阅读更多

1       摘要

本文档主要分为3部分内容:

(1)       解决不同URL访问不同后端的nginx配置方法

(2)       Nginx cache和内存文件系统的配置方法

(3)       Proxy cache的详细配置内容

2       匹配不同URL访问不同后端

如果想通过访问不同类别URL分配到不同的后端通过nginx实现,首先举个例子,将需求场景进行描述:

域名为:www.xxx.com  (本机IP192.168.12.63)

域名下有3个目录productcartgoods,这3个目录分别为不同业务,那么我们打算访问3个不同目录下的内容时分别分配到不同的后端进行处理,如访问www.xxx.com/product/xxx.html,那么我们预设是下面3类情况:

访问product下的资源时分配到127.0.0.1:8081127.0.0.1:8082

访问cart下的资源时分配到127.0.0.1:8083127.0.0.1:8084

访问goods下的资源时分配到192.168.12.34:8081192.168.12.34:8082

如果要满足上述需求,那么我们就需要用到nginxupstream模块和rewriteif模块配合

首先我们需要配置3个后端,分别满足3种不同业务分配,配置如下:

         #product业务的后端

upstream product_tomcats{

                   server 127.0.0.1:8081 weight=10;

                   server 127.0.0.1:8082 weight=10;

         }

         #cart 业务的后端

         upstream cart_tomcats{

                   server 127.0.0.1:8083 weight=10;

                   server 127.0.0.1:8084 weight=10;

         }

         #goods 业务的后端

         upstream goods_tomcats{

                   server 192.168.12.34:8081 weight=10;

                   server 192.168.12.34:8082 weight=10;

         }

配置好upstream后,我们配置匹配不同目录访问不同后端的内容,通过if语法来实现根据不同请求的url进程正则匹配,然后满足条件的分配到指定的后端,if语句用来实现判断不同URL分配后端配置的功能,具体配置(底色为绿色的内容)如下:

注:$request变量是获取 http methodGET POST)浏览器访问URL HTTP协议,如:

GET /goods/2222.html HTTP/1.1

location / {

                                     proxy_cache cache_one;

                                     proxy_cache_key "$host:$server_port$request_uri";

                                     proxy_cache_valid  200 304 20m;

                                     rewrite /product/([0-9]+)\.html /index.jsp?id=$1 last;

                                     rewrite /cart/([0-9]+)\.html /index1.jsp?id=$1 last;

                                     rewrite /goods/([0-9]+)\.html /index2.jsp?id=$1 last;

#判断是否匹配product通过正则,如果匹配将请求转发到product_tomcats集群上

                                     if ($request ~* .*/product/(.*)){

                                                        proxy_pass http://product_tomcats;     

                                     }

#判断是否匹配cart通过正则,如果匹配将请求转发到cart _tomcats集群上

                                     if ($request ~* .*/cart/(.*)){

                                               proxy_pass http://cart_tomcats;  

                                     }

#判断是否匹配goods通过正则,如果匹配将请求转发到goods _tomcats集群上

                                     if ($request ~* .*/goods/(.*)){

                                               proxy_pass http://goods_tomcats;        

                                     }

                                     proxy_set_header Host $host;

                                     proxy_set_header X-Forwarded-For $remote_addr;

                                     add_header X-Cache '$upstream_cache_status from $host';

}       

 

这样通过upstream配置不同的后端集群组,然后通过if语法的正则匹配URL来分配到不同的集群组上来实现不同种类的URL 匹配访问不同后端处理。

3       Nginx cache

3.1     挂载内存文件系统

我们采用tmpfs内存文件系统,来做缓存文件系统,这样可以让系统不经过I/O提高效率。

挂载tmpfs:

mount tmpfs自定义名称 挂载位置 -t tmpfs -o size=分配空间大小

例:

mkdir /tmpfs

mount my_tmpfs /tmpfs -t tmpfs -o size=500m

 

动态调整tmpfs空间大小:

         mount 挂载位置 -o remount,size=重新分配空间大小

         例:

         mount /tmpfs -o remount,size=1024m

        

         卸载已挂载的tmpfs

umount /tmpfs

 

3.2     配置nginx cache

Nginx cache状态:

l  MISS 

l  EXPIRED - expired。请求被传送到后端。

l  UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。

l  STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。

l  HIT

 

proxy_cache_key 可采用2种配法,根据需求来定义:

(1)       通过浏览器获取的URLKEY

域名:端口 浏览器完整地址(包括动态参数,如:www.xxx.com:80/goods/1.html

         proxy_cache_key "$host:$server_port$request_uri";

(2)       通过真实的URL地址做KEY

         域名:端口 真实请求地址(不是rewrite后的) ? 参数

(www.xxx.com:80/index.jsp?id=111)

proxy_cache_key "$host:$server_port$uri$is_args$args";

         建议采用第一种

 

下面绿色位置是对缓存内容进行的配置,例:

…….

#日志配置

# $upstream_addr 请求后端的地址

# $upstream_status 请求后端响应状态

# $upstream_cache_status 缓存状态

log_format main  '$remote_addr - $remote_user [$time_local] '

"$request" $status $bytes_sent'

'"$http_referer""$http_user_agent"'

'"$gzip_ratio"'

'"addr:$upstream_addr-status:$upstream_status- cachestatus:$upstream_cache_status"' ;

…….

#缓冲代理请求,proxy_temp_path需要和proxy_cache_path在一个分区下

proxy_temp_path /tmpfs_cache/proxy_temp_path;

#缓存地址为/tmpfs_cache/proxy_cache_path,缓存目录级别分为2级,cache名称为cache_one,内存缓存空间大小为500M,自动清除超过1天未访问的缓存数据,缓存硬盘空间为15G

proxy_cache_path /tmpfs_cache/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=15g;

server {

        listen           80;

        server_name  www.xxx.com;

        charset               utf-8;

        access_log       logs/cache_test.access.log           main;

               error_log                   logs/cache_test.error.log     warn;

               autoindex                    on;

           index                           index.html;

        location / {

   #使用缓存cache_one上面proxy_cache_path中定义的key_zone=cache_one;

proxy_cache  cache_one;

#缓存key拼接规则:域名:端口 获取浏览器请求的URL完整地址

                               proxy_cache_key "$host:$server_port$request_uri";

                               #HTTP状态码200304的缓存20分钟

                               proxy_cache_valid  200 304 20m;

                               ………..

                               #获取proxy的真实域名

                               proxy_set_header Host $host;

                               proxy_set_header X-Forwarded-For $remote_addr;

                               #设置浏览器中的header可查看该页面的缓存状态

                               add_header X-Cache '$upstream_cache_status from $host';

            }       

        

3.3         proxy cache配置详细内容

3.3.1  proxy_cache_key

语法:proxy_cache_key line; 
默认值:$scheme$proxy_host$request_uri; 
使用字段:http, server, location 
指令指定了包含在缓存中的缓存关键字。

proxy_cache_key "$host$request_uri$cookie_user";

注意默认情况下服务器的主机名并没有包含到缓存关键字中,如果你为你的站点在不同的location中使用二级域,你可能需要在缓存关键字中包换主机名:

proxy_cache_key "$scheme$host$request_uri";

3.3.2  proxy_cache_methods

语法:proxy_cache_methods [GET HEAD POST]; 
默认值:proxy_cache_methods GET HEAD; 
使用字段:http, server, location 
GET/HEAD
用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:

proxy_cache_methods POST;

3.3.3  proxy_cache_min_uses

语法:proxy_cache_min_uses the_number; 
默认值:proxy_cache_min_uses 1; 
使用字段:http, server, location 
多少次请求后应答将被缓存,默认1

3.3.4  proxy_cache_path

语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]; 
默认值:None 
使用字段:http 
指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中,并且使用代理url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数,例如:

proxy_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;

文件名类似于:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c


可以使用任意的1位或2位数字作为目录结构,如 X, X:X,X:X:X e.g.: “2”, “2:2”, “1:1:2”,但是最多只能是三级目录。
所有活动的key和元数据存储在共享的内存池中,这个区域用keys_zone参数指定。
注意每一个定义的内存池必须是不重复的路径,例如:

proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;

proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;

proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;

如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive10分钟。
一个名为cache manager的进程控制磁盘的缓存大小,它被用来删除不活动的缓存和控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出max_size指定的值之后,超过其大小后最少使用数据(LRU替换算法)将被删除。
内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。
proxy_cache_path
proxy_temp_path应该使用在相同的文件系统上。

 

3.3.5  proxy_cache_valid

 

语法:proxy_cache_valid reply_code [reply_code ] time;

默认值:None

使用字段:http, server, location

为不同的应答设置不同的缓存时间,例如:

  proxy_cache_valid  200 302  10m;

  proxy_cache_valid  404      1m;

为应答代码为200302的设置缓存时间为10分钟,404代码缓存1分钟。

如果只定义时间:

 proxy_cache_valid 5m;

那么只对代码为200, 301302的应答进行缓存。

同样可以使用any参数任何应答。

  proxy_cache_valid  200 302 10m;

  proxy_cache_valid  301 1h;

  proxy_cache_valid  any 1m;

 

3
2
分享到:
评论

相关推荐

    CentOS7 自动化搭建Nginx+PHP7+Mysql+Docker+Docker-Compose Shell脚本

    CentOS7 自动化搭建Nginx+PHP7+Mysql+Docker+Docker-Compose Shell脚本,Docker version 18.06.1-ce,docker-compose version 1.22.0

    nginx-1.7.11.3-Gryphon+rtmpModule+Native HLS Playback插件+ffmpeg-x

    它的特点是并发处理能力强,稳定性高,尤其适合处理静态内容和作为反向代理。在这个版本中,1.7.11.3是Nginx的一个特定版本,Gryphon可能是对Nginx的一个定制或增强版,它可能包含了一些优化或特定功能以适应流媒体...

    notepad++编辑nginx配置文件支持高亮

    Nginx是一款高性能的HTTP和反向代理服务器,其配置文件通常以.conf为扩展名,包含了一系列指令来定义服务器的行为。这些文件结构清晰,但如果没有语法高亮,查看和调试时可能会增加视觉疲劳,降低工作效率。为了改善...

    FastDFS+Nginx+libfastcommon+fastdfs-nginx-module

    《搭建FastDFS+Nginx+libfastcommon+fastdfs-nginx-module系统详解》 FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡的问题,尤其适合以文件为载体的在线服务,如图片...

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+tomcat7+jdk1.7+redis--jar.rar

    标题 "nginx+tomcat7+jdk1.7+redis--jar.rar" 提示我们这是一个关于在Web服务器架构中集成Nginx、Tomcat7、Java 1.7和Redis的解决方案,特别是涉及到使用Redis作为Session缓存的配置。描述中强调了在下载和使用这些...

    fastdfs+nginx+nginx所需依赖+fdfs-nginx

    在IT领域,构建高效、可扩展的Web服务是至关重要的,而FastDFS和Nginx的结合使用就是一种常见的解决方案。FastDFS是一个开源的、高性能的分布式文件系统,主要用于解决大容量存储和负载均衡的问题。Nginx则是一款...

    ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台

    ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台。 使用说明(ffmpeg+nginx+rtmp-module已经整合,支持HTTP,具体配置查看conf/nginx.conf): 1.解压后,运行nginx_start.bat。(查看监控状态 ...

    技术领域+nginx+反向代理+nginx-1.22.0版本压缩包+vue前端nginx部署

    支持前端代码静态部署

    Windows下一站式搭建ffmpeg推流+nginx-http-flv-module直播拉流+FLV.js播放环境.rar

    1、在Windows系统下,搭建ffmpeg推流+nginx-http-flv-module直播拉流+FLV.js播放环境,所需依赖相关资源文件。 2、适合初学、研究、验证视频直播部署方案的相关技术人员。

    nginx+fastDFS+libfastcommon+fastdfs-nginx-module

    标题 "nginx+fastDFS+libfastcommon+fastdfs-nginx-module" 涉及到的是一个集成的网络服务解决方案,用于高效地管理和分发文件。这个组合包括了以下几个关键组件: 1. **Nginx**: Nginx 是一款高性能的 HTTP 和反向...

    nginx-1.2.6+openssl-1.0.2c+pcre-8.36+zlib-1.2.8【nginx全套linux环境搭建包】.rar

    Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于各种高并发场景。本环境搭建包包含了Nginx、OpenSSL、PCRE(Perl Compatible Regular Expressions)和Zlib四个关键组件,它们各自扮演着不可或缺...

    nginx+ffmpeg+nginx-http-flv-module+html资源包

    1. **Nginx**: Nginx是一款高性能的Web服务器,也常被用作反向代理、负载均衡器和邮件服务器。它的事件驱动模型和非阻塞I/O机制使其在高并发环境下表现优秀。在本资源包中,提供的`nginx-1.20.2.tar.gz`是Nginx的...

    nginx-1.24.0-Gryphon+rtmpModule+Native HLS Playback插件+ffmpeg-x

    它增强了Nginx的基本功能,以满足更高的性能需求和特定的使用场景。 RTMP(Real-Time Messaging Protocol)模块是Nginx的一个扩展,使得Nginx能够支持实时流媒体服务。RTMP协议常用于视频直播和点播,允许服务器...

    vue+Tornado+Nginx+Mysql--后台代码

    Tornado 是一个高性能的Python Web服务器和异步网络库,特别适合处理大量的并发连接,如Websocket和长轮询。Tornado 使用非阻塞I/O模型,使其在高并发场景下表现出色。在本项目中,Tornado 作为后端服务器,负责处理...

    nginx + nginx-http-flv-module-1.2.9

    Nginx 是一款采用事件驱动架构的高性能 Web 服务器,以其并发处理能力、稳定性以及低内存占用而闻名。它不仅可以用作静态内容的 Web 服务器,还可以作为反向代理、负载均衡器和邮件代理服务器。 2. **HTTP FLV ...

    Nginx++Keepalived+Tomcat负载均衡&动静分离

    Nginx++Keepalived+Tomcat负载均衡&动静分离配置 本文主要介绍了Nginx、Keepalived和Tomcat的负载均衡和动静分离配置,旨在帮助读者了解如何搭建高可用、高性能的Web应用系统。 一、环境准备 在开始配置之前,...

    Notepad++ 自定义 nginx.conf 文件语法高亮的配置文件

    Notepad++ 自定义 nginx.conf 文件语法高亮的配置文件 使用教程:点击语言-自定义语言格式-导入(下载的xml文件)-重启notepad++,即可使用

    Nginx+tomcat+redis

    在构建高性能、高可用性的Web服务时,"Nginx+Tomcat+Redis"的组合是一种常见的架构模式。这个架构充分利用了每个组件的优势,以实现高效的数据处理、动态内容渲染和负载均衡。以下是对这套技术栈的详细解释: 1. **...

    libfastcommon-master+FastDFS_v5.05+fastdfs-nginx-module_v1.16+fdfsutil

    Nginx作为高性能的反向代理服务器,可以有效分发文件请求,减轻后端FastDFS的压力,同时提供更好的静态资源处理能力。fastdfs-nginx-module_v1.16可能优化了与FastDFS的交互,提升了文件访问速度和稳定性。 ...

Global site tag (gtag.js) - Google Analytics