【实验环境】
系统:Centos6.4
IP: 192.168.56.120
设置服务器的文件描述符
如果后面配置nginx的时候,需要调大worker_connections 这个参数,则需要对系统的文件描述符进行设置,否则可能会出现下面的报错:
worker_connections exceed open file resource limit: 1024
(1) 修改/etc/security/limits.conf文件,在文件中添加如下行:
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
就是限制了任意用户的最大线程数和文件数为65535。
其中*为所有用户的打开文件数限制,可用"*"号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;65535则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
(2) 修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
(3) 修改/etc/rc.local脚本,在脚本中添加如下行:
echo “65535"> /proc/sys/fs/file-max
完成上面3步之后重启服务器,重启完,通过ulimit -n 命令确认系统最大文件描述符是否为刚刚设置的值:
[root@localhost ~]# ulimit -n
65535
【实验配置】
一、安装Nginx
[root@localhost ~]# yum install pcre-devel openssl-devel perl-ExtUtils-Embed gcc gcc-c++ make wget
[root@localhost src]# wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
[root@localhost src]# wget http://nginx.org/download/nginx-0.8.32.tar.gz
[root@localhost src]# tar xf ngx_cache_purge-1.0.tar.gz
[root@localhost src]# tar xf nginx-0.8.32.tar.gz
[root@localhost src]# useradd -s /sbin/nologin -M www
[root@localhost nginx-0.8.32]# ./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost nginx-0.8.32]# make && make install
注意:这里nginx可能要使用较低的版本,我用新版本1.5.x 编译安装的时候会报错:
make[1]: *** [objs/addon/ngx_cache_purge-1.0/ngx_cache_purge_module.o] Error 1
make[1]: Leaving directory `/usr/src/nginx-1.5.3'
make: *** [build] Error 2
二、配置Nginx
[root@localhost ~]# mkdir -p /data/proxy_temp_dir
[root@localhost ~]# mkdir -p /data/web/www
[root@localhost ~]# mkdir -p /data/proxy_cache_dir
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
user www www;
worker_processes 8;
error_log logs/error.log crit;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /data/proxy_temp_dir;
proxy_cache_path /data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30G
upstream web_proxy_cache {
server 192.168.56.113:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.56.114:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server {
listen 80;
server_name 192.168.56.120;
root /data/web/www;
index index.html index.htm;
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; #对不同的HTTP状态码设置不同的缓存时间
# 以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://web_proxy_cache;
expires 1d;
}
# 用于清除缓存,假设一个URL为http://192.168.56.120/test.txt,通过访问http://192.168.56.120/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) { # 设置只允许指定的IP或IP段才可以清除URL缓存
allow 127.0.0.1;
allow 192.168.56.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
location ~ .*\.(php|jsp|cgii)?$ { # 扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://web_proxy_cache;
}
access_log off;
}
}
检查配置是否有误
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
启动nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx
三、测试
在web1和web2 两个web服务器上创建不同页面
[root@web1 ~]# vim /data/web/www/index.html
<H1>welcome to web1</H1>
<img src="123.jpg">
在/data/web/www/ 目录下上传一个图片,命名为123.jpg
[root@web1 ~]# service httpd start
[root@web2 ~]# service httpd start
访问效果如下:
测试能否正常代理以及作为web缓存
[root@localhost ~]# curl -dump http://192.168.56.120
<h1>welcome to web1</h1>
[root@localhost ~]# curl -dump http://192.168.56.120
<h1>welcome to web2</h1>
清除123.jpg的缓存,访问 http://192.168.56.120/purge/123.jpg 即可看到下面的页面
四、通过日志查看HIT 情况
1、开启日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$upstream_cache_status"';
access_log logs/access.log main;
2、添加
$upstream_cache_status
这个变量用来显示缓存的状态,我们可以在配置中添加一个http头来显示这一状态
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://web_proxy_cache;
expires 1d;
}
3、通过日志查看是否hits中缓存
可以看到,第一次访问的时候是没有通过缓存的,状态为-MISS
192.168.56.1 - - [09/Aug/2013:12:18:02 +0800] "GET /123.jpg HTTP/1.1" 200 4496 "http://192.168.56.120/" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36" "-""
MISS"
第二次访问的时候则是通过缓存,状态为HITS
192.168.56.1 - - [09/Aug/2013:12:18:02 +0800] "GET /123.jpg HTTP/1.1" 304 0 "http://192.168.56.120/" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36" "-""
HIT"
4、计算HIT命中概率
[root@localhost logs]#
awk '{if($NF=="\"HIT\"") hit++} END{printf "%.2f%\n",hit/NR*100}' access.log
51.85%