Nginx反代与负载均衡

Nginx反代

代理端

location / {
proxy_pass http://192.168.188.9:80;
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;
}

服务端

set_real_ip_from 192.168.188.9;

nginx proxy 具体配置

proxy_pass :真实web/app服务器
proxy_redirect : 如果真实服务器使用的是的真是IP:非默认端口。则改成IP:默认端口。
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址
proxy_connect_timeout::后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续
的60s内没有收到1个字节, 连接关闭。像长连接
proxy_buffering on;开启缓存
proxy_buffer_size:proxy_buffer_size 只是响应头的缓冲区
proxy_buffers 4 128k; 内容缓冲区域大小
proxy_busy_buffers_size 256k; 从proxy_buffers划出一部分缓冲区来专门向客户端传送数据的
地方
proxy_max_temp_file_size 256k; 超大的响应头存储成文件。

Nginx负载均衡

1.upstream配置

upstream webapp {
server 192.168.188.9:80;
server 192.168.188.11:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://webapp;
}
}

2.负载均衡算法

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权重值,Weight 值越大,分配到的访问机率越高。
ip_hash:每个用户请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。
fair:比上面两个更智能的负载均衡算法。此算法可以根据&加载时间的长短智能进行负载分配,根据后端服务器响应时长分配请求,响应时间越短就会优先分配。
url_hash:此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
least_conn:最少连接负载均衡算法,简单来说就是每次选择的后端都是当前最少连接的一个 server(这个最少连接不是共享的,是每个 worker 都有自己的一个数组进行记录后端 server 的连接数)。

3.配置实例

//热备
upstream webapp {
server 192.168.188.9:80;
server 192.168.188.11:80 backup; 
}     
//轮询
upstream webapp {
server 192.168.188.9:80;
server 192.168.188.11:80;
}     
//加权轮询
upstream webapp {
server 192.168.188.9:80   weight=1;
server 192.168.188.11:80  weight=2;
}
//ip_hash
upstream webapp {
ip_hash;
server 192.168.188.9:80;
server 192.168.188.11:80;
}

upstream webapp {
ip_hash;
server 192.168.188.9:80 weight=2 max_fails=2 fail_timeout=2;
server 192.168.188.11:80 weight=3 max_fails=2 fail_timeout=2;
}

4.基于请求头的分发

4.1基于host分发

http {
    upstream web1 {   # 名为web1的反向代理群组
        server 192.168.0.42;
    }
    upstream web2 {   # 名为web2的反向代理群组
        server 192.168.0.43;
    }
    server {    # web1虚拟主机
        listen 80;
        server_name www.web1.com;    # 基于域名分发必须有域名
        location / {
            proxy_pass http://web1; 
        }
    }
    server {    # web2虚拟主机
        listen 80;
        server_name www.web2.com;    # 基于域名分发必须有域名 
        location / {
            proxy_pass http://web2; 
        }
    }
}

4.2基于开发语言分发

http {
    upstream php {
        server 192.168.0.42; 
    }
    upstream html {
        server 192.168.0.43;
    }
    server {
        location ~* \.php$ {    # 以php结尾的
            proxy_pass http://php;
        } 
        location ~* \.html$ {   # 以html结尾的
            proxy_pass http://html;
        }
    }
}

4.3基于浏览器分发

upstream curl { server 192.168.0.42; }
upstream firefox { server 192.168.0.43; }
upstream other { server 192.168.0.44; }
server {
    listen 80;
    server_name www.web1.com;
    location / {
        proxy_pass http://other;
        if ( $http_user_agent ~* curl ) {
            proxy_pass http://curl;
        }
        if ( $http_user_agent ~* firefox ) {
            proxy_pass http://firefox;
        }
    }
}

4.4基于源IP分发

upstream bj.server {
    server 192.168.0.42;    # web01
}
upstream sh.server {
    server 192.168.0.43;      # web02
}
upstream default.server {
    server 192.168.0.44;      # web03
}
geo $geo {       # IP库
    default default;
}
server {
    listen  80;
    server_name   www.web1.com;

    location / {
        proxy_pass http://$geo.server$request_uri;
    }
}
上一篇
下一篇