实现的需求图:

 
环境:
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. 性能测试的过程(jmeter)

    一.web性能测试的准备工作 1.项目背景 访问地址 访问环境:windows 2.需求 并发登陆的性能(要求多少个用户登录) 3.场景 60秒内运行100个线程 线程在20.50.100并发下的表现 ...

  2. MVC 深入讲解Routing _路由规则【八】

    一.客户端=>控制器 在项目中我们引用了system.web.routing, 如果第一个匹配成功了,那么后面的都不会再匹配. 1. routing的作用: 确定colltroller,确定ac ...

  3. 【百度地图API】如何获取行政区域的边界?(转载)

    转自:http://www.cnblogs.com/milkmap/archive/2012/04/11/2442430.html 摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界 ...

  4. RMAN 的优缺点及RMAN 备份及恢复步骤

    一. RMAN 备份的一些优点和OS命令备份方式相比,使用RMAN的优点 1  备份执行期间不需要人工干预,因此减少了误操作的机会:2  可以有效的将备份和恢复结合起来:3  支持除逻辑备份以外的所有 ...

  5. sql 同一个字段在查询结果中出现两次

    SELECT GET .daytime,    GET.data AS GET,    xh.data AS xh FROM    ( SELECT daytime, SUM ( get_sum ) ...

  6. python -- 面向对象-成员

    1.成员       在类中,你能写的所有内容都是类的成员   2.变量          1.实例变量:由对象去访问的变量,一般使用是  对象 . 属性 class Person: def __in ...

  7. 使用VBA,优化处理Excel表格

    前言 上周末,XX给我抱怨:因为计算绩效奖金,把2个人的工资发错了,还被扣了500元.问的缘由得知,她每个月要处理十来个excel表格,每次都要手动修改里面的值,如果修改了一处,其他地方也要修改,然后 ...

  8. ajax请求本地文件

    这是一个小随笔,真的很简短! 主要入坑点有两个 一.Chrome浏览器默认不支持ajax读取本地文件 解决:1.关闭所有Chrome网页 2.右击Chrome浏览器,打开“属性”     3.弹出属性 ...

  9. [Codeforces778E]Selling Numbers

    Problem 给一个由问号和数字组成的数字串A(问号表示任一数字). 再给定n个数字Bi,和0~9的数字的价值. F(x)表示x各个位数上的价值和.问A为何值时,sum(F(Bi+A))的值最大为多 ...

  10. Homework 2.0

    一.第一题,要求是输入不同的字符的时候输出不同的结果,这道题主要是运用输入和输出语言还有判断语句,分别使用switch和if else来进行输入字符的判断,本体比较简单,注意定义输入变量的类型为cha ...