【实验环境】
系统: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
[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的缓存,访问 即可看到下面的页面
四、通过日志查看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%