使用nginx的tcp负载解决exchange2016的客户端访问负载

本文介绍Nginx 1.9.0版本新增的Stream模块,该模块用于实现四层协议的转发、代理及负载均衡等功能。文章通过具体配置示例展示了如何使用Stream模块进行TCP和UDP负载均衡配置。

前言

nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。这完全就是抢HAproxy份额的节奏,鉴于nginx在7层负载均衡和web service上的成功,和nginx良好的框架,stream模块前景一片光明。

stream 模块编译

stream模块默认没有编译到nginx, 编译nginx时候 ./configure –with-stream 即可

官网:http://nginx.org/en/docs/stream/ngx_stream_core_module.html

用法

stream模块用法和http模块差不多,关键的是语法几乎一致。熟悉http模块配置语法的上手更快
以下是一个配置了tcp负载均衡和udp(dns)负载均衡的例子, 有 server,upstream块,而且还有server,
hash, listen, proxy_pass等指令,如果不看最外层的stream关键字,还以为是http模块呢。


修改配置文件:

vim /etc/nginx/nginx.conf

具体内容如下:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}
#负载exchange2016前端的模块配置
stream {
    upstream mail {
        least_conn;//连接数进行负载
        server 172.20.224.136:443 max_fails=2 fail_timeout=10s;//被动检查服务器响应
        server 172.20.224.57:443 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        443;
        proxy_pass    mail;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    upstream smtp {
        least_conn;
        server 172.20.224.136:25 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:25 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        25;
        proxy_pass    smtp;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    upstream pop {
        least_conn;
        server 172.20.224.136:110 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:110 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        110;
        proxy_pass    pop;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    upstream imap {
        least_conn;
        server 172.20.224.136:143 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:143 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        143;
        proxy_pass    imap;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    upstream pops {
        least_conn;
        server 172.20.224.136:995 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:995 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        995;
        proxy_pass    pops;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
        upstream imaps {
        least_conn;
        server 172.20.224.136:993 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:993 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        993;
        proxy_pass    imaps;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
    upstream smtps {
        least_conn;
        server 172.20.224.136:587 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:587 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        587;
        proxy_pass    smtps;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }
        upstream smtps1 {
        least_conn;
        server 172.20.224.136:465 max_fails=2 fail_timeout=10s;
        server 172.20.224.57:465 max_fails=2 fail_timeout=10s;
        }
    server {
        listen        465;
        proxy_pass    smtps1;
        proxy_timeout 3s;
        proxy_connect_timeout 1s;
    }

   }

配置使用wq推出保存,在使用命令 
cd /etc/nginx/nginx.d
nginx -s reload
重新加载服务之后就可以使用了

<think>我们正在配置Nginx作为MQ代理的请求转发。MQ(Message Queue)通常指的是消息队列服务,如RabbitMQ、ActiveMQ等。但请注意,Nginx本身并不是消息队列,而是可以作为反向代理将请求转发到消息队列的服务接口(例如RabbitMQ的HTTP API)或者转发到与消息队列交互的应用服务器(如Tomcat应用,该应用可能从消息队列中取数据)。 根据引用[1],Nginx作为反向代理,可以将请求按照一定的规则分发给后端的服务器。引用[2]和[3]提到了Nginx配置中如何设置反向代理,特别是引用[3]给出了一个配置示例,其中有一个`location`块用于将请求转发到后端服务。 然而,直接转发到MQ服务需要明确MQ服务提供的接口。以RabbitMQ为例,它提供了HTTP API(通常在15672端口,管理插件)或者AMQP协议(通常不通过HTTP,因此不能直接通过Nginx反向代理)。但如果我们使用RabbitMQ的HTTP API,则可以通过Nginx反向代理。 假设我们的需求是:将发送到Nginx的特定路径的请求转发到RabbitMQ的HTTP API服务(假设RabbitMQ管理插件已启用,监听在15672端口)。 配置示例: ```nginx server { listen 80; server_name your_domain.com; location /mq/ { # 注意:RabbitMQ的HTTP API路径通常是/api/,所以我们可能需要重写路径 rewrite ^/mq/(.*)$ /api/$1 break; # 设置代理头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发到RabbitMQ管理界面的HTTP API proxy_pass http://localhost:15672; # 注意:如果RabbitMQ服务在另一台机器,将localhost替换为对应的IP地址或域名 # 如果需要支持WebSocket(例如管理界面中的WebSocket),添加以下两行 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` 这个配置将把所有以`/mq/`开头的请求转发到本机15672端口(RabbitMQ管理插件)的`/api/`路径下。 但是,请注意: 1. 直接暴露RabbitMQ的HTTP API到公网可能存在安全风险,建议设置访问控制(如IP白名单、认证等)。 2. 如果只是需要代理AMQP协议(通常使用5672端口),则不能使用HTTP反向代理,因为AMQP不是HTTP协议。对于AMQP,可以考虑使用TCP代理(Nginx的stream模块)。例如: ```nginx # 在nginx.conf的http块外配置 stream { server { listen 5672; proxy_pass rabbitmq_server:5672; # 这里rabbitmq_server是RabbitMQ服务器的地址 } } ``` 这样,客户端就可以通过Nginx的5672端口连接到后端的RabbitMQ服务了。 根据你的实际需求(是HTTP API还是AMQP代理)选择合适的配置。 **相关问题** 1. 如何配置NginxTCP代理(用于非HTTP服务,如AMQP)? 2. 如何保护通过Nginx暴露的RabbitMQ管理界面? 3. Nginx反向代理配置中,`proxy_pass`和`rewrite`指令的使用注意事项?</think>### 配置Nginx转发请求到MQ服务 要配置Nginx作为MQ服务的请求代理,需根据MQ协议类型选择不同的配置方案。以下是两种常见场景的配置方法: #### 方案一:HTTP协议转发(适用于RabbitMQ HTTP API等) ```nginx http { upstream mq_api { server 192.168.1.100:15672; # RabbitMQ管理端口 keepalive 32; } server { listen 80; server_name mq-proxy.example.com; # 基础认证(建议启用) auth_basic "MQ API Access"; auth_basic_user_file /etc/nginx/.htpasswd; location / { proxy_pass http://mq_api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 重要:保持长连接 proxy_http_version 1.1; proxy_set_header Connection ""; } } } ``` *适用场景*:转发RabbitMQ管理API请求(15672端口)或HTTP-based MQ接口[^1][^3] #### 方案二:TCP协议转发(适用于AMQP/MQTT等) ```nginx # 需在nginx.conf主配置中增加 stream { upstream mq_amqp { server 192.168.1.100:5672; # AMQP默认端口 } server { listen 5672; proxy_pass mq_amqp; proxy_connect_timeout 5s; proxy_timeout 1h; # 保持长连接 } } ``` *适用场景*:转发原始AMQP协议(RabbitMQ)或MQTT协议(如EMQX)流量[^2] #### 关键配置说明 1. **协议选择**: - HTTP API:使用`http`模块配置 - 二进制协议:使用`stream`模块(需Nginx≥1.9.11) 2. **安全加固**: ```nginx # IP白名单 allow 10.0.0.0/8; deny all; # HTTPS加密(HTTP方案) ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; ``` 3. **负载均衡**: ```nginx upstream mq_cluster { server mq-node1:5672 weight=3; server mq-node2:5672; server mq-node3:5672 backup; # 备用节点 } ``` #### 验证步骤 1. 检查配置语法: ```bash nginx -t ``` 2. 测试转发: ```bash # HTTP测试 curl -u user:pass http://mq-proxy.example.com/api/queues # AMQP测试 amqp-publish -e exchange_name -r routing_key --url=amqp://mq-proxy.example.com ``` > **注意**:如果后端MQ服务有主动拉取机制(如引用[2]描述的监听空闲时处理MQ消息),需确保Nginx超时设置`proxy_timeout`大于MQ处理时间,避免连接中断[^2]。 --- ### 相关问题 1. **Nginx的`stream`模块和`http`模块在代理MQ时的主要区别是什么?** 2. **如何配置Nginx实现RabbitMQ集群的负载均衡?** 3. **当Nginx代理MQ服务时,常见的性能瓶颈有哪些?如何优化?** 4. **如何保护通过Nginx暴露的MQ服务接口免受未授权访问?** [^1]: Nginx采用单线程异步非阻塞处理请求,节省资源并支持高并发 [^2]: Tomcat对MQ的监听机制可能导致Nginx未转发请求时仍能处理消息 [^3]: Nginx配置可通过`location`块实现多项目路由和API转发 [^4]: Nginx安装依赖zlib/pcre/openssl等基础库
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值