一、nginx负载均衡
配置方法
upstream server {
server 192.168.133.161:80;
server 192.168.133.160:80;
}
#假设代理服务器IP为192.168.133.162
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://server;
}
}
upstream 支持4种负载均衡调度算法:
A、 轮询(默认) :每个请求按时间顺序逐一分配到不同的后端服务器;
B、 ip_hash :每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以
保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
C、 url_hash :按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务
器为缓存的时候效率。
D、 fair :这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短
智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx
本身是不支持 fair 的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块。
实例:
服务器:A和B
#热备
upstream server {
server 192.168.133.161:80;
server 192.168.133.160:80 backup; #热备
}
#轮询(默认,权重为1),ABABAB..
upstream server {
server 192.168.133.161:80;
server 192.168.133.160:80;
}
#加权轮询,ABBABBABB
upstream server {
server 192.168.133.161:80 weight=1;
server 192.168.133.160:8080 weight=2;
}
# ip_hash,相同IP访问同一台服务器,同一局域网转发到同一台服务器,可能会导致负载失衡
upstream server {
ip_hash;
server 192.168.133.161:80;
server 192.168.133.160:80;
}
负载均衡配置参数
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求
- backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和
fail_timeout一起使用。
# 配置参数
upstream server {
server 192.168.133.161:80 weight=2 max_fails=2 fail_timeout=2;
server 192.168.133.160:80 weight=1 max_fails=2 fail_timeout=2;
}
二、Nginx会话保持
1、ip_hash ip_hash
使用源地址哈希算法,将同一客户端的请求总是发往同一个后端服务器,除非该服务器不 可用。
ip_hash语法:
upstream server {
ip_hash;
server 192.168.133.161:80;
server 192.168.133.160:80;
server 192.168.133.160:8080 down;
}
ip_hash存在的问题:
- 当后端服务器宕机后,session 会丢失;
- 不适用于前段还有代理的情况。必须是第一层代理,接受客户端的真实 ip 地址,二层代理无 法使用
- 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;
- 不适用于 CDN 网络,
2、sticky_cookie_insert
基于cookie 来判断。可避免上述 ip_hash 中来自同一局域网的客户端和前端代理导致负载失衡的情况。 语法:
upstream server {
server 192.168.133.161:80;
server 192.168.133.160:80;
sticky_cookie_insert srv_id expires=2h domain=3evip.cn path=/;
}
- expires:设置浏览器中保持 cookie 的时间
- domain:定义cookie 的域
- path:为 cookie 定义路径
3、jvm_route 方式
4、使用后端服务器自身通过相关机制保持 session 同步
三、实例配置
环境
代理服务器 192.168.133.161
web服务 192.168.133.160(两台虚拟主机,这里为相同IP不能端口;如果是两台不同IP服务器,自行修改upstream)
代理端
[root@nginx-proxy conf.d]# cat up-proxy.conf
upstream webapp {
server 192.168.133.160:80;
server 192.168.133.160:8080;
}
server {
listen 80;
server_name www.up-proxy.com;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://webapp;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
[root@nginx-proxy conf.d]#
服务端
/etc/nginx/conf.d/
[root@nginx-server conf.d]# cat lisi-query.conf
server {
listen 8080;
server_name www.lisi.com;
access_log /var/log/nginx/lisi-access.log main;
error_log /var/log/nginx/lisi-error.log;
set_real_ip_from 192.168.133.161;
location /{
root /var/www/lisi;
index index.html index.htm index.php;
deny 192.168.133.5;
allow all;
}
location /status{
stub_status on;
access_log off;
}
}
[root@nginx-server conf.d]# cat proxy.conf
server {
listen 192.168.133.160:80;
server_name www.wangwu.com;
access_log /var/log/nginx/wangwu-access.log main;
error_log /var/log/nginx/wangwu-error.log;
set_real_ip_from 192.168.133.161;
location /{
root /var/www/test;
index index.html index.htm index.php;
}
location /status{
stub_status on;
access_log off;
}
}