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缓存加速的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题