单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到多个服务器上,将服务器分发到不同的服务器上,也就是我们所说的负载均衡。
实际配置
1、 首先配置两台(或以上)服务器
server {
listen 81;
server_name 192.168.0.2;
root html;
access_log logs/81-access.log main;
}
server {
listen 82;
server_name 192.168.0.2;
root html;
access_log logs/82-access.log main;
}
2、配置upstream
upstream imgserver {
server 192.168.0.2:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.0.2:82 weight=1 max_fails=2 fail_timeout=3;
}
****参数说明****
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down 表示单前的server暂时不参与负载.
weight 默认为1.weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误.
fail_timeout : max_fails次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
3、 在需要做负载均衡的地方加配置
例如访问jpg|jpeg|gif|png图片,将所有的访问请求转发给负载均衡服务器进行访问。
location ~* \.(jpg|jpeg|gif|png) {
proxy_set_header x-Forwarded-For $remote_addr;
proxy_pass http://imgserver;
}
注意:设置proxy_set_header的作用是
” X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了”
最终配置文件为:
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"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream imgserver {
server 192.168.0.2:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.0.2:82 weight=1 max_fails=2 fail_timeout=3;
}
server {
listen 81;
server_name 192.168.0.2;
root html;
access_log logs/81-access.log main;
}
server {
listen 82;
server_name 192.168.0.2;
root html;
access_log logs/82-access.log main;
}
server {
listen 80;
server_name 192.168.0.2;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|jpeg|gif|png) {
proxy_set_header x-Forwarded-For $remote_addr;
proxy_pass http://imgserver;
}
error_page 404 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
测试
在地址栏中访问nginx服务器http://192.168.0.2:80/image/log.png
然后查看81-access.log或者是81-access-log的日志。
会发现最后一行出现了请求nginx服务器的原始ip。通过查看日志可以看出访问80的服务器,经过正则匹配(~*\.(jpg|jpeg|gif|png))将访问请求转发给了imgserver里面的图片请求服务器。然后81-access.log记录了访问的详细地址。
注:默认负载均衡的算法是逐个请求,
也有其他算法,负载均衡算法。如一致性哈希算法,需要安装三个模块(ngx_http_upstream_consistent_hash)
如http://wiki.nginx.org/NginxHttpUpstreamConsistentHash
这个模块就是用一致性hash来请求后端结节,并且其算法,与PHP中的memcache模块的一致性hash算法,兼容。