whatfck 2013-06-19
nginx负载均衡的实现过程
在配置文件中加入:
upstream php_server_pool{
server 192.168.4.178:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.4.179:80 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.4.180:80 weight=2 max_fails=2 fail_timeout=30s;
/*
weight设置服务器的权重,权重数越高,被分配到的客户端请求就越多,如果没有设置,权重为1
max_fails--在参数fail_timeout指定的时间内对后端服务器请求失败的次数
fail_timeout 在经历参数max_fails设置的失败次数后,暂停的时间
down 标记服务器为永久离线状态,用于ip_hash指令
backup 仅仅在非backup服务器全部宕机或繁忙的时候才启用
*/
}
设置一个虚拟主机反向代理上面的群组服务器
server
{
listen 80;
server_name 192.168.4.177;
location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://php_server_pool;
proxy_set_header Host 192.168.4.177;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log /usr/local/nginx/logs/php_server_pool.log
}
注意: upstream 指令用于设置一组可以在proxy_pass和fastcgi_pass指令中使用的代理服务器,默认的负载均衡方式为轮询.upstream模块中的 server指令用于指定后端服务器的名称和参数,服务器的名称可以是一个域名,一个ip地址,端口号或者UNIX Socket.
而在server{..}虚拟主机内,可以通过proxy_pass和fastcgi_pass指令设置进行反向代理的upstream服务器集群
proxy_set_header指令用于在向反向代理的后端WEB服务器发起请求时添加指定的header头信息
当后端WEB服务器上有多个基于域名的虚拟主机时,要通过添加header头信息Host,用于指定请求的域名,这样后端服务器才能识别该反向代理访问请求是由那一个虚拟主机来处理
使 用反向代理之后,后端web服务器就不能直接$_SERVER['REMOTE_ADDR']变量来获取用户的真实ip了,通 过$_SERVER['REMOTE_ADDR']获得的将是负载均衡器的ip.这时,就要通过Nginx反向代理时添加Header头信息X- Forwarded-For,让后端web服务器能够通过$_SERVER['HTTP_X_FORWARDED_FOR']获取到用户的真实ip
nginx的proxy_cache相关指令集
1.proxy_cache:该指令用于设置那个缓存区将被使用
2.proxy_cache_path:该指令用于设置缓存文件的存放路径
示例:proxy_cache_path /web/server1 levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g
该指令只能在http标签内配置,levels指定该缓存空间有两层hash目录,第一层为1个字母,第二层为2个字母;
keys_zone参数用来为这个缓存区起名,500m指内存缓存空间大小为500MB;inactive的1d指如果缓存数据在1天内没有被访问,将被删除;max_size的30g是指硬盘缓存空间为30GB
3.proxy_cache_methods:该指令用于设置缓存那些http方法,默认缓存get和head,不缓存post
4.proxy_cache_min_uses:该指令用于设置缓存的最小使用次数,默认为1
5.proxy_cache_valid:该指令用于对不同返回状态码的url设置不同的缓存时间
例如:
proxy_cache_valid 200 302 10m
proxy_cache_valid 404 1m
设置 200,302的状态码缓存10分钟,404的状态码url缓存1分钟
proxy_cache_valid 5m
如果不指定状态码,直接指定缓存时间,则只有200,301,302状态的url缓存5分钟
6.proxy_cache_key:该指令用来设置web缓存的key值,nginx根据key值md5哈希存储缓存。一般使用$host(域名),$request_uri(请求的路径)等变量组合成proxy_cache_key.
例如:
proxy_cache_key "$host:$server_port$uri$is_args$args";
以下是一个完整的缓存服务的配置:
在/usr/local/nginx下面创建一个cache目录,在里面创建2个目录proxy_temp_path和proxy_cache_path
在nginx的配置文件中设置相关参数:
proxy_temp_path /usr/local/nginx/cache/proxy_temp_path;
proxy_cache_path /usr/local/nginx/cache/proxy_cache_path levels=1:2 keys_zone=cache_one:200m
inactive=1d max_size=30g;
upstream my_server_pool{
server 192.168.4.179:80 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.4.180:80 weight=2 max_fails=2 fail_timeout=30s;
}
server
{
listen 80;
server_name 192.168.4.178;
location /
{
proxy_set_header Host 192.168.4.178
proxy_set_header X-Forwarded-For $remote_addr
proxy_pass http://my_server_pool
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
#使用web缓存区cache_one
proxy_cache cache_one;
#对不同http状态码缓存设置不同的缓存时间
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
#设置web缓存的key值,nginx根据key值md5哈希存储缓存,这里根据'域名,URI,参数'组合成key
proxy_cache_key $host$uri$is_args$args;
#反向代理,访问后端内容源服务器
proxy_set_header Host 192.168.4.178;
proxy_set_header X-Forwarded-For $remote_addr
proxy_pass http://my_server_pool;
}
#用于清除缓存,假设一个URL为http://192.168.4.178/test.gif,通过访问
#http://192.168.4.178/purge/test.gif可以清楚该url的缓存
location ~ /purge(/.*)
{
#设置值允许指定的ip或ip段才可以清除URL缓存
allow 127.0.0.1
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args
}
access_log off;
}