前面章节主要讲述Nginx对http协议的支持,这也是Nginx使用最广泛的功能。本节补充讲述Nginx对Stream协议和Mail协议的支持。

Stream支持

        Nginx对传输层协议TCP和UDP提供代理和负载均衡支持,同时具备健康检查、动态配置等能力。

 TCP负载均衡

针对传输层tcp协议的数据包进行代理和负载均衡。 配置代码:

# stream表示针对tcp协议配置,同http同等为止

stream {

upstream mysql_read {

#lb_mode:负载均衡方式,默认是轮询。具体见后面对应章节

[lb_mode]

#server参数同http模块

server read1.example.com:3306 weight=3;

server read2.example.com:3306;

server 192.168.10.10:3306 backup;

}

server {

listen 3306;

proxy_pass mysql_read;

}

}

这个示例是用nginx做mysql读数据库的负载均衡。 注意:如果采用目录下定义配置文件,不能在conf.d目录下建文件(这个是默认用于http协议的),应该另行创建名为 stream.conf.d 的文件夹具体配置如下: 1、在 /etc/nginx/nginx.conf 配置文件中:

stream {

include /etc/nginx/stream.conf.d/*.conf;

}

2、建 /etc/nginx/stream.conf.d/mysql_read.conf 的文件,包含以下配置:

upstream mysql_read {

#lb_mode:负载均衡方式,默认是轮询。具体见后面对应章节

[lb_mode]

#server参数同http模块

server read1.example.com:3306 weight=3;

server read2.example.com:3306;

server 192.168.10.10:3306 backup;

}

server {

listen 3306;

proxy_pass mysql_read;

}

udp负载均衡

针对传输层udp协议的数据包进行代理和负载均衡。 配置如下:

stream {

upstream lb_udp {

#lb_mode:负载均衡方式,默认是轮询。具体见后面对应章节

[lb_mode]

#server参数同http模块

server udp1.example.com:123 weight=3;

server udp2.example.com:123;

server 192.168.10.10:123 backup;

}

server {

# 必须加"udp"选项,否则就是默认"tcp"协议

listen 123 udp;

proxy_pass lb_udp;

}

}

UDP负载均衡与TCP负载均衡类似,在stream模块中以同样的方式完成大部分配置。

健康检查

TCP健康检查

        NGINX和NGINX Plus可以不断测试TCP上游服务器,避免出现故障的服务器,并将恢复的服务器优雅地添加到负载平衡组中。健康检查有主动和被动两种模式。

1、被动健康检查

被动健康检查原理就是Nginx在服务器对正常请求回复错误或超时时,停止向其发送TCP数据报一段时间。

upstream stream_backend {

# slow_start慢启动,在Nginx plus中支持

server backend1.example.com:12345 weight=5 slow_start=30s;

# 被动检查参数

# max_fails–NGINX在指定时间内认为服务器不可用的失败尝试次数。

# fail_timeout–指定次数的连接尝试必须失败才能认为服务器不可用的时间。此外,NGINX在标记服务器不可用后,停止服务器不可用时间量,之后再尝试是否可用。如果连接尝试在10秒内超时或至少失败一次,NGINX会将服务器标记为10秒内不可用。

server backend2.example.com:12345 max_fails=2 fail_timeout=30s;

server backend3.example.com:12346 max_conns=3;

}

2、主动健康检查

主动健康检查就是Nginx主动发起检查服务器状态请求,根据结果判定是否可用。

stream {

server {

listen 12345;

proxy_pass stream_backend;

# 主动健康检查

# port=number:可指定连接到服务器执行运行状况检查时使用的专有端口。默认情况下,等于服务器端口。

# interval=time:设置两次连续运行状况检查之间的间隔,默认为5秒。

# passes=number:设置特定服务器连续通过健康检查的次数,之后服务器将被视为健康,默认为1。

# fails=number:设置特定服务器连续失败的运行状况检查次数,在此之后该服务器将被视为不正常,默认为1。

health_check port=12346 interval=10 passes=2 fails=3;

health_check_timeout 5s;

}

}

指令格式:health_check [parameters];

UDP健康检查

       Nginx对UDP健康检查也分主动和被动模式。

1、被动健康检查

被动健康检查原理就是Nginx在服务器对正常请求回复错误或超时时,停止向其发送UDP数据报一段时间。

upstream dns_upstream {

# 被动检查参数

# max_fails–NGINX在指定时间内认为服务器不可用的失败尝试次数。

# fail_timeout–指定次数的连接尝试必须失败才能认为服务器不可用的时间。此外,NGINX在标记服务器不可用后,停止服务器不可用时间量,之后再尝试是否可用。如果连接尝试在10秒内超时或至少失败一次,NGINX会将服务器标记为10秒内不可用。

server 192.168.136.130:53 max_fails=2 fail_timeout=30s;

server 192.168.136.131:53 max_fails=2 fail_timeout=30s;

}

2、主动健康检查

主动健康检查就是Nginx主动发起检查服务器状态请求,根据结果判定是否可用。

server {

listen 53 udp;

proxy_pass dns_upstream;

# udp 表示是对UDP健康检查

# interval=time:设置两次连续运行状况检查之间的间隔,默认为5秒。

# passes=number:设置特定服务器连续通过健康检查的次数,之后服务器将被视为健康,默认为1。

# fails=number:设置特定服务器连续失败的运行状况检查次数,在此之后该服务器将被视为不正常,默认为1。

health_check interval=20 passes=2 fails=2;

}

动态配置服务器

        Nginx对Stream服务器具备动态配置能力,操作基本同http协议的动态配置能力。

stream {

# 配置stream服务器组

upstream streamservers{

zone streamservers 64k;

server appserv1.example.com:12345 weight=5;

server appserv2.example.com:12345 fail_timeout=5s;

server backup1.example.com:12345 backup;

}

server {

# 代理到服务器

proxy_pass streamservers;

...

}

}

http {

# 在http中配置动态配置服务器能力

server {

# Location for API requests

location /api {

limit_except GET {

auth_basic "NGINX Plus API";

auth_basic_user_file conf.d/user.pwd;

}

api write=on;

allow 127.0.0.1;

deny all;

}

}

}

更新命令如下:

# 查看服务器组当前状态--GET

curl 'http://127.0.0.1/api/6/stream/upstreams/streamservers'

# 增加服务器

curl -X POST -d '{ \

"id":0,

"server": "10.0.0.1:8089", \

"weight": 4 \

}' -s 'http://127.0.0.1/api/6/stream/upstreams/streamservers/servers'

# 删除服务器

curl -X DELETE -s 'http://127.0.0.1/api/6/stream/upstreams/streamservers/servers/0'

# 当会话状态被存储到本地服务器时,要从组中下线或删除服务器,必须要先清空连接和持久会话,即让服务器会话在本地失效。这样可防止系统出现大的抖动

curl -X PATCH -d '{"drain":true}' 'http://127.0.0.1/api/6/stream/upstreams/streamservers/servers/0'

#服务器下线

curl -X PATCH -d '{ "down": true }' -s 'http://127.0.0.1/api/6/stream/upstreams/streamservers/servers/0'

其中url格式:http://address/api/{version}/stream/upstreams/{StreamUpstreamName}/servers/[id]

说明从前到后内容:

1、address:处理请求的节点的主机名或IP地址(127.0.0.1)

2、api定位(匹配配置中的”location /api“)

3、{version}:api版本(用9)

4、stream/upstreams/{StreamUpstreamName}/servers/[id]:服务器组的名称定位,黑色部分是固定的。{StreamUpstreamName}就是服务器组名。[id]是服务器id,新增不需要。

Mail协议支持

        NGINX可以将IMAP、POP3和SMTP协议代理到邮件服务器。能带来如下好处:

轻松扩展邮件服务器的数量根据不同的规则选择邮件服务器,例如,根据客户端的IP地址选择最近的服务器在邮件服务器之间分配负载

配置示例

mail {

# 邮件服务器:可以是域名或ip地址,多个用" "隔开

server_name mail.example.com;

#使用auth_http指令指定HTTP身份验证服务器。身份验证服务器将对电子邮件客户端进行身份验证,选择用于电子邮件处理的邮件服务器,并报告错误

auth_http localhost:9000/cgi-bin/nginxauth.cgi;

# 指定proxy_pass_error_message从身份验证服务器向用户通知错误。适合于邮箱内存不足情况

proxy_pass_error_message on;

# ssl/tls方式访问邮件(配置方式同http协议)

ssl on;

ssl_certificate /etc/ssl/certs/server.crt;

ssl_certificate_key /etc/ssl/certs/server.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

# 处理有邮件发送协议

server {

listen 25;

protocol smtp; # 默认端口25, 587, 465

# 授权方式

smtp_auth login plain cram-md5;

}

# 邮件读取协议

server {

listen 110;

protocol pop3; # 默认端口 110, 995

# 授权方式

pop3_auth plain apop cram-md5;

}

# 邮件报文存取协议(用于远程管理邮件)

server {

listen 143; # 默认端口 143, 993

protocol imap;

}

}

身份验证

        auth_http指令用于与身份验证服务器进行通信,验证身份;验证链接支持的正常验证请求和响应,按不同的验证方法分别做示例。

plain方式

请求:

GET /auth HTTP/1.0

Host: localhost

Auth-Method: plain # plain/apop/cram-md5/external

Auth-User: user

Auth-Pass: password

Auth-Protocol: imap # imap/pop3/smtp

Auth-Login-Attempt: 1

Client-IP: 192.0.2.42

Client-Host: client.example.org

验证通过响应:

HTTP/1.0 200 OK

Auth-Status: OK

Auth-Server: 198.51.100.1

Auth-Port: 143

验证失败响应: 

HTTP/1.0 200 OK

Auth-Status: Invalid login or password

Auth-Wait: 3

APOP / CRAM-MD5方式

请求:

GET /auth HTTP/1.0

Host: localhost

Auth-Method: apop

Auth-User: user

Auth-Salt: <238188073.1163692009@mail.example.com>

Auth-Pass: auth_response

Auth-Protocol: imap

Auth-Login-Attempt: 1

Client-IP: 192.0.2.42

Client-Host: client.example.org

Good response:

验证通过响应:

HTTP/1.0 200 OK

Auth-Status: OK

Auth-Server: 198.51.100.1

Auth-Port: 143

Auth-Pass: plain-text-pass

这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: