nginx 在 1.9.0 的版本开始才支持四层协议的转发, 代理和负载均衡等, 在此之前都会使用 LVS 或者是 Haproxy 来实现; 现在 nginx 出了 stream 的模块; 那么可以基于这个模块来实现
Nginx 的 stream 模块, 不会自带安转, 需要在编译 nginx 的时候手动的添加这个模块;
我们来看看一个案例:
由于之前使用 Ningx + Keepalived(主从模式) 做了 7 层负载均衡, 但是之前编译 nginx 的时候, 并没有添加 stream 这个模块; 所有需要后续手动添加; 由于 nginx 上已经存在业务在跑了, 那么可以选择平滑添加 stream 模块, 并不会对线上业务造成影响;
1. 先在 LB 的 slave 从机上进行平滑添加; 然后再将 vip 切换到从机上, 随即在 master 进行平滑的添加模块
2. 平滑添加介绍重新 configure 编译的时候添加上 --with-stream; 然后 make 编译
3. 千万注意的是: make 之后, 不要 make install; 否则会覆盖之前的配置
- 检查 nginx 是否有安转 stream 模块; 如果安装失败; 那么就需要回滚配置, 在此之前需要保存nginx 的相关的配置 cp /etc/nginx /mnt/nginx.bak
- cd nginx-1.12.2;
*./configure --prefix=/data/nginx --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream;
- make;
stream 模块的语法和 http 的模块配置差不多, 语法几乎一致;
{
stream {
upstream kk5 {
server 10.0.58.2:5000;
server 10.0.58.3:5001;
}
upstream kk5http {
server 10.0.58.2:8000;
server 10.0.58.3:8001;
}
server {
listen 5000;
proxy_connect_timeout 1s;
proxy_pass kk5;
}
server {
listen 8000;
proxy_connect_timeout 1s;
proxy_pass kk5http
}
}
}
# .... 后面就是正常的配置了
总结一下 Nginx 的四大模块: proxy, headers, upstream, stream
ngx_http_proxy_module 模块:
-
proxy_pass URL;
Context: location, if in location, limit_except
server { server_name HOSTNAME; location /uri/ { proxy http://host[:port] } } # http://HOSTNAME/uri >> http://host/uri # proxy_pass 后面的路径是一个 uri 时, 其会将 location uuri 替换为 proxy_pass 的 uri server { server_name HOSTNAME; location /uri/ { proxy http://host/new_uri/; } } # http://HOSTNAME/uri/ => http://host/new_uri # 如果 location 定义其 uri 为正则表达式, 那么 proxy_pass 后面必须不能使用 uri, 用户请求时传递的uuri 将直接附加到代理服务器之后 server { server_name HOSTNAME; location ~|~* /uri/ { proxy http://host; } } # http://HOSTNAME/uri/ -> http://host/uri/
-
proxy_set_header field value; 设定发往后端主机的请求报文的请求首部的值
Context: http, server, location
proxy_set_header X-Real-IP proxy_add_x_forwarded_for(源ip);
-
ngx_http_headers_module 模块, 向由代理服务器响应给客户端响应报文添加自定义首部, 或者修改指定首部的值;
- add_header name value; 添加自定义首部
ngx_http_upstream_module 模块
- upstream name {...}, 配置多个后台服务的负载均衡
Context: http
ngx_stream_core_module(实现 nginx 的 TCP 的负载均衡)
- 配置 nginx 编译文件参数
./configure --with-http_stub_status_module --with-stream
编译, 安转, make && make install
配置 nginx.conf
stream {
upstream test {
server ${ip1:port1};
server ${ip2:port2};
}
server {
listen ${port1};
proxy_timeout: 20s;
proxy_pass test
}
}
负载均衡方式: rr, ip_hash, url_hash, fail
rr: 按时间顺序逐一分配到不同的后端服务器, 如果操过最大失败次数后(max_fails 默认 1), 在失效时间内(fail_timeout, 默认 90s), 该节点失效权重变为 0; 操过失效时间后, 则恢复正常, 或者全部节点都为 down, 那么将所有的节点都恢复为有效, 一般来说 rr 能解决权重分配均匀
ip_hash: 根据客户端连接的 ip 地址来分发请求, 保证某个客户端有很大概率总能连接到一个台服务器上, 无法将权重 与 ip_hash 联合起来使用, 如果有某个服务器不可以使用, 必须标记为 down, 不建议使用
Fail(第三方): 根据后端服务器的响应时间来分配请求, 响应时间短的优先,
url_hash: 和 ip_hash 类似,