不对的地方,欢迎大家拍砖。
现在有如下三台服务器:
10.57.22.201(做负载均衡配制)(也可以同时做负载3,不同端口就可以)
10.57.22.202(负载1)
10.57.22.203(负载2)
201的配制:
nginx.conf中添加:
upstream www.abc.com{
server 10.57.22.202:80 weight=1;
server 10.57.22.203:80 weight=1;
}
vhosts.conf中添加:
#www.abc.com
server {
listen 80;
server_name www.abc.com;
proxy_redirect off;
location / {
proxy_pass http://www.abc.com;
proxy_set_header Host $host;
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header X-Real-IP $remote_addr;#后端的Web服务器可以通过X-Real-IP获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大的单个文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 600;
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
proxy_read_timeout 600;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 600;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffer_size 8k;
#同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间
proxy_buffers 4 32k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_busy_buffers_size 64k;
#proxy缓存临时文件的大小
proxy_temp_file_write_size 64k;
}
#if ($request_uri ~* ".*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$")
#{
# proxy_pass http://squid.abc.com;
#}
#if ($request_uri ~* "^/view/(.*)$")
#{
# proxy_pass http://squid.abc.com;
#}
log_format www_abc_com '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /soft/www_abc_com.log www_abc_com;
}
202,203中的配制:
############## www.abc.com ################
server{
listen 80;
server_name www.abc.com;
index index.html index.htm index.php;
root /var/www;
location ~ \.php$ {
if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
access_log off;
expires 30d;
}
location ~ .*\.(js|css)?$ {
access_log off;
expires 1h;
}
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /var/www/logs/abc_access.log access;
}
测试方法:
window下绑www.abc.com到201.然后在地址栏中访问www.abc.com/index.php,就可以实现负载中的切换作用,你可以在www.abc.com下都放一下index.php文件,打印出服务器的IP,则可以看到效果。
关于session如何共享可以把session共享到memcached中。
参考:http://hi.baidu.com/woaidelphi/blog/item/02e0a9080551338c0b7b8237.html
相关知识:
nginx 的 upstream目前支持 5 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)、url_hash(第三方)
每个设备的状态设置为:
a) down 表示单前的server暂时不参与负载
b) weight 默认为1.weight越大,负载的权重就越大。
c) max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模
块定义的错误
d) fail_timeout:max_fails次失败后,暂停的时间。
e) backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器
压力会最轻。
还可以在202,203负载中做不同端口的配制:
#default-cgid可以是任何名字,要和vhost.conf对应
upstream default-cgid {
server 127.0.0.1:9000;
server 127.0.0.1:9001 weight=2;
server 127.0.0.1:9002 down;
server 127.0.0.1:9003 down;
server 127.0.0.1:9004 backup;
}
在需要使用负载均衡的 server中增加,如下红色部分
location ~ \.php$ {
if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}
fastcgi_pass default-cgid; #只用一个端口 fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
}