自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 908|回复: 0
打印 上一主题 下一主题

【学习笔记】nginx反向代理

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-1-17 17:29:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
--nginx 反向代理

   client  10.1.1.x

   nginx(虚拟机1) 10.1.1.7

         web1(宿主机)  web2(虚拟机2)
    10.1.1.35:8000  10.1.1.9


第一步,安装nginx,过程可以和装lnmp时一模一样

# useradd nginx  --我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑
# id nginx  --nginx的uid,gid无所谓是多少
uid=517(nginx) gid=518(nginx) groups=518(nginx)
# tar xf nginx-1.8.0.tar.gz -C /usr/src/
# cd /usr/src/nginx-1.8.0/

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module
# make ;make install

-----------------------------------------------------------
如果在configure时报下面的错,表示默认使用了rewrite模块,需要用到pcre的库

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
解决方法:
第一种:
yum install pcre* --安装系统自带的pcre库文件就可以了

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module
# make ;make install

第二种:
自己下载pcre的源码先编,再编译nginx用--with-pcre来指定pcre的安装路径就可以了

# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module --with-pcre=/usr/local
# make ;make install

-----------------------------------------------------------------

--注意:下面这五个例子,是以静态页面来做测试,如果现在讨论动态页面(比如登录相关),下面的配置并不完整;并且这五个例子都是同网段做,如果换成双网段(后台web在内网)则会出现问题,需要使用后面综合例子里的proxy_set_header等指令来辅助

例一:使用前端nginx代理后面一台web
   client 10.1.1.x
   

   nginx  10.1.1.7

          web1
        10.1.1.35:8000

[root@li nginx]# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  5;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  65535;
}
http {
    server {
        listen       80;
        server_name  10.1.1.7;
root /nginxroot/;
        location /web1/ {
  proxy_pass http://10.1.1.35:8000/;
  }
}
}

# mkdir /nginxroot/
# echo "nginx main page" > /nginxroot/index.html

--启动
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx

--验证
找另一台客户端机器验证
# elinks 10.1.1.7  --得到10.1.1.7上nginx的主页
# elinks 10.1.1.7/web1/ --得到10.1.1.35上8000端口的web1主页

例二:使用前端nginx代理后端两台web,一个代理后台10的8000端口的web1,一个代理后台12的80端口的web2
   client  10.1.1.x

   nginx 10.1.1.7:80

         web1   web2
    10.1.1.35:8000  10.1.1.9:80

# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  5;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  65535;
    use epoll;
}
http {
    server {
        listen       80;
        server_name  10.1.1.7;
root  /nginxroot/;
        location /web1/    {
  proxy_pass http://10.1.1.35:8000/;
          }
        location /web2/ {
  proxy_pass http://10.1.1.9/;
          }
}
}

重启
[root@li nginx]# /usr/local/nginx/sbin/nginx -s stop
[root@li nginx]# /usr/local/nginx/sbin/nginx

验证
# elinks 10.1.1.7
# elinks 10.1.1.7/web1/
# elinks 10.1.1.7/web2/


例三:基于文件类型的反向代理(可用于做动静分离)
[root@li nginx]# cat conf/nginx.conf
user  nginx nginx;
worker_processes  5;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  65535;
}
http {
    server {
        listen       80;
        server_name  10.1.1.7;
root /nginxroot/;
        location /images/ {
  proxy_pass http://10.1.1.9/;   --这里后面得加/
  }
        location ~ \.(txt|php)$ {
  proxy_pass http://10.1.1.35:8000; --这里后面不能加/
  }
}
}

--这里是做的七层代理,上面的配置表示访问10.1.1.7/images/时会调给后面的12的80端口;访问任何以.txt或.php结尾的文件时会调给35的8000端口;其它的由11的nginx自己解析

重启  (省略)
验证  (省略)

例四:代理后端时使用负载均衡

# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  5;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  65535;
    use epoll;
}
http {
upstream backendweb {
server 10.1.1.35:8000 weight=1 max_fails=2 fail_timeout=1s;
server 10.1.1.9:80 weight=1 max_fails=2 fail_timeout=1s;
        }

    server {
        listen       80;
        server_name  10.1.1.7;
root  /nginxroot/;
        location ~ \.(txt|php)$ {
  proxy_pass http://backendweb;
  }
}
}

--上面配置的意思是:.txt或.php结尾的文件都去均衡的调度给35的8000端口和12的80端口;其它的由11的nginx自己解析
--upstream指令不要加到http {} 外面,也不要加到server{}里面

重启  (省略)
验证  (省略)
--验证时,会发现客户端针对同一个URL的访问也会一次web1一次web2,这说明nginx默认并没有squid或varnish那样的缓存功能


例五:使用ip_hash,实现同一IP客户端一旦调到一台,就一直调那一台
# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  8;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  65535;
    use epoll;
}
http {
upstream backendweb {
ip_hash;  --加上这句
server 10.1.1.35:8000 weight=1 max_fails=2 fail_timeout=1s;
server 10.1.1.9:80 weight=1 max_fails=2 fail_timeout=1s;
        }

    server {
        listen       80;
        server_name  10.1.1.7;
root  /nginxroot/;
        location ~ \.(txt|php)$ {
  proxy_pass http://backendweb;
  }
}
}
--nginx的ip_hash的意思是,如果一个客户端的访问被调度到其中一台后台服务器,那么同一个IP来的访问都只会被调到这个后台服务器;这里测试时,如果都用同一个网段的内网IP来做客户端测试,可能会都只转到一个后台(因为nginx的hash算法是按网段来算的,如果是公网不同网段的客户端IP就不一样了)

重启  (省略)
验证  (省略)

===================================================================


   client   1.1.1.129  
     |
     |      1.1.1.128
        nginx 反向代理   
     |      10.1.1.7
     |
     -----------
    |      |  命中  hit 直接返回
动态程序文件.php   |      |
    |            squid或varnish(web加速,缓存静态文件或图片)
直接找web   |      |   
     ----     |    没命中 miss 找后端web去取
    |     |  10.1.1.9
   lnmp  <---- |  
           
        10.1.1.35:8000
   li.cluster.com

实验前准备:
1,互相都在/etc/hosts里加主机名和IP的对应(三步)
下面我以squid机器的主机名配置为例
# hostname squid.cluster.com --马上生效,临时修改
# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=squid.cluster.com --改在这里,重启仍然生效
# vim /etc/hosts  --在这个文件,绑定架构里所有的机器的IP和主机名的对应,但不要修改默认的最前面的两行
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.35    li.cluster.com
10.1.1.9    squid.cluster.com
10.1.1.7    nginx.cluster.com

2,时间同步
在宿主机上搭建简单的内网时间同步服务器
# yum install xinetd -y
# vim /etc/xinetd.d/time-stream
disable = no   --yes改为no
# vim /etc/xinetd.d/time-dgram
disable = no   --yes改为no
# /etc/init.d/xinetd restart
# chkconfig xinetd on

# netstat -ntlup |grep :37 --端口为37
tcp        0      0 :::37                       :::*                        LISTEN      28330/xinetd        
udp        0      0 :::37                       :::*                                    28330/xinetd  
所有的需要同步时间的机器都使用下面的命令同步宿主机 (还可以放到crontab时间任务里周期性同步)
rdate -s 10.1.1.35

3,关闭iptables和selinux
# iptable -F
# iptables -t nat -F
# iptables -t mangle -F
# /etc/init.d/iptables save
# chkconfig iptables on

# setenforce 0  --让selinux由enforcing强制模式改为Permissive警告模式,临时生效
# vim /etc/sysconfig/selinux  
SELINUX=disabled --由enforcing改为disabled,那么重启机器后,selinux就会被永久关闭
4, 配置好yum
省略

第一大步:在上图中的lnmp上安装并配置后面的网站
把上次课的lnmp启动
(过程省略)

第二大步:在上图中的squid服务器上安装并配置squid
1,安装squid
# yum install squid* -y

2,配置squid主配置文件
# vim /etc/squid/squid.conf
http_access allow all  --修改成允许所有
http_port 3128 accel vhost vport  --修改成支持反向代理模式,端口不一定要改为80,因为我这个web架构,最前端的是nginx
cache_dir ufs /var/spool/squid 256 16 256 --打开缓存目录的定义这一句

cache_peer 10.1.1.35 parent 8000 0 no-query originserver name=web
cache_peer_domain web web.cluster.com --web.cluster.com就是我现在模拟的整个网站架构的域名
cache_peer_domain web 1.1.1.128 --加上这三句,表示代理后台的lnmp的8000端口;web.cluster.com为网站的域名,1.1.1.128为我这个架构最前端的nginx的IP

3,启动squid
# /etc/init.d/squid restart

第三大步:在上图中的nginx服务器上安装并配置nginx
1,安装nginx
省略
2,配置nginx
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  8;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  65535;
    use epoll;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip on;
upstream squid {
    server 10.1.1.9:3128 weight=1 max_fails=2 fail_timeout=3s;
}
upstream web {
    server 10.1.1.35:8000 weight=1 max_fails=2 fail_timeout=3s;
}

    server {
        listen       80;
        server_name 1.1.1.128;
access_log  logs/access.log  main;
       location ~ .*\.php$ {
            proxy_pass   http://web;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        location ~ .*\.(html|htm|gif|jpeg|jpg|css|js|png|swf)$ {
            proxy_pass   http://squid;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        location / {
            proxy_pass   http://web;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
}
}


--说明:下面这两句是做外网转内网双网段架构必需要加的
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;

3,启动nginx
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx -s stop
# /usr/local/nginx/sbin/nginx

第四大步:验证

在客户端机器1.1.1.129上首先绑定静态DNS
--用于模拟DNS,如果不绑定,也可以直接使用公网IP1.1.1.128来访问,因为在squid里配置了(cache_peer_domain web web.cluster.com 和 cache_peer_domain web 1.1.1.128 两句)
cat /etc/hosts
1.1.1.128  web.cluster.com    --IP要为前端nginx的IP,名字为这个网站的域名要和squid里的cache_peer_domain web web.cluster.com要对应

1,在客户端用firefox访问http://web.cluster.com/http://1.1.1.128/是可以正常看到我的lnmp的8000端口安装的discuz论坛

2,在客户端使用下面的命令验证discuz论坛的一个logo,可以看到在squid上命中的信息
# curl -I http://web.cluster.com/static/image/common/logo.png
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Mon, 23 Nov 2015 08:10:09 GMT
Content-Type: image/png
Content-Length: 4425
Connection: keep-alive
Last-Modified: Tue, 09 Jun 2015 02:21:12 GMT
ETag: "55764d98-1149"
Accept-Ranges: bytes
Age: 3227
X-Cache: HIT from squid.cluster.com
X-Cache-Lookup: HIT from squid.cluster.com:3128
Via: 1.0 squid.cluster.com (squid/3.1.10)

3,关闭squid,在客户端用firefox访问,会发现整个网站都没有图片(静态的元素)
用curl -I  http://web.cluster.com/static/image/common/logo.png来验证也会报错
因为我的架构里只有一台squid,再次启动squid后,一切又恢复正常

4,在squid配置文件里加上
# vim /etc/squid/squid.conf

maximum_object_size 600 KB --表示限制能缓存的文件最大大小为600k

# /etc/init.d/squid stop
# rm /var/spool/squid/* -rf --手动这样删除缓存
# squid -zX /var/spool/squid/   --再次创建缓存目录;当然这样清缓存肯定不是好方法
# /etc/init.d/squid start

先在lnmp服务器上dd创建两个文件一个大于600k,一个小于600k
# dd if=/dev/zero of=test1.html bs=1k count=500
# dd if=/dev/zero of=test2.html bs=1k count=700
在客户端curl -I 接这两个文件的路径来测试,结果为大于600k的一直都是MISS(表示不缓存),小于600K的第一次MISS,之后都是HIT(表示缓存)

5,关于squid清缓存
# vim /etc/squid/squid.conf --可以加上下面这四句;要注意的是这四句不能随便乱放,要放到acl的最后一个默认定义的下面;在rhel6.5的rpm版里就是大概在28行后面
acl purge_admin src 127.0.0.1 10.1.1.9
acl purge method PURGE
http_access allow purge_admin purge
http_access deny all purge

# /etc/init.d/squid restart

最基本的清除一条缓存的操作,必须要在10.1.1.9这台机器上执行
# squidclient -m PURGE -h 10.1.1.9 -p 3128 http://1.1.1.128/static/image/common/logo.png
-- -h参数后只能接127.0.0.1或10.1.1.9;-p 3128是squid的监听端口;最后的路径就是客户端访问的路径

如果要批量清除squid,可以使用下面的脚本(你需要修改成自己对应的路径)
vim /tmp/purge_squid.sh
#!/bin/sh
squidcache_path="/var/spool/squid/"
squidclient_path="/usr/bin/squidclient"
grep -a -r $1 $squidcache_path/* | strings | grep "http" | while read url
do
$squidclient_path -h 127.0.0.1 -m PURGE -p 3128 $url > /dev/null 2>&1
done

--注意:脚本的squidcache_path修改成你对应的缓存目录,squidclient_path修改成squidclient命令的路径;-h 127.0.0.1是因为我做了acl限制的,所以只能在squid本机上清除

批量清除的方法:
sh /tmp/purge_squid.sh .txt  --表示清除所有的.txt结尾的缓存
sh /tmp/purge_squid.sh .     --表示清除所有缓存
sh /tmp/purge_squid.sh /aaa/  --表示url里有/aaa/路径就清掉缓存

6,关于后台web日志的里的客户端访问IP都是前端代理的IP的解决
建议直接使用前端nginx的日志

      DNS轮循

   nginx代理1  nginx代理2

         nginx    nginx   nginx   nginx
  
     php(fastcgi)    php(fastcgi)

   memcache memcache
   mysql  mysql

======================================================================

把上面架构图中的squid换成varnish

    client
      |
      |
       |------------|  
       |      |
       |  varnish
       |   |
       |------------|
      |
      |
     lnmp

1,停掉squid
/etc/init.d/squid stop
2,安装varnish,这次使用rpm版
软件包路径如下(下载地址为http://repo.varnish-cache.org/redhat/varnish-4.0/el6/x86_64/varnish/http://dl.fedoraproject.org/pub/epel/6Server/x86_64/)
软件包路径为笔记目录下/varnish_soft/
jemalloc-3.6.0-1.el6.x86_64.rpm
varnish-4.0.3-1.el6.x86_64.rpm
varnish-libs-4.0.3-1.el6.x86_64.rpm
varnish-docs-4.0.3-1.el6.x86_64.rpm
安装顺序
# rpm -ivh jemalloc-3.6.0-1.el6.x86_64.rpm
# rpm -ivh varnish-4.0.3-1.el6.x86_64.rpm varnish-libs-4.0.3-1.el6.x86_64.rpm varnish-docs-4.0.3-1.el6.x86_64.rpm

3,配置rpm版varnish
# vim /etc/sysconfig/varnish
66 VARNISH_LISTEN_PORT=3128 --这是listen的端口,默认为6081,我这里改为3128,为了和前面的nginx调度的端口对应

# vim /etc/varnish/default.vcl   --配置主配置文件如下
vcl 4.0;
backend lnmp {
     .host = "10.1.1.35";
     .port = "8000";
}
acl purgers {
"127.0.0.1";
"10.1.1.0"/24;
}

sub vcl_recv {
  if (req.method == "PURGE") {
    if (!client.ip ~ purgers) {
      return(synth(405,"Method not allowed"));
    }
    return(hash);
  }
if (req.http.host  ~ "web.cluster.com") {
        set req.backend_hint = lnmp ;
        } else {
          return(synth(404,"error domain name"));
        }
}
sub vcl_miss {
    return(fetch);
}

sub vcl_hit {
  if (req.method == "PURGE") {  
    unset req.http.cookie;
    return(synth(200,"Purged"));
  }
}

sub vcl_backend_response {
  if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
    set beresp.ttl = 1d;
  }
  if (bereq.url ~ "\.(html|css|js)$") {
    set beresp.ttl = 6h;
  }
  if (beresp.http.Set-Cookie) {
    return(deliver);
  }
}

sub vcl_deliver {
  if (obj.hits > 0) {
    set resp.http.X-Cache = "@_@ HIT from " + server.ip;
  } else {
    set resp.http.X-Cache = "@_@ oh,god,MISS";
  }
}

4,启动varnish服务
# /etc/init.d/varnish restart
# lsof -i:3128
# lsof -i:6082

5,测试,客户端使用web.cluster.com这个域名来访问(不能使用IP,见varnish配置)

=====================================================================

在上面的架构中,把squid或varnish去掉,由nginx又做反向代理,又做缓存
nginx做缓存需要一个另外一个软件(ngx_cache_purge)
下载的网址为:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

架构图,在上面做的基础上把squid或varnish去掉
   client  1.1.1.129  
     |
     |    1.1.1.128
        nginx 反向代理加缓存   
     |  10.1.1.7
     |
   lnmp  
    10.1.1.35:8000

第一步:
先把squid或varnish停掉
再把刚做过的nginx给删除(因为需要重新编译)
rm /usr/local/nginx/ -rf
rm /usr/src/nginx-1.8.0/ -rf

重新解压,重新编译
软件包在笔记目录下/lnmp_soft/
nginx-1.8.0.tar.gz
ngx_cache_purge-2.3.tar.gz
tar xf  nginx-1.8.0.tar.gz -C /usr/src/
tar xf ngx_cache_purge-2.3.tar.gz -C /usr/src/
cd /usr/src/nginx-1.8.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module  --add-module=../ngx_cache_purge-2.3/
make
make install
--编译和以前几乎一样,只是多了一个--add-module=../ngx_cache_purge-2.3/参数,两个目录是同级目录(从编译的路径可以看出来)

第二步:
修改nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  8;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  65535;
    use epoll;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$upstream_cache_status"';
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip on;
    proxy_temp_path   /usr/local/nginx/proxy_temp_dir 1 2;
    proxy_cache_path  /usr/local/nginx/proxy_cache_dir/cache  levels=1:2 keys_zone=cache:100m inactive=1d max_size=10g;
upstream web {
    server 10.1.1.35:8000 weight=1 max_fails=2 fail_timeout=30s;
}

    server {
        listen       80;
        server_name  1.1.1.128;
access_log  logs/host.access.log  main;
        location / {
            proxy_pass   http://web;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
     proxy_cache cache;
     proxy_cache_key $host$uri$is_args$args;
     proxy_cache_valid 200 304 10m;
            add_header X-Cache '$upstream_cache_status from $host';
     expires 1d;
        }
        location ~ .*\.(php|cgi)$ {
            proxy_pass   http://web;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
}
}

上面的配置参数说明
1、http段设置。
proxy_temp_path /usr/local/nginx/proxy_temp_dir;  --设置临时目录
proxy_cache_path /usr/local/nginx/proxy_cache_dir/cache levels=1:2 keys_zone=cache:100m inactive=1d max_size=10g;
--keys_zone=cache1:100m 表示这个zone名称为cache1,分配的内存大小为100MB
--/usr/local/nginx/proxy_cache_dir/cache1 表示cache1这个zone的文件要存放的目录
--levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/usr/local/nginx/proxy_cache_dir/cache/a/1b这种形式
--inactive=1d 表示这个zone中的缓存文件如果在1天内都没有被访问,那么文件会被cache manager进程删除掉
--max_size=10g 表示这个zone的硬盘容量为10GB
2、server段设置
proxy_cache cache;  --设置缓存共享内存区块,也就是keys_zone名称
proxy_cache_key $host$uri$is_args$args; --设置缓存key
proxy_cache_valid 200 304 10m; --设置http状态码为200,304缓存时间为10分钟
add_header X-Cache '$upstream_cache_status from $host';    --$upstream_cache_status表示资源缓存的状态,有HIT MISS EXPIRED三种状态
expires 1d; --设置失期时间,为1天
保存主配置文件后,建立对应的缓存目录
mkdir /usr/local/nginx/proxy_cache_dir/cache -p
ls /usr/local/nginx/proxy_cache_dir/cache
启动nginx
/usr/local/nginx/sbin/nginx

第三大步:
客户端测试
1,使用下面的命令访问
# curl -I http://1.1.1.128/static/image/common/logo.png
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Mon, 25 Aug 2014 18:36:33 GMT
Content-Type: image/png
Content-Length: 2511
Connection: keep-alive
Last-Modified: Wed, 20 Mar 2013 02:19:36 GMT
ETag: "51491cb8-9cf"
Accept-Ranges: bytes
Expires: Tue, 26 Aug 2014 18:36:33 GMT
Cache-Control: max-age=86400
X-Cache: MISS from 10.2.2.11  --第一次MISS

# curl -I http://1.1.1.128/static/image/common/logo.png
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Mon, 25 Aug 2014 18:36:44 GMT
Content-Type: image/png
Content-Length: 2511
Connection: keep-alive
Last-Modified: Wed, 20 Mar 2013 02:19:36 GMT
ETag: "51491cb8-9cf"
Expires: Tue, 26 Aug 2014 18:36:44 GMT
Cache-Control: max-age=86400
X-Cache: HIT from 10.2.2.11
Accept-Ranges: bytes  --第二次HIT
2,在客户端用户firefox访问http://10.2.2.11/,可以访问整个discuz论坛
在nginx上查看缓存目录,会看到很多子目录(缓存都在这些目录里)
ls /usr/local/nginx/proxy_cache_dir/cache
0  1  2  3  5  6  7  9  a  b  d  e  f

3,nginx的缓存清除
在nginx服务器写一个脚本,如下
vim /tmp/purge_nginx_cache.sh
#!/bin/bash
cachedir=/usr/local/nginx/proxy_cache_dir/cache
grep -ra  $1 $cachedir |grep $1 | awk -F':' '{print $1,$3}'|while read cacheurl url
do
rm  -rf  $cacheurl
        echo "$url"
done
echo "缓存清除成功"
清除方法为
sh /tmp/purge_nginx_cache.sh .png$   --清除所有的.png结尾的缓存
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 20:39 , Processed in 0.049066 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表