实现的需求图:

 
环境:
nginx缓存和反向代理服务器:192.168.0.224
实际存储数据机器:192.168.0.37

一、实现反向代理

1、安装nginx,两台服务器都需要安装

1)安装依赖包

yum -y install gcc make cmake ncurses-devel libxml2-devel libtool-ltdl-devel gcc-c++ autoconf automake bison zlib-devel pcre-devel openssl openssl-devel  

2)下载nginx

wget http://nginx.org/download/nginx-1.8.0.tar.gz

3)解压编译

tar -zxvf nginx-1.8..tar.gz
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make
make install

2、修改配置文件

这里只实现他的功能,并没有对配置文件做更多的修改
 
1)代理服务器:vim /usr/local/nginx/conf/nginx.conf
worker_processes  ;

events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on; keepalive_timeout ; server {
listen ;
server_name localhost;
} location / {
proxy_pass http://192.168.0.37/;
}
}
 
配置文件分析:
proxy_pass指令:用来设置被代理服务器的地址,可以是主机名称,IP地址加端口号等形式

2)真实数据服务器:改路径即可vim /usr/local/nginx/conf/nginx.conf

location /{
root /data;
index index.html index.php;
}
3)创建对应的文件夹
 
在192.168.0.37真实数据机器上:
mkdir /data
echo "I am realy server" >/data/index.html

3、两台机器上启动nginx

 /usr/local/nginx/sbin/nginx

4、测试

这里输入访问地址,可以看到他去真是的数据机器上取到了数据," location / "表示的是匹配到的任何内容,都去代理服务器上取,若要一部分在代理服务器上,另一部分在真实机器上取,可以根据自己的需求修改配置文件
 
 

二、缓存机制

 基于proxy_cache的缓存
 
 1:在反向代理的基础上,打开缓存机制,这样可以加快访问速度,只是添加几行配置,能实现缓存这个功能,其他具体的优化,安全之类的还没有仔细研究,先搭起来理解看怎么回事再细细研究其他的
worker_processes  ;

events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on; keepalive_timeout ; proxy_cache_path /usr/local/nginx/cache levels=: keys_zone=cache_one:500m inactive=1d max_size=30g; server {
listen ;
server_name localhost;
} location / {
proxy_cache cache_one;
proxy_cache_valid 24h;
proxy_pass http://192.168.0.37/;
}
}

2:查看他的进程多了缓存

3:配置文件主要添加了三行:
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g;
 
proxy_cache_path:表示缓存文件存放的路径,该路径是预先就要创建好的
levels=1:2 :   设置在相对于path指定目录的第几级hash目录中缓存数据,levels=1,表示一级hash目录,levels=1:2,表示两级hash目录,目录的名称是基于请求URL通过哈希算法得到的
keys_zone=cache_one:500m : 设置缓存名字
inactive=1d   : 强制更新时间,在指定时间内没人访问,就删除缓存
max_size=30g  : 设置硬盘中缓存数据的大小限制,最大缓存空间
 
proxy_cache cache_one;
表示这个server使用上面设置的那个cache
 
proxy_cache_valid 200 304 302 24h;
针对不同的HTTP响应状态设置不同的缓存时间,如果不设置,nginx服务器只为HTTP状态代码为200,301和302的响应数据做缓存
使用any可以表示缓存所有该指令中未设置的其他响应数据,如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
表示的是对返回状态为200,302的响应数据缓存10分钟,对返回状态码为301的响应数据缓存1小时,非200,302,301返回状态的响应数据缓存1分钟
4:测试:
 
1)当你第一次访问目录时,得到的结果是,如下:

2)可以进入到缓存目录看一下它的目录结构: 
目录的名称是基于请求URL通过哈希算法获取到的
/usr/local/nginx/cache/d/91/972fbe600d30f1cc92495981969ff91d

查看一下具体的内容:

3)然后把真实数据服务器的nginx给停掉,再一次访问,还是可以得到

4)然后把代理服务器的缓存数据给删除,再一次访问,得到结果:说明从缓存没有找到,然后代理转发到真是的服务器也没找到,这就说明了第二次访问的是缓存数据的内容

5)使用tcpdump抓包看看他的走向:
在客户端192.168.0.222 访问192.168.0.224,可以elinks 192.168.0..224
在代理服务器这里使用tcpdump抓包,可以看到他确实是从192.168.0.37去取得数据
tcpdump -i eno16777736 host 192.168.0.224 and 192.168.0.37 and tcp port 80

第二次再去访问,还是监听这个80端口,可以发现tcpdump没有任何数据,说明它直接从缓存里读取了,你可以把缓存删了,再次在客户端访问,可以看到它又有数据了

基于proxy_store的缓存

1:修改反向代理的配置文件

worker_processes  ;

events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on; keepalive_timeout ; server {
listen ;
server_name localhost;
} location / {
root "/web1";
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path "/web1";
if ( !-f $request_filename )
{
proxy_pass http://192.168.0.37;
}
}
}
 
通过location的 if 条件判断驱动nginx代理服务器与后端服务器通信和web缓存;判断请求的资源在nginx代理服务器上是否存在,如果不存在就通过后端服务器获取数据,然后回传给客户端,同时使用proxy store进行缓存。
 
用户一访问的时候,主目录为/web1,如果里面没有用户需要的数据,就去代理取,然后缓存到自己的主目录,下次再访问同样的资源的时候,就能在缓存这里得到数据

创建文件夹:

mkdir /web1

2:真实数据服务器的配置文件

worker_processes  ;

events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on; keepalive_timeout ; server {
listen ;
server_name localhost;
} root /data; }
3:测试
 
访问真实机器的数据目录/data下的/hah/a.html

在代理服务器的缓存目录下可以看到缓存到的数据和真实数据服务器的目录结构一样:(这个与proxy cache不一样)

把代理缓存的a.html改一下:

再次访问的时候,返回的数据如下,说明它第二次访问的是缓存

proxy store 与proxy cache的区别:proxy store不提供缓存过期更新,内存索引建立等功能,缓存文件一直会保存在本地磁盘中。

注:学习《nginx高性能Web服务器详解》的时候总结

初识nginx反向代理和缓存机制的更多相关文章

  1. Nginx 反向代理并缓存及缓存清除

    Nginx 反向代理并缓存及缓存清除 原文地址:http://www.cnblogs.com/caoguo/p/5012447.html 一. Nginx 配置 #user nobody; worke ...

  2. Nginx 反向代理可以缓存 HTTP POST 请求页面吗?

    摘要: Nginx 反向代理可以缓存 HTTP POST 请求页面吗?  2017-09-05 景峯 Netkiller 本文节选自<Netkiller Web 手札> 作者:netkil ...

  3. nginx反向代理、缓存及压缩配置实战

    一.反向代理配置 (原文链接:http://www.studyshare.cn/blog/details/1155/0  ) 准备:两个项目分别使用端口8080,8081,只有一个备案域名,配置如下 ...

  4. 项目实战1—LNMP的搭建、nginx反向代理和缓存等的实现

    实战一:搭建lnmp及类小米等商业网站的实现 环境:关闭防火墙,selinux 1.安装包,开启服务 yum -y install nginx mariadb-server php-fpm php-m ...

  5. 动态PHP电商网站伪静态的 Nginx反向代理Cache缓存终极设置

    转自: http://www.ttlsa.com/nginx/dynamic-php-nginx-cache/

  6. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  7. 6、nginx的反向代理及缓存功能

    nginx模块的应用 ngx_http_proxy_module  nginx 反向代理模块: http://nginx.org/en/docs/http/ngx_http_proxy_module. ...

  8. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  9. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

随机推荐

  1. MATLAB绘图功能(2) 二维底层绘图修饰

    文末源代码 部分源代码   % x=0:0.1:2*pi; % y=sin(x); % plot(x,y); % line对象 % h = line([-pi:0.01:pi],sin([-pi:0. ...

  2. HDU - 1061-快速幂签到题

    快速幂百度百科:快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. HDU - 1061 代码实现如下: import java.util.Sc ...

  3. 在线自动创建springboot工程

    https://start.spring.io/

  4. 第5天(半天)【shell编程初步、grep及正则表达式】

    第5天(半天)[shell编程初步.grep及正则表达式] shell编程初步(01)_recv shell脚本:文本文件 #!:/bin/bash #!:/usr/bin/python #!:/us ...

  5. Java入门自学笔记

    一.变量 变量需要一个名字,变量的名字是一种“标识符”,意思是它是用来识别这个和那个的不同的名字. 标识符的构造规则:只能有字母.数字和下划线组成,数字不能在首位,java的关键字(保留字)不可以用做 ...

  6. LCA最近公共祖先模板代码

    vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cma ...

  7. centos打开matlab的正确姿势

    进入usr/local/MATLAB/R2015b/bin ./matlab

  8. CHECK约束表达式

    1.性别:只能填写'男'和'女' (字段名='男'or 字段名='女') 注意:单引号里的值可以为其他任何字 2.规定密码长度不能小于6位数 (len([字段名])>(5))   3.例:成绩在 ...

  9. java中有关初始化的问题

    在类的内部,变量定义的先后顺序决定了初始化顺序,即使变量定义分散在方法定义之外,它们依旧会在任何方法(包括构造器)被调用之前得到初始化 其中初始化的顺序先是静态对象,其后是非静态对象 例如: clas ...

  10. http/ftp等的URL匹配正则表达式 ZT

    网上流传着多种匹配URL的正则表达式版本,但我经过试验,最好用的还是从stackoverflow上查到的: (https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_| ...