Nginx反向代理总结nginx反向代理服务
反向代理的种类
1. LVS的方案 2. DNS轮询的方案 3. Nginx的4层代理 4. Nginx的7层代理 5. 网络NAT的处理Nginx的反向代理-四层`
编译时增加 --with-stream 就可以. 然后可以使用 stream 四层反向代理 可以代理 mysql redis 以及一些其他的内容配置. 但是四层反向代理缺少很多语法, 比如七层反向代理来的适用面广 一个四层反向代理的标准处理为: stream { upstream backend { # 指定负载均衡算法,这里是一致性hash算法,以$remote_addr作为hash的键. hash $remote_addr consistent; server :12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } server { # 指定监听的端口,tcp/udp listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; # 代理至backend服务器组 proxy_pass backend; }关于四层反向代理的几个负载均衡算法
round-robin: 默认情况下,NGINX使用循环算法对流量进行负载均衡,将其顺序定向到配置的上游组中的服务器。 因为它是默认方法,没有round-robin指令; 只需upstream在顶层stream上下文中创建一个 配置块并添加上server一步中描述的指令。 least_conn : NGINX选择当前活动连接数较少的服务器。 least_time : NGINX选择平均延迟最小,活动连接数最少的服务器。 最低平均延迟是基于以下参数中的哪一个包括在least_time指令上计算的: connect - 连接到上游服务器的时间 first_byte - 接收数据的第一个字节的时间 last_byte - 从服务器接收完整响应的时间 hash : NGINX基于用户定义的密钥选择服务器,例如源IP地址 所述散列负载平衡方法还用于配置会话持久性。 于散列函数基于客户端IP地址,来自给定客户端的连接始终传递到同一服务器, 除非服务器关闭或以其他方式不可用。指定一个可选consistent参数以应用ketama一致性散列方法:四层的负载均衡的范例
upstream backend { laset_conn ; } upstream backend { least_time first_byte; } upstream stream_backend { hash $remote_addr consistent; } # 能够实现客户端绑定到具体的服务器端.http负载均衡
除了四层反向代理, 用的最多的是 七层反向代理. http { upstream backend { server weight=5; server ; server 192.0.0.1 backup; } server { location / { proxy_pass http://backend; } } }区别
四层反向代理是在 stream 的配置节里面 七层反向代理是在 http 的配置节里面 四层反向代理 可以指定 udp和tcp两种协议. 七层反向代理 可以指定 https等.http 的负载均衡算法
与四层负载均衡对应, 七层负载均衡也有很多算法. least_conn; ip_hash; hash $request_uri consistent; least_time header; (header,last_byte) 可以增加 weight=xxx 的比重,如果服务器配置不同,可以进行一定程度的区分.关于sitcky以及ip_hash
ip_hash 是 nginx 开源版就支持的负载均衡粘滞模式. 最大的区别是, 他是基于内核里面的ip地址进行计算来的. 具体算法是: 注意代码的位置为:src/http/modules/ngx_http_upstream_ip_hash_module.c 注意修改 : addrlen 的参数 从 3 修改为 4 就可以进行全部ipv4段的负载均衡. 但是需要注意如果是VPN 过来的IP电话, 或者是如下hash算法的处理的结果一致 依旧会路有到相同的后端服务器上面. for ( ;; ) { for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) { hash = (hash * 113 + iphp->addr[i]) % 6271; }关于sticky
最开始是一个组件, 需要编译时显示指定. 怀疑最近nginx plus 企业版将其纳入了使用范围. 开源版本的支持边的越来越有线. 1.22.x的版本还是支持的, 但是1.23.0就不在支持比较奇怪 具体的写法有如下几种: 注意如果比较简单 直接写 sticky;也可以. sticky cookie srv_id expires=1h domain=.example.com path=/; sticky route $route_cookie $route_uri; sticky learn create=$upstream_cookie_examplecookie lookup=$cookie_examplecookie zone=client_sessions:1m timeout=1h sync;关于负载均衡的性能
反向代理, 其实是 一方面做为服务端提供服务, 一方面作为客户端连接后端服务的过程. worker进程core绑定 对应网卡的中断绑定 作为服务端提供长连接服务 作为客户端提供对后端服务的长连接服务. 需要注意作为客户端时 必须保证 客户端的超时时间, 以及超时客户端的数量小于后端服务器. 但是也可以这样计算. 如果我方向代理 4个服务器, 设置长连接40个, 超时时间 60s 那么建议每个后端服务 至少也设置为40个以上的长连接, 60秒以上的超时时间. 避免如果负载不均衡是不会出现严重的问题.长连接参数配置
http { keepalive_timeout 6000; # 作为服务端的超时时间 keepalive_requests 10000; # 长连接的个数. 注意不能太大. upstream myapp{ ip_hash; keepalive 300; # 这是是联系反向代理服务器的设置. server 127.0.0.1:5200 ; server 127.0.0.1:5201 ; } server { listen 8080 default_server; server_name ""; location / { proxy_http_version 1.1; # 注意这个是必须的参数 # proxy_set_header Connection ""; # 注意 我加上这个参数. 登录就失败了, 建议不使用这个参数. } }注意内核参数的设置
1. TCP相关内核的参数: tw,port_range,somaxconn,tw_reuse 等核心参数. 2. TCP拥塞算法的选择. 是否启用tcp的聚合等处理. 3. 网卡软中断的绑核. 建议与nginx在同一个sockets,但是不在同一个core上面来提高吞吐量. 4. tcp 内存设置参数, 可以适当调大, 便于进行处理. 5. 如果延时敏感性, 可以关闭部分网卡的GSO,TSO 等参数,提高响应速度.不过会浪费一点带宽.