Nginx缓存加速

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx缓存加速相关的知识,希望对你有一定的参考价值。

一、nginx缓存概述

  • 提供与Squid类似的缓存,把URL以及相关信息当成key,用MD5编码哈希后,把数据文件保存在硬盘上,并且只能为指定的URL或者状态码设置过期时间,并不支持类似 squid的purge命令来手动清除指定缓存页面,但是可以通过第三方的ngx_cache_purge来清除指定的URL缓存
  • Nginx的缓存加速功能是由proxy_cache(用于反向代理和静态缓存)和fastcgi_cache(php动态缓存)两个功能模块完成

1.proxy_cache原理

技术分享图片

2.Nginx缓存特点

  • 缓存稳定,运行速度与Squid相差无几(因为都使用硬盘缓存)
  • 对多核CPU的利用率比其他的开源软件好
  • 支持高并发请求数,能同时承受更多的访问请求

3.Nginx缓存、Varnish、Squid对比

  • Squid:应用较早,支持传统、透明、反向等功能的一款应用软件,设置较复杂,一般配合CDN
  • Varnish:新兴软件,设计简单,使用内存缓存数据(快)
  • Nginx缓存:需通过调用模块实现缓存功能,基于硬盘缓存数据

二、案例:Nginx缓存加速


技术分享图片

主机 系统 IP 网卡 软件
Nginx Centos 6.7 64Bit 192.168.1.10 vmnet1 nginx nginx_cache_purge
Web(Apache) Centos 6.7 64Bit 192.168.1.100 vmnet1 httpd

Nginx

1.环境准备

vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0                             //网卡名称
        TYPE=Ethernet                           //网卡类型为以太网
        ONBOOT=yes                          //开机自启该网卡
        NM_CONTROLLED=no                        //关闭NetworkManager
        BOOTPROTO=static                        //网卡设置为静态方式
        IPADDR=192.168.1.10                     //IP地址配置
        NETMASK=255.255.255.0                   //子网掩码配置
/etc/init.d/network restart

2.安装Nginx

yum -y install pcre pcre-devel          //安装依赖包
tar -zxvf ngx_cache_purge-2.0.tar.gz -C /usr/src/
//解压nginx模块(用于支持Nginx缓存)
tar -zxvf nginx-1.6.0.tar.gz -C /usr/src/   //解压Nginx软件源码到/usr/src/目录
cd /usr/src/nginx-1.6.0/                //进入Nginx解压目录
useradd -M -s /sbin/nologin nginx       //新建Nginx运行用户
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre --add-module=/usr/src/ngx_cache_purge-2.0/

选项
--prefix=/usr/local/nginx:指定Nginx安装目录为/usr/local/nginx
--user=nginx:指定Nginx运行用户为nginx
--group=nginx:指定Nginx运行组为nginx
--with-http_stub_status_module:开启状态统计(一个简单的页面,显示访问量等)
--with-pcre:启用pcre库支持
--add-module=/usr/src/ngx_cache_purge-2.0/:指定需额外加载模块的目录位置

make && make install                            //编译并安装
echo "PATH=$PATH:/usr/local/nginx/sbin">>/etc/profile
//将Nginx命令路径加入PATH变量,这时在任意位置都可使用Nginx相关命令
source /etc/profile                         //立即生效该PATH变量

3.配置Nginx

vim /usr/local/nginx/conf/nginx.conf            //编辑Nginx主配置文件
        user  nginx nginx;
                //指定Nginx运行用户和组
        worker_processes 1;
                //启动进程数(根据物理CPU个数设置)
        error_log  logs/error.log  crit;
                //定义错误日志,记录级别为crit(关键事件)
        pid        logs/nginx.pid;
                //指定PID文件(存储程序进程号)位置
                worker_rlimit_nofile 65535;
                //打开文件的最大句柄数
        events {
            use epoll;
                        //使用epoll网络I/O模型,优化Nginx
            worker_connections  65535;
                        //每个工作进程允许最大的同时连接数,该值与最大句柄书保持一致
        }
        http {
            include       mime.types;
                        //额外加载该文件
            default_type  application/octet-stream; 
                        //默认响应为文件流
            charset utf-8;  
                        //定义网站默认采用字符集
            sendfile        on;
                        //打开系统函数sendfile(),提高性能
            tcp_nopush     on;
                        //sendfile开启后才生效,调用tcp_cork方法
            keepalive_timeout  65;
                        //会话保持时间,指定时间内客户端无访问请求,断开连接,需连接时重新请求
            client_body_buffer_size 512k;
                        //配置body缓冲区大小(当用户上传内容超出缓冲区(内存)大小,会使用"client_body_tmp_path"选项临时将文件部分或全部写入到临时文件中做处理;默认为系统页两倍大小"getconf PAGESIZE"查看页大小;"client_max_body_size"设置上次文件最大值)
            proxy_connect_timeout 5;
                        //后端服务器连接的超时时间(发起握手等候响应超时时间),不能超过75秒
            proxy_read_timeout 60;
                        //连接成功后,等候后端服务器响应时间,决定了nginx会等待多长时间来获得请求的响应(也可以说是后端服务器处理请求的时间)
            proxy_send_timeout 5;
                        //后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据,如果超时后,upstream没有收到新的数据,nginx会关闭连接
                        proxy_buffer_size 16k;  
                        //从后端服务器响应头缓存区大小
                        proxy_buffers 4 64k;
                        //设置代理响应缓冲区的数量和大小
            proxy_busy_buffers_size 128k;
                        //proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它将继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中
            proxy_temp_file_write_size 128k;
                        //代理服务器的响应过大时Nginx一次性写入临时文件的数据量,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k
            proxy_temp_path /var/cache/nginx/cache_temp;
                        //当后端服务器的响应过大不能存储到配置的缓冲区域时,Nginx存储临时文件硬盘路径,目录自动新建
            proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
                        //定义缓存存储目录,目录下生成两级子目录,由 levels=1:2设置,第一层目录只有一个字符,第二层目录名字由二个字符组成,区域键值名称为cache_one(名字随意),在内存中缓存的空间大小为200MB,1天内没有被访问的缓存将自动清除(cache manager进程),最大硬盘空间缓存30GB
注:proxy_temp_path 与 proxy_cache_path 指定的路径必须在同一分区
            upstream backend_server {
                        //定义后端服务器节点,名称任意
server 192.168.1.100:80 weight=1 max_fails=2 fail_timeout=30s;
            }
            server {
                listen       80;
                                //定义服务器监听端口
                server_name  192.168.1.10;
                                //定义服务器名及监听IP
                index  index.html index.htm;
                                //Nginx首页支持页面
                location / {
                                //匹配客户端所有请求,执行如下操作
                    proxy_next_upstream http_502 http_504 error timeout invalid_header;
                                        //当后端服务器返回502、504、错误等状态码,自动跳转到upstream负载均衡池中的另一台服务器,实现故障转义
                    proxy_cache cache_one;
                                        //当前网页数据缓存到上述定义位置
                    proxy_cache_valid 200 304 12h;
                                        //针对200、304状态码缓存12小时
                    proxy_cache_key $host$uri$is_args$args;
                                        //定义缓存Key值的格式,Nginx将Key值HASH后再存储到指定的二级缓存目录(如果"levels=1"定义的是一级目录,那么就存储到一级缓存目录)中;上述Key值存储格式为(请求主机、请求的URL、如果$args设置为?,否则为空、GET请求中的参数)
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
                    proxy_pass http://backend_server;
                                        //指定跳转服务器池,名字要与upstream设定的相同,访问当前服务器自动转发请求给后端服务器
                                        expires 1d;
                                        //指定客户端浏览器缓存数据时间
                }
                location ~ /purge(/.*) {
                                //匹配所有以/purge/开头的页面请求,都将执行如下操作
                    allow 127.0.0.1;
                                        //允许本地访问该地址
                    allow 192.168.1.0/24;
                                        //允许指定2.0网段访问
                    deny all;
                                        //其余网段全部拒绝访问该地址
                    proxy_cache_purge cache_one $host$1$is_args$args;
                                        //清除缓存(cache_one为之前定义的区域键值,$1即为位置变量(不要替换为$url,那将清除整个缓存),后面为请求参数,即清除指定缓存Key)
                }
                location ~ .*.(php|jsp|cgi)?$ {
                                //匹配所有以.php、.jsp、.cgi结尾的页面请求,都将执行如下操作
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $remote_addr;
                    proxy_pass http://backend_server;
                                        //所有为.php、.jsp、.cgi结尾的请求都将转发给后端服务器,不缓存内容(因此动态页面不需缓存,内容会随时发生改动)
                }
                                //余下配置文件自带内容可全部删除,使用dG删除
            }
        }
mkdir /var/cache/nginx                  //创建Nginx临时和缓存存储目录
nginx -t                                    //检测Nginx配置文件是否有误

注:在运行"nginx -t"命令后,当文件确认无误后,会自动在指定目录下自动新建临时、缓存目录

ulimit -SHn 65535                   //设置系统句柄数,注意单次生效
nginx                               //运行Nginx服务,结束使用"pkill nginx"
netstat -utpln | grep 80                //查看80端口是否开启

Web(Apache)

vim /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0                             //网卡名称
        TYPE=Ethernet                           //网卡类型为以太网
        ONBOOT=yes                          //开机自启该网卡
        NM_CONTROLLED=no                        //关闭NetworkManager
        BOOTPROTO=static                        //网卡设置为静态方式
        IPADDR=192.168.1.100                    //IP地址配置
        NETMASK=255.255.255.0                   //子网掩码配置
/etc/init.d/network restart
yum -y install httpd                    //安装apache服务
echo "This is Web1">/var/www/html/index.html
//给第一台Web服务器编写测试页面
/etc/init.d/httpd start && chkconfig --level 35 httpd on
//启动httpd服务并设置为开机自启

测试

缓存测试

IE --> http://192.168.1.10(Nginx服务器IP
技术分享图片

ls -R /var/cache/nginx/proxy_cache/ 
//(在Nginx缓存服务器)递归查看目录下内容,可以看见,刚才访问的页面已经缓存下来,并存储在../c/43/目录下

技术分享图片
清除缓存

IE --> http://192.168.1.10/purge/ //手动清除页面缓存
技术分享图片

ls -R /var/cache/nginx/proxy_cache/
//(在Nginx缓存服务器)再次验证查看缓存目录,之前缓存的页面文件被清除

技术分享图片

以上是关于Nginx缓存加速的主要内容,如果未能解决你的问题,请参考以下文章

Nginx代理缓存加速服务器

varnish实现缓存加速

WEB 服务器 加速缓存比较

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

WordPress使用LiteSpeed缓存加速