1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:
upstream bakend{#定义负载均衡设备的Ip及设备状态
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;
每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug。
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录。
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡。
要用nginx做负载均衡的话,首先要在配置文件里面定义一组用来负载均衡的后端服务器(backend servers),例如:
server 192.168.1.11;
server 192.168.1.12;
server 192.168.1.13;
}
那个server指令的语法是 server name [parameters],这里的name是服务器名,可以是域名、ip或者unix socket,也可以指定端口,例如:
server 192.168.1.11:8080;
server指令可用的参数有:
weight 设置服务器的权重,默认值是1,权重值越大那么该服务器被访问到的几率就越大,例如 server 192.168.1.11 weight=5;
max_fails和fail_timeout 这俩是关联的,如果某台服务器在fail_timeout时间内出现了max_fails次连接失败,那么nginx就会认为那个服务器已经挂掉,从而在 fail_timeout时间内不再去查询它,fail_timeout的默认值是10s,max_fails的默认值是1(这意味着一发生错误就认为服务器挂掉),如果把max_fails设为0则表示把这个检查取消。
举个例子:server 192.168.1.11 max_fails=3 fail_timeout=30s; 这表示,如果服务器192.168.1.11在30秒内出现了3次错误,那么就认为这个服务器工作不正常,从而在接下来的30秒内nginx不再去访问这个服务器。
down 表示该服务器已经停用,例如server 192.168.1.11 down;
backup 表示该服务器是备用服务器,只有其它后端服务器都挂了或者很忙才会访问到。
关于upstream的更多信息请参考 http://wiki.nginx.org/NginxHttpUpstreamModule
使用一台nginx作前端负载,来减轻后端apache服务器的压力。
nginx.conf 的主要参考
server_names_hash_bucket_size 128;##用于制定服务器名称哈希表的框大小,默认取决于cpu缓存
limit_zone one $binary_remote_addr 10m;#定义一个叫one的记录区,容量为10m,一遍量$binary_remote_addr 作为绘画判断的基准。
limit_conn one 1;#也可以写道location里one为上面定义的记录区,一个会话只能进行一个连接
limit_req_zone $binary_remote_addr zone=one2:10m rate=1r/s;#限制了每秒只接受一个ip一次请求“请求数/秒 (r/s)
limit_req zone=one2 burst=5; ## 也可以在location里设置最大的突发请求数
ignore_invalid_headerson;
recursive_error_pages on;
server_name_in_redirect off;
if_modified_since exact; ##主要用来expires的时间修改
sendfile on;##用于数据拷贝在两个文件描述符之间的操作函数。
#timeouts
keepalive_timeout 60;
#TCP Options
tcp_nopush on;###只在sendfile开起的时候有用,是否允许使用tcp_cork 套接字
tcp_nodelay on;
#fastcgi options
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_cache_path /var/www/tmp/fastcgi_cache_path levels=1:2keys_zone=fastcgi_cache:500m inactive=30m max_size=10000M;
fastcgi_temp_path /var/www/tmp/fastcgi_temp_path;
fastcgi_cache_methods GET HEAD;#缓存的信息
fastcgi_cache_min_uses 3;#最小使用
#fastcgi_cache fastcgi_cache;
fastcgi_cache_valid 200 302 20m; #状态码200 302 缓存20分钟
fastcgi_cache_valid 301 1h;#301缓存一个小时
fastcgi_cache_valid any 20m;#其他说有缓存20分中
fastcgi_cache_key 127.0.0.1:9000$request_uri;#用来设置被缓存的key
fastcgi_buffer_size 128k;####设置服务器相应头部缓冲区大小
fastcgi_buffers 4 128k;#设置fastcgi进程返回信息的缓冲区数量和大小,
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;###用来是否把客户端4xx和5xx 错误页或允许nginx自动制定错误页
#size limits
client_max_body_size50m;允许客户端请求的最大的单个文件字节数
client_body_buffer_size 256k; 缓冲区代理缓冲用户客户端请求的最大字节数,可以理解为先保存到本地在传给用户
client_body_timeout 60;#设置读取客户端请求内容的超时时间
client_header_buffer_size 1k;#用户设置客户端请求的header头缓冲区大小
large_client_header_buffers 4 32k;#最大缓存客户端请求header 大小
#gzip compression
gzip on; #启动
gzip any;无条件启用压缩,其中这里有几个选项我就不写了
gzip_min_length 0;#允许压缩最小字节数,默认0不管多大都压,建议设置成大于1k,小于1k,越压越大,
gzip_buffers 16 8k;
gzip_http_version 1.0;#早期的客户端可能不支持gzip 打开是乱码,启用后可防止这一问题
gzip_comp_level 9;#压缩级别1-9 9为最高
gzip_typestext/plain text/css image/x-icon image/png;#匹配类型压缩
gzip_vary on; #vary头信息 是cache明中率杀手可以考虑注释
#temp files
proxy_temp_path /var/www/tmp/proxy_temp_path;
#fastcgi_temp_path/var/www/tmp/fastcgi_temp;
client_body_temp_path/var/www/tmp/client_body_temp;###用户存放请求内容的临时文件
#client_body_temp_path /usr/local/nginx8/client_body_temp 1 2;
#proxy_temp_path/usr/local/nginx8/proxy_temp 1 2;
#fastcgi_temp_path/usr/local/nginx8/fastcgi_temp 1 2;
#proxy
proxy_buffering on;
proxy_buffer_size 16k; #代理请求缓存去,保存用户的信息以供nginx进行规则处理
proxy_buffers 4 32k;#nginx保存单个的几个buffer 及最大用多大空间
proxy_busy_buffers_size 64k;##如果系统很忙的时候可以申请更大的,推荐*2
proxy_temp_file_write_size 64k;##缓存临时文件大小
proxy_cache_min_uses 3;
proxy_cache_path /var/www/tmp/proxy_cache_path levels=1:2 keys_zone=cache:500m inactive=30m max_size=10000M;#缓存
proxy_cache_valid any 10m;
proxy_cache_methods GET HEAD;
proxy_cache_key "$host:$server_port$uri$is_args$args";
proxy_ignore_client_abort off;
proxy_intercept_errors on;
proxy_next_upstream error timeout invalid_header;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 60; #跟后端服务器连接的超市时间=发起握手等候响应超时时间。
proxy_send_timeout 60;#后端服务器数据回收时间=就是在规定时间之后后端服务器必须传完所有数据
proxy_read_timeout 60;##连接成功后=等候后端服务器响应时间=就是进入等待了
虚拟主机参考:
在locotion 里加上一句:
proxy_cache cache;
网站防盗链配置:
{
# valid_referers none blocked bbs.aa.com;
# if ($invalid_referer)
# {
# rewrite ^/ http://www./bbs.jpg;
# }
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行: 表示对www.aa.com这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到http://www./bbs.jpg;
第二种方法(说明:如果你对这个不是很熟悉,不要在线上服务器进行设置,最好先自己测试)
1. 下载NginxHttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz;
2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”;
3. 用一下参数重新编译nginx:
./configure --add-module=path/to/nginx-accesskey
4. 修改nginx的conf文件,添加以下几行:
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}
其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。