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: 4 · Posted: 2026-10-26
———         Thanks for Reading         ———
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...