初识nginx反向代理和缓存机制

Posted 李先生

tags:

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

实现的需求图:

 

 
环境:
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.0.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  1;

events {
    worker_connections  1024;
}


http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

    server {
        listen      80;
        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  1;

events {
    worker_connections  1024;
}


http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

    proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g;
    
    server {
        listen      80;
        server_name  localhost;
        }
              
        location / {
                 proxy_cache cache_one;
                 proxy_cache_valid 200 304 302 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  1;

events {
    worker_connections  1024;
}


http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

    server {
        listen      80;
        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  1;

events {
    worker_connections  1024;
}


http {
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

    server {
        listen      80;
        server_name  localhost;
        }
            
        root /data;
        
 }

 

3:测试
 
访问真实机器的数据目录/data下的/hah/a.html

 

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

 

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

 

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

 

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

 

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

以上是关于初识nginx反向代理和缓存机制的主要内容,如果未能解决你的问题,请参考以下文章

Nginx初识

Varnish缓存机制详细介绍及简单配置

nginx 缓存机制

Nginx之反向代理日志格式集群缓存压缩URl 重写,读写分离配置

http缓存提高性能

Nginx学习历程