AWS EC2 Nginx 转发 TCP 流量

AWS Nginx TCP/IP About 1,612 words

步骤

查看是否安装stream模块,使用nginx -V命令。

nginx -V里是--with-stream=dynamic,说明 stream 模块被编译成了动态模块,没有内置进Nginx主程序。动态模块必须在nginx.conf里用load_module手动加载,否则Nginx不认识stream这个指令。

ls /usr/lib64/nginx/modules/ | grep stream

安装stream模块。

dnf install -y nginx-mod-stream

在 nginx.conf 最顶部加载模块。

load_module必须写在main上下文,也就是文件最前面,要在 events {} 和 http {} 之前,不能写进任何 {} 里面。

load_module /usr/lib64/nginx/modules/ngx_stream_module.so;

检查并重载。

nginx -t && systemctl reload nginx

配置

# 放在 nginx.conf 顶层,与 http {} 并列
stream {
    # 用 AWS VPC 自带 DNS;nginx 不在 AWS 内就换成公司 DNS,并确认能访问这个 NLB
    resolver 169.254.169.253 valid=30s ipv6=off;

    # NLB 域名:RIS 现在连 nginx 的哪个端口,listen 就写哪个端口
    map "" $simonnow_mllp_uat {
        default simonnow-uat-mllp-xxxxxxxx.elb.us-east-1.amazonaws.com:2575;
    }

    log_format mllp '$remote_addr [$time_local] $status '
                    'in=$bytes_received out=$bytes_sent t=${session_time}s up=$upstream_addr';

    server {
        listen 2575;                              # 保持与 RIS 当前配置一致
        access_log /var/log/nginx/mllp_access.log mllp;
        error_log  /var/log/nginx/mllp_error.log warn;

        proxy_pass            $simonnow_mllp_uat;
        proxy_connect_timeout 5s;
        proxy_timeout         300s;               # 空闲超时,要小于 NLB 的 350s,见下面第 3 点
        proxy_socket_keepalive on;
    }
}

注意

  • 域名要写成变量加map。Nginx写死域名时只在启动时解析一次,之后一直用旧IP,NLB的IP变了就会连不上。 用变量加resolver才会运行时解析,stream里没有set时,用map "" $var { default host:port; }这个写法。
  • AWS NLB的空闲超时默认是350秒。 超时后它会静默丢弃连接,之后有数据才回RST。 如果Nginx的proxy_timeout比它长,Nginx以为连接还在,RIS下一条消息就会撞上断开的连接。把Nginx设成300秒,空闲时由Nginx主动关闭,RIS会重连。NLB的TCP空闲时间也可以在60到6000秒之间调整。
Views: 7 · Posted: 2026-10-26

———         Thanks for Reading         ———

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓
Prev Post
Today In History
Browsing Refresh